La Regulación por Ancho de Pulso de un motor de CC está basada en el hecho de que si se recorta la CC de alimentación en forma de una onda cuadrada, la energía que recibe el motor disminuirá de manera proporcional a la relación entre la parte alta (habilita corriente) y baja (cero corriente) del ciclo de la onda cuadrada. Controlando esta relación se logra variar la velocidad del motor de una manera bastante aceptable.
El circuito que se ve a continuación es un ejemplo de un control de Regulación de Ancho de Pulso (PWM, Pulse-Width-Modulated en inglés), que se podría adaptar al circuito de un Puente H (Puente H: Circuito para controlar motores de corriente continua. El nombre se refiere a la posición en que quedan los transistores en el diagrama del circuito).
El primer circuito —con el MOSFET de potencia BUZ11— permite controlar motores medianos y grandes, hasta 10 A de corriente. El segundo circuito —con el transistor 2N2222A— es para motores pequeños, que produzcan una carga de hasta 800 mA.
El que sigue es un circuito genérico de generación de pulsos que se puede utilizar en aquellos lugares donde sea necesario un pulso digital no demasiado preciso. Cambiando los valores de R1 y R2 se ajusta la frecuencia básica. El potenciómetro regula el ancho de pulso.
A continuación, el circuito básico y la fórmula para calcular los anchos de pulso generados por el integrado 555.
Completando la información básica, debemos saber que la mayoría de los microcontroladores poseen generadores de ancho de pulso modulado para control de velocidad de motores y otros controles de potencia digitales, como el brillo de un led o de una lámpara. En las salidas digitales del Arduino UNO se identifica la capacidad PWM con un símbolo ~. En el Arduino UNO los pines 3, 5, 6, 9, 10 y 11 tienen capacidad de salida de pulsos digitales con ancho modulado:
En estos módulos PWM de los microcontroladores, la proporción de tiempo que está encendida la señal respecto al total del ciclo se denomina “Duty cycle”, y generalmente se expresa en tanto por ciento.
La señal promedio es el producto de la tensión máxima y el valor Duty Cycle. La expresión para el cálculo es:
De forma similar, tenemos que
La «salidas analógicas» NO lo son
Debemos tener presente que en una salida PWM el valor de tensión en realidad es Vcc. Por ejemplo, si estamos alimentando un dispositivo que requiere 3V, y usamos una señal pulsada, en realidad estaremos suministrando 5V durante un 60% del tiempo y 0V durante el 40%. Pero si el dispositivo tiene alguna característica por la cual soporta como máximo 3V, podemos dañarlo si lo alimentamos mediante una señal PWM de estas características.
La señal pulsada es buena para emular una señal analógica en muchas aplicaciones. Podemos, por ejemplo, variar la intensidad luminosa en un LED. Éste realmente se enciende y apaga varias veces por segundo, pero el parpadeo es tan rápido que el ojo no lo aprecia. El efecto percibido es que el LED brilla con menor intensidad.
Otro ejemplo es que al variar la velocidad de un motor DC con un PWM, en la mayoría de los casos la inercia del motor se encargará de que el efecto de los cortes de señal sean despreciables. No obstante, dependiendo de la frecuencia utilizada, podemos notar vibraciones o ruidos, lo que implica que deberemos variar la frecuencia del ciclo PWM.
También es importante tener en cuenta aquellos efectos que la rápida conexión y desconexión de la señal pulsada pueden producir en el dispositivo que se alimenta. En el caso de cargas inductivas (motores, relés, o electroimanes), la desconexión producirá una generación de contracorriente que puede dañar la salida digital, o al dispositivo, por lo que será necesario implementar una protección.
Control de ancho de pulso en Arduino
■ En Arduino Uno, Mini y Nano existen 6 salidas PWM de 8 bits en los pines 3, 5, 6, 9, 10 y 11.
■ En Arduino Mega existen 15 salidas PWM de 8 bits en los pines 2 a 13 y 44 a 46
■ En Arduino Due existen 13 salidas PWM de 8 bits en los pins 2 a 13. Adicionalmente, esta placa incorpora dos salidas analógicas con resolución de 12 bits (4096 niveles)
Una resolución de 8 bits en una salida PWM significa que tiene 256 niveles. Es decir, el Duty cycle se divide en 256 posiciones posibles.
Timers en Arduino
Las funciones PWM que son controladas por hardware emplean los módulos Timer para generar la onda de salida. Cada Timer queda afectado a 2 o 3 salidas PWM.
Cada salida conectada a un mismo temporizador comparte la misma frecuencia, aunque pueden tener distintos Duty cycles, dependiendo de un valor en su registro de comparación.
En el Arduino Uno, Mini y Nano el uso de timers es:
■ El Timer0 controla las salidas PWM 5 y 6. El Timer1 controla las salidas PWM 9 y 10. El Timer2 controla las salidas PWM 3 y 11.
En el Arduino Mega el uso es:
■ El Timer0 controla las salidas PWM 4 y 13. El Timer1 controla las salidas PWM 11 y 12. El Timer2 controla las salidas PWM 9 y 10. El Timer3 controla las salidas PWM 2, 3 y 5. El Timer4 controla las salidas PWM 6, 7 y 8.
El Timer5 controla las salidas PWM 44, 45 y 46.
Frecuencia de ciclo de PWM
La frecuencia de cada PWM depende de las características del temporizador al que está conectado, y de un registro de pre-escala, que divide el tiempo por un número entero. La frecuencia de los PWM se puede modificar cambiando la pre-escala de los Timer correspondientes.
Arduino Uno, Mini y Nano disponen de tres temporizadores.
■ Timer0, con una frecuencia de 62.500 Hz, y pre-escala de 1, 8, 64, 256 y 1024.
■ Timer1, con una frecuencia de 31.250 Hz, y pre-escala de 1, 8, 64, 256, y 1024.
■ Timer2, con una frecuencia de 31.250 Hz, y pre-escala de 1, 8, 32, 64, 128, 256, y 1024.
El Arduino Mega añade tres temporizadores adicionales.
Timer3, 4 y 5, con una frecuencia de 31.250 Hz, y pre-escala de 1, 8, 64, 256 y 1024.
Por esto, la frecuencia estándar para las salidas PWM en Arduino Uno, Mini y Nano es de 490 Hz para todos los pines, excepto para el 5 y 6 cuya frecuencia es de 980 Hz. En el Arduino Mega, la frecuencia estándar es de 490 Hz para todos los pines, excepto para el 4 y 13 cuya frecuencia es de 980 Hz
Incompatibilidades:
El uso de los Timer no es exclusivo para las salidas PWM: es compartido con otras funciones. Emplear funciones que requieren el uso de estos Timer supondrá que no podremos emplear al mismo tiempo alguno de los pines PWM.
Algunas de las incompatibilidades más típicas:
1. La librería servo hace uso intensivo de temporizadores por lo que, mientras la estemos usando, no podremos usar algunas de las salidas PWM.
En el caso de Arduino Uno, Mini y Nano, la librería servo usa el Timer 1, por lo que no podremos usar los pines 9 y 10 mientras tengamos un servo en el crcuito.
En el caso de Arduino Mega, dependerá de la cantidad de servos que empleemos.
Si usamos menos de 12 servos el Mega utiliza el Timer 5, por lo que no se pueden usar para PWM los pines 44, 45 y 46. Para 24 servos usa los Timer 1 y 5, por lo que no se pueden usar para PWM los pines 11, 12, 44, 45 y 45. Para 36 servos usa los Timer 1, 3 y 5, impidiendo usar para PWM los pines 2, 3, 5, 11, 12, 44, 45, 46. Para 48 servos, usa los Timer 1, 3, 4 y 5, quedando sin pines PWM disponibles.
2. SPI: en Arduino Uno, Mini y Nano, el pin 11 se emplea también para la función MOSI de la comunicación SPI. Por lo cual no podremos usar ambas funciones de ese pin en forma simultánea. Arduino Mega no tiene este problema, ya que se conectan a pines distintos.
3. La función Tone emplea el Timer 2, por lo que no podremos usar los pines 3 y 11 para PWM. En Arduino Mega no se pueden usar los pines 9 y 10.
En todos los casos, todo se debe al uso de bibliotecas (librerías) de funciones. Programando en muy bajo nivel, es posible lograr mejores prestaciones. Pero no es una tarea fácil, ya que requiere mucha experiencia.
Artículos relacionados:
■ Uso de la placa L298N para motores de CC
■ Puente H: Placa controladora de motores L9110S
■ Guía rápida de placas de control de motores
■ Manejo de potencia para motores con el integrado L293D
■ Control de motores de CC por Ancho de Pulso (PWM)