Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenas tardes amigos del foro, estoy haciendo un pequeño programa con un PIC16F887 en C con el compilador Hitech, quiero implementar dos PWM a aproximadamente 50 Hz y variar su ciclo de trabajo, las únicas salidas disponibles que tengo se encuentran en el puerto B.
¿Cuál es la mejor forma de realizar esto?
Por el momento estoy haciendo el PWM únicamente con el timer1 y hasta ahorita no he tenido problemas, solo estoy controlando un solo motor pero no se si será un código eficiente una vez que agregue el código para controlar dos motores al mismo tiempo ya que planeo hacerlo con un solo timer.
Si alguien tiene información sería de gran ayuda, el código lo estoy implementando para un robot diferencial y no planeo usar los puertos CCP (aunque tengo entendido que los CCP no llegan a frecuencias tan bajas).
El código que tengo es el siguiente:void interrupt timer1_int(void)
{int r;
if (TMR1IF) // Timer1 interrupt
{
switch (estado)
{
case (1):
RB2=1;
TMR1L=retardo1;
r = (retardo1>>8);
TMR1H=r;
estado=2;
break;
case (2):
RB2=0;
TMR1L=retardo2;
r = (retardo2>>8);
TMR1H=r;
estado=1;
break;
}
TMR1IF = 0; //Limpiar la interrupción
return;
}
}
void calcular_retardos (unsigned int porcentaje ){
unsigned int registro,resta;static unsigned int multiplicador=125;
registro=porcentaje * multiplicador;
retardo1=65536- registro;
resta=12500-registro;
retardo2=65536-resta;
return;
}
Saludos y gracias de antemano.
.
Lo más eficiente es usar los PWM por hardware que tiene el micro. Mirate el datasheet de tu modelo, creo que tienes disponibles RB1, RB2 y RB4. Como no he usado nunca el compilador de Hitech, no se decirte como, pero puede que lleve alguna libreria para configurar fácilmente el pwm. Y sino directamente a los registros y listo. Recuerda desactivar los pines analogicos antes.
De hecho este pic los tiene en los puertos RC1 y RC2, por lo que en mi caso no es una opción. Gracias por la respuesta.
Sí, tienes razón, en ese modelo (hace años que no lo usaba) el pwm está en pines diferentes. Lo más fácil sería que pudieses usar el CCP, que para eso está precisamente, y no pierdas el tiempo haciendo cálculos para sacar una frecuencia, que te puede hacer automáticamente el CCP. Pero es lo malo de los micros de 8 bits, para según que cosas, se quedan cortos. Con 16 y 32 no te pasa, tienes un rango muy amplio. El 16F887 en el Timer 2 solo tiene pre-escaler hasta 16, pero he visto otros modelos de 16F que tienen hasta 64, no se si con esto ya llegarías a los 20 ms o aun no. Lástima que no puedas utilizar el post-escaler para el pwm, entonces llegaría seguro.
Por cierto, 50Hz, ¿usas servos como motores? Si quieres hacer un velocista que vaya a 1 m/s o más con servos como motores no te va a dar para mucho. Mejor utilizar motores normales y entonces ya no tendrías el problema de conseguir una frecuencia tan baja y sí que podrías usar el CCP.