Muy a menudo en robótica, es necesario controlar sin problemas algún proceso, ya sea el brillo de un LED, la potencia de un calentador o la velocidad de rotación de un motor. Es bastante obvio que el control está directamente relacionado con el cambio de voltaje en el receptor: tanto el LED brillará de manera diferente como el motor girará a una velocidad diferente. Pero el problema es que solo un DAC, un convertidor de digital a analógico, puede controlar el voltaje, y nuestro microcontrolador no tiene un DAC incorporado, solo tenemos una señal digital, es decir, ya sea encendido o apagado:
Que es PWM.
¿Es posible lograr un control suave de la señal digital? ¡Resulta que puedes! Imagine un ventilador funcionando a plena potencia, el voltaje es constante. Imagínese ahora que el voltaje se aplica por un segundo, y por un segundo – no, y así continúa «en un círculo». El ventilador comenzará a girar el doble de lento, pero lo más probable es que notemos los momentos de encendido y apagado, especialmente si el ventilador es pequeño. Un ventilador grande es más inerte y es posible que ni siquiera note los cambios de velocidad en dos segundos. Ahora puede encender el voltaje durante 0,5 segundos y apagarlo durante los 1,5 segundos restantes. El ventilador girará al 25% de la velocidad máxima. Acabamos de presentar la llamada señal PWM, modulación de ancho de pulso.
También funcionará con una bombilla incandescente, porque tiene gran inercia, pero con un LED veremos cómo se enciende y se apaga, porque prácticamente no tiene retardo de encendido / apagado. ¿Qué hacer? Es muy simple, sube la frecuencia. En el experimento mental, tuvimos un período de 2 segundos, que es 0.5 Hz. Ahora imagine una señal de este tipo con una frecuencia de, digamos, 1000 Hz. o 25.000 Hz (25 kHz). Ahora el papel lo juega la inercia del ojo, no notará destellos a tal frecuencia, para él solo será una disminución en el brillo. ¡El problema esta resuelto!
El Duty Cycle en PWM.
Al cambiar el llamado «llenado» de la señal PWM, es posible cambiar el voltaje «total» (integrado) durante un período determinado. Cuanto mayor sea el llenado de PWM, mayor será el voltaje, pero no más alto que el voltaje máximo «PWM».
A la relación entre el tiempo en que la señal esta en On y el tiempo que esta en Off se le llama Duty Cycle. También llamado relación marca-espacio.
Con una señal PWM, incluso puede modular señales analógicas complejas, como una onda sinusoidal. La siguiente imagen muestra el PWM (abajo) y el mismo PWM después de los filtros:
Así funcionan los inversores DC-AC. Volviendo a las propiedades de la señal PWM, solo hay dos: la frecuencia (frequency) y la relación (duty). Pasemos a generar PWM con Arduino.
Generando Pwm en Arduino.
En la lección sobre funciones temporizaciones, dije que el microcontrolador tiene los llamados contadores que cuentan las «ciclos» del generador de reloj (cuarzo). Estos contadores generan una señal PWM, es decir el núcleo computacional del propio microcontrolador no participa en esto. Además de los cálculos, incluso la salida de la señal de la pata del Mc descansa sobre los hombros del contador. Esto es muy importante de entender, porque la señal PWM no ralentiza la ejecución del código, ya que literalmente “es otra pieza de hardware” la que está involucrada en su generación.
En las placas UNO / Nano / Pro Mini, tenemos tres contadores de temporizador, cada temporizador tiene dos salidas a los pines MC, es decir, tenemos 2 * 3 = 6 pines capaces de generar una señal PWM. Para la generación PWM, tenemos una función lista para usar analogWrite ( pin, duty ).
- Pin, es un pin del temporizador. Para Nano / Uno, estos son los pines D3, D5, D6, D9, D10, D11. En algunas placas están marcadas * con un asterisco, pero en general, para determinar los pines PWM en cualquier otro modelo de Arduino, basta con mirar el pinout.
- Duty– Relación de la señal PWM. Por defecto, todas las «salidas» PWM son de 8 bits, es decir, el duty puede tomar un valor con una «resolución» de 8 bits, que es 0-255.
Combinemos este conocimiento con la lección anterior e intentemos cambiar el brillo del LED conectado a través de una resistencia al pin D3. Potenciómetro conectado al pin A0.
void setup() { pinMode(3, OUTPUT); // D3 como salida } void loop() { // PWM para pin 3 , 1023/4 = 255 analogWrite(3, analogRead(0) / 4); delay(10); }
El ejemplo considerado cambia el brillo del LED dependiendo de la posición del eje del potenciómetro.
Algunas palabras sobre la señal PWM “estándar”: la obtenemos con la configuración que nos brinda la biblioteca Arduino.h, y esta configuración se subestima en gran medida en comparación con las capacidades de Arduino. Hablaremos de «mejorar» PWM más adelante, pero ahora echemos un vistazo a las características de PWM «fuera de la caja»:
Temporizador | Pines | Frecuencia | Resolución |
Temporizador 0 | D5 y D6 | 976 Hz | 8 bits (0-255) |
Temporizador 1 | D9 y D10 | 488 Hz | 8 bits (0-255) |
Temporizador 2 | D3 y D11 | 488 Hz | 8 bits (0-255) |
Estos son números mejorables, especialmente en términos de frecuencia. Todos los temporizadores son de talla única, para que el usuario no piense y no estudie documentación innecesaria. Volveremos a cambiar la frecuencia y el ancho del PWM en una lección separada.