Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Muy wenas!
Os queria preguntar si algun@ ha intentado controlar un servo directamente cn un PIC, me imagino k si.. Pues eso es lo k stoy intentando hacer, y digo intentando porque hacerlo no lo hago jaj. He leido ya bastante sobre el control de estos, la frecuencia...el duty cicle... pero nada.Mi intención es k pulsando un pulsador, mueva el servo en un sentido, y pulsando otro lo mueva en el sentido contrario. Os voy a poner la rutina que estoy usando, si le pudierais echar un vistacin x si vierais algo raro... 😕 #include "D:daniDANIROBOTSMis programasC servocservo.h"
#int_RTCC
RTCC_isr()
{
i++;
if (i ==20) //Define el periodo a 20 ms (cada ms salta a la función RTCC)
{
i = 0;
}
if (i < FactS ) //Define el "duty cicle"
{
output_bit (PIN_A0,1);
}
else
{
output_bit (PIN_A0,0);
}
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
FactS = 1.5;
output_bit (PIN_B7,1);
for (;;)
{
while (PULSADORES() == 0)
{
output_bit (PIN_C7,1); // Led parpadeando
delay_ms (100);
output_bit (PIN_C7,0);
delay_ms (100);
}
switch (PULSADORES()) //Lectura de los 2 pulsadores
{
break;
case 1: //
output_bit (PIN_C0,1);
FactS = FactS + 0.1; //Incrementa en 0.1 ms el duty cicle
delay_ms (200);
output_bit (PIN_C0,0);
break;
case 2:
output_bit (PIN_C1,1);
FactS = FactS - 0.1; //Decrementa en 0.1 ms el duty cicle
delay_ms (200);
output_bit (PIN_C1,0);
break;
}
}
}
Pues ese es..en la funcion RTCC es donde "defino" los 20 ms de periodo de los pulsos, y con FactS varío el tiempo que permanece en alto la salida que controla el servo.
Un saludo y gracias xik@s!
ahora no puedo decirte mucho pq estoy en clase, pero:
-Has probado que realmente el RTCC haga 20ms? Es muy probable que no.
-Donde defines FactS? definelo como Float para que funcione el 0.1, si no el te lo pone como int, de modo que nunca va a darte el valr deseado. luego le echo un ojo con mas tranquilidad.
Hola qkiyo
He visto un error que hace que eso no te funcione: Si la interrupción se ejecuta cada milisegundo no puedes pretender controlar la señal con valores de 1,5; 1,6, ...... ms puesto que solo tienes el control cada 1 ms. Es decir, así solo puedes tener un ancho de pulso de 1 ms, 2 ms, 3 ms .....
Otra sugerencia es que en lugar de utilizar variables de tipo float, utilices de tipo char (siempre que puedas). Te evitarás muchos problemas
Puedes solucionarlo programando el temporizador cada 100 us por ejemplo (y cambiando los valores de algunas variables)
Espero que te sirva
Un saludo
Ola xikos!
Perdonad x tardar tanto en responder...pro e estado un poko liado y me e ausentado un poko del foro..
- En cuanto a lo que me dijo Mif:
No he probado que realmente esté generando una señal de 20 ms,en teoría si...en la practica... Lo de la variable FactS como "float" ya lo hice 😀 ,asik tmpk debería tener problemas cn eso.
- Y en cuanto a lo que me dijo Avlober:
Creo que tienes razón, klaro la resolución que he creado es de 1ms, asik no podré controlar fracciones... Modificaré la resolución del TIMER y os cuento 😉
Gracias y un saludo!
Estabas en lo cierto Avlober. Ahora la resolución del timer la he puesto a 1, asik ahora tengo el control cada 256 us (con un cristal de 4Mhz). Es un poco pobre el control...cambiando el cristal y jugando un poco cn los valores supongo que se obtiene un buen control del servo.
Salu2! y graciaas