fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Como programar PWM eficientemente

9 Respuestas
3 Usuarios
0 Reactions
7,077 Visitas
rabelo_jorge
Respuestas: 7
Topic starter
(@rabelo_jorge)
Active Member
Registrado: hace 11 años

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.

Responder
8 respuestas
rabelo_jorge
Respuestas: 7
Topic starter
(@rabelo_jorge)
Active Member
Registrado: hace 11 años

.

Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 17 años

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.

Responder
rabelo_jorge
Respuestas: 7
Topic starter
(@rabelo_jorge)
Active Member
Registrado: hace 11 años

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.

Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 17 años

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.

Responder
Página 1 / 2
Compartir: