Como cambiar la frecuencia de un PWM en Arduino


Hoy vamos a ver cómo cambiar la frecuencia de un pin de salida analógico en Arduino, para lo cuál nos va a tocar configurar los registros que controlan los Timers asociados a los pin PWM. Pero tranquilos, que vamos a dejarlo fácil en una única función.

El empleo de timers es algo normal en procesadores. Sin embargo, frecuentemente nos habréis visto recomendar evitar su manipulación en Arduino dado que puede tener efectos inesperados, sobre todo en librerías de terceros. Entonces, si normalmente recomendamos evitar manipualar los Timers en Arduino ¿Para qué querremos modificar ahora su frecuencia? Pues, básicamente, porque esto permite mejorar el comportamiento de ciertos dispositivos cuando son controlados por una señal PWM.

Recordemos que al controlar un dispositivo mediante una señal PWM, realmente estamos encendiendo y apagando el dispositivo por completo múltiples veces por segundo. Eso no es lo mismo que aplicar una auténtica señal analógica y, como normal general, a muchos actuadores el control con PWM les sienta fatal.

Aumentar la frecuencia del PWM puede mejorar el funcionamiento de ciertos dispositivos, porque tienen menos tiempo para "darse cuenta" de que lo hemos apagado. Si la inercia del dispositivo es suficiente, y su frecuencia natural superior a la del PWM, el comportamiento será (casi) idéntico al alimentar con una tensión analógica.

Anuncio:

El caso práctico más frecuente lo tenemos al controlar la velocidad de un motor, que al controlar con un PWM apagamos y encendemos el motor múltiples veces por segundo. El motor es una carga inductiva, y cada encendido supone un hermoso picos de arranque. Así lleva a la situación de que al aplicar una reducción de la velocidad, el motor consume más, se calienta más, hace más ruido... cuando, a priori, podríamos pensar que debería ser al revés porque está funcionado a menos velocidad.

Eso tampoco significa que podamos subir la frecuencia de forma indefinida como locos. No todos los drivers que estemos empleando van a soportar la frecuencia y si no la soportan... ¡cataplum!. Hay que mirar cada caso en particular pero, en general, subir la frecuencia del control PWM 4-10 Khz, resulta bastante razonable.

Así que aquí tenéis un chuletario con la frecuencia, prescalers, valores por defecto y consecuencias de cada uno de los pines PWM para procesadores Atmega328p y Atmega 32u2, así como una función para modificarlo de forma sencilla.

Atmega 328p (Arduino Uno, Nano)

Frecuencia

PinsTimerFrecuencia
5, 6Timer062500 Hz
9, 10Timer131250 Hz
3, 11Timer231250 Hz

Valores por defecto

PinsTimerPrescalersFrecuencia
5, 6Timer064977Hz
9, 10Timer164490Hz
3, 11Timer364490Hz

Prescalers

PinsTimerPrescalers
5, 6Timer01 8 64 256 1024
9, 10Timer11 8 64 256 1024
3, 11Timer21 8 32 64 128 256 1024

Consecuencias y efectos

PinsTimerEfecto
5, 6Timer0delay() y millis()
9, 10Timer1Librería servo
3, 11Timer2

Código

Atmega 32U (Micro y Leonardo)

Frecuencias

PinsTimerFrecuencia
3, 11Timer064500Hz
9, 10Timer131250Hz
5Timer331250Hz
6, 13Timer431250Hz

Valores por defecto

PinsTimerPrescalersFrecuencia
3, 11Timer064977Hz
9, 10Timer164490Hz
5Timer364490Hz
6, 13Timer464490Hz

Prescalers

PinsTimerPrescalers
3, 11Timer01 8 64 256 1024
9, 10Timer11 8 64 256 1024
5Timer31 8 64 256 1024
6, 13Timer41 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384

Consecuencias

PinsTimerEfecto
3, 11Timer0delay() y millis()
9, 10Timer1
5Timer3
6, 13Timer4

Código

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
tutoriales de Arduino

Anuncio:

Previous Cómo funciona el extrusor de una impresora 3D FFF
Next Interactua con el API de SmartLife desde .NET con SmartLifeNET
1000