PWM
PWM: Viene de las siglas en inglés de Modulación por Ancho de Pulso. Se utiliza para controlar la potencia que se entrega a la carga (por ejemplo para controlar la intensidad lumínica de un led).
Debido a que la tensión de alimentación no se puede variar se alimentan los dispositivos con un PWM que consiste en pulsos de diferente ancho (modulación) que al tener mayor ancho generan una tensión media mayor. Y al ser más estrechos se tiene una tensión media inferior. De esta forma, alimentando la carga con una tensión media variable se consigue variar su comportamiento de forma proporcional.
Los casos extremos serían no tener un pulso, es decir que la media sea 0V y que no exista ningún “hueco” siendo ese valor máximo V+.
En la imagen se muestran tres ejemplos de cómo varía la tensión media en función del “ancho” del pulso, siendo V+ la tensión de alimentación del circuito (por ejemplo en los Arduinos ese valor sería 5V).
Conviene destacar que son datos digitales, pero desde el punto de vista de la carga (como un led) es una variable analógica pues “trabajan” con el valor medio del resultado del PWM, es decir, un valor medio analógico.
Para conseguir una salida de PWM se actúa sobre Ton, es decir el tiempo que estará la tensión funcionando.
El periodo de tiempo que hay entre pulsos denominado ‘T’ se suele indicar con la frecuencia (que no es más que 1 dividido de T ó 1/T). Y el otro valor importante para un PWM es el número de bits al que es capaz de trabajar y lo que implica son la cantidad de divisiones que puede hacer durante el periodo T. Lo habitual son 8bit (256 posibles valores), como en el Arduino UNO, pero no es difícil encontrarse con resoluciones de 12bit (4096 valores para dividir el periodo T).
En Arduino los pines PWM vienen marcados con la virgulilla (el símbolo que acompaña a la letra eñe: ~) y su resolución es de 8bit (valores entre 0 y 255). Eso no es impedimento para lograr efectos analógicos realistas como veremos a continuación.
Manejo del PWM: desvanecimiento de un led
El siguiente programa está basado en un ejemplo de Arduino, y se puede encontrar en el menú: Archivo>Ejemplos> 03.Analog > Fading.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
const byte ledPin = 9; // Sólo válidos pines con el símbolo: ~ void setup() { // No se hace nada en el setup pues por defecto los // puertos digitales con PWM ya son salidas digitales } void loop() { // Aumento desde el valor mínimo al máximo en saltos de 5: for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) { analogWrite(ledPin, fadeValue); // Escribir el valor en el puerto PWM delay(30); //Se esperan 30 milisegundos para que se apreciar el efecto } // Desvanecimiento desde el valor máximo al mínimo en saltos de 5: for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) { analogWrite(ledPin, fadeValue); //Escribir el valor en el puerto PWM delay(30); //Se esperan 30miliseg. para que de tiempo a ver el efecto } } |
Y lo que hace es desvanecer el valor del PWM obteniendo como resultado un desvanecimiento en la intensidad lumínica del led.