Pulse Width Modulation (PWM), es una técnica utilizada para recrear un comportamiento analógico mediante señales digitales. Dicha señal digital es una onda cuadrada, la cual tiene dos valores: valor alto (5V en el caso de las placas Arduino) y valor bajo (0V).
La relación entre el tiempo que la señal está en nivel alto y nivel bajo se conoce como ciclo de trabajo (Duty Cycle, expresa en %). Por lo tanto, una señal que está 1ms en nivel alto y 1ms en nivel bajo, será una señal con 50% Duty Cycle. Entonces, ¿qué porcentaje queremos utilizar? Dependiendo de la tensión final que queramos tener. Es decir, se multiplican los 5 V de nivel alto que tienes por el % del ciclo de trabajo y tendrás la tensión final que tendremos en la salida PWM.
Ejemplo: 5V*50%= 2,5 V.
Ahora bien, ¿cómo generar la señal deseada en Arduino? Primero, hay que tener claro que no todas las salidas digitales valen, sólo las que están señaladas en la placa con las siglas PWM. Segundo, el generador PWM de la placa tien una resolución de 8 bits, por lo tanto, podrá trabajar con 256 valores (de 0 a 255).
Con estas dos premisas claras, basta con utilizar la función «analogWrite(pinPWM, valor);» y así obtener la señal cuadrada deseada. En la siguiente imagen se recogen ejemplos de la función analogWrite con la relación directa entre %DutyCycle y valor del generador PWM.
Se va a llevar a cabo un sencillo montaje para poder ver cómo la placa Arduino es capaz de regular la intensidad con la salida digital PWM. Si tuviéramos un Osciloscopio podríamos comprobarlo en la pantalla.
Materiales
1x Arduino UNO
1x Resistencia 220 ohm
1x LED
1x Protoboard
Cables
Conexiones
Programa
int pinLED = 9; // LED conectado al pin digital 9 void setup() { // nada que inicializar } void loop() { // intensidad desde el mínimo hasta el máximo incrementándose de 5 en 5 for(int valorintensidad = 0 ; valorintensidad <= 255; valorintensidad +=5) { // sets the value (range from 0 to 255): analogWrite(pinLED, valorintensidad); // esperar 30 milisegundos para poder apreciar el cambio delay(30); } // disminuir intensidad de forma contraria for(int valorintensidad = 255 ; valorintensidad >= 0; valorintensidad -=5) { // sets the value (range from 0 to 255): analogWrite(pinLED, valorintensidad); delay(30); } }
Vídeo