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
6,991 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

Estoy masticando mis opciones, y no estoy usando servomotores, son unos reductores, creo que para la próxima revisión utilizare un 18F o algo así pero por el momento quiero aprovechar lo que ya diseñé, los motores los probé con un generador de señales y le fui variando la frecuencia del PWM, a partir de 100 Hz el motor empieza a hacer un chillido, y al rededor de 50 Hz no hace ruido alguno, por lo que decidí usarlos a esa frecuencia, con el timer generé un PWM de mas de 1 kHz y el chillido era mas fuerte, en otras palabras la frecuencia la seleccioné de manera empírica.

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

Sí, es normal, el pwm a frecuencias audibles "se oye". Súbelo a 10 kHz o más y verás que ya empiezas a dejar de escucharlo. PWM muy altos tampoco interesan, pues hay pérdidas a mayor frecuencia, pero 10, 15, 20, 30 kHz es algo muy normal y, dependiendo de lo fino que tengas tu oido, ya no lo escucharás.
Además, 50 Hz o 20 ms, para controlar un velocista es algo lento, demasiado si quieres que vaya rápido.

Responder
heli
Respuestas: 748
 Heli
(@heli)
Ardero
Registrado: hace 19 años

El ruido lo hacen todos los motores con PWM. Se comportan como un altavoz y vibran a la frecuencia de conmutación. Los de menos calidad son mucho mas ruidosos que los de alta calidad. Depende de la rigidez mecánica y de la precisión de los rodamientos o cojinetes.
Con frecuencias tan bajas como 50hz tendrás unos tiempos de respuesta muy lentos y tirones a baja velocidad.
Cuato mas alta la frecuencia mejor por tiempos de respuesta y suavidad, pero entonces las pérdidas de conmutación son también mayores y hay que usar drivers mosfet de altas restaciones. (me refiero a cientos de Khz).
También hay que tener en cuenta la impedancia del motor y de sus cables a la frecuencia seleccionada. Los cables en montajes de aficionado son despreciables (no como en montajes industriales) pero el motor si que puede tener una impedancia alta para determinadas frecuencias y que baje el rendimiento.
Usa mejor una frecuencia alrededor de los 3Khz, al menos algo mas de 1Khz. Yo he usado 4,8Khz con el L293D (que solo soporta hasta 5Khz) y motores Mabuchi RF-300 (similares a los Mitsumi M25E o Minebea MDN3) sin problemas.
Para hacerlo por software, sin los CCP, eso tendrás que programar el TIMER0 dividido por 4:
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // Cristal de 20Mhz, interrupción cada 0.2048ms 204.8us 4882,8hz
// // Time = ((256 * 4) / 20.000.000) * 4 = 0.2048ms 204.8us

O para sobrecargar menos el micro puedes usar 2,4Khz:
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8); // Cristal de 20Mhz, interrupción cada 0.4096ms 409.6us 2441,4hz
// // Time = ((256 * 4) / 20.000.000) * 8 = 0.4096ms 409.6us

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

Que tal, he seguido experimentando con mi robot, muchas gracias por el tiempo, sobre los motores sigo con curiosidad al respecto, por lo que he abierto un nuevo hilo por si se puede profundizar mas al respecto y que la información no se pierda en el post sobre PWM. Saludos 🙂

http://foro.webdearde.com/viewtopic.php?f=22&t=4067 " onclick="window.open(this.href);return false;

Responder
Página 2 / 2
Compartir: