Qué es PWM y cómo funciona en Arduino
Vamos a ello, ¿Qué es PWM en Arduino?
¿Qué coño es PWM? PWM viene del inglés Pulse Width Modulation. Son señales cuadradas a las cuáles se les cambia el periodo. Fíjate en esta imagen de la wikimedia (libre de derechos y tal):
Si el ciclo de trabajo es del 25% se pasa el 25% de su periodo arriba y el 75% abajo. El periodo es lo que dura la onda sin repetirse. Por eso ves que se va repitiendo con el tiempo porque el periodo se repite durante todo el tiempo. El periodo es la suma de la parte alta y baja una vez, cuando vuelve a subir ya es otro periodo y la onda vuelve a empezar otra vez.
Fíjate que el ancho de la onda, su altura, siempre es la misma. Va de 0 a 5 Voltios. Lo único que varía es el tiempo que está en ON/OFF. La frecuencia de los pines es de 490Hz más o menos, excepto el 5 y el 6 que es de 980 Hz para el Arduino UNO y lo mismo pero en los pines 3 y 11 para el Leonardo. La locura es simplemente porque dependen de los timers (temporizadores) internos que tienen. Hay 3 y uno de ellos tiene el doble de frecuencia lo que afecta a nuestros pines.
Así lo que pasa es que con este pequeño cálculo:
conseguimos el tiempo del periodo. Esto significa que estamos jugando con porcentajes de un tiempo que es ná, 2 milésimas de segundos.
Para qué se usa el PWM este?
Es raro que empiece ahora a hablar de ondas,¿no? ¿Año nuevo fumada nueva? ¡Qué va, no tanto! Lo que pasa es que las ondas estas se utilizan para controlar la dirección de los servos entre otras cosas molonas. Así lo que hacen es generar pulsos (un pulso es la subida y bajada, esa onda cuadrada que se forma) cada x tiempo. Según el tiempo, que se controla con el ciclo de trabajo (el porcentaje ese que te dije antes), el servo cambia de posición entre 0 y 180º.
¿Sabes para qué se utiliza más? ¿Te acuerdas de esos leds que programaste hace poco? Pues si te das cuenta te dije yo los pines que deberías usar. De hecho tal vez en clones de Arduino (¡Cómo te gusta china, bribón!) no te funcionen porque no sean pines PWM. El truco está en que hemos conectado unos pines digitales para generar una señal analógica…WTF!!!! ¿Estamos locos o qué?
Pines digitales y leds
Si son pines digitales la teoría dice que deben de generar dos valores: o 5V o 0 Voltios, u ON u OFF. Y eso es lo que pasa si cargas el programa Fade en pines como el 12 o el 8, por eso te hice cambiar el pin del 12 al 9 😉 . Esto sucede porque hemos utilizado la función AnalogWrite de Arduino. Esta función lo que hace es generar una onda cuadrada con el ciclo de trabajo adecuado para que simule que estás creando una señal de un voltaje dado. No lo generamos de manera real, simplemente es un juego de ondas 😉
Y tú me dirás: Hermano, ¿por qué no utilizas los pines analógicos y ya está todo apañao? Pues porque justamente y mágicamente los pines analógicos (A0-A5) solamente son de entrada. Sólo leen, no envían y es por eso que no es necesario declararlos en el setup como INPUT ni nada similar.
Si te pusieses cabezón y quisieses crear tu propia función PWM en cualquier pin una forma rudimentaria de hacerlo sería esta:
int ciclotrabajo = 100; void setup() { pinMode(8, OUTPUT); } void loop() { digitalWrite(8, HIGH); delayMicroseconds(ciclotrabajo); digitalWrite(8, LOW); delayMicroseconds(500 - ciclotrabajo); /*El ciclo es de 500Hz mas o menos*/ }
Fíjate que lo que hago no es más que generar un ciclo de trabajo y le hago estar tantos microsegundos (en el delay eran milisegundos, esto es mil veces menos) esperando encendido (HIGH) y luego los que restan apagado (LOW). No intentes probar esto con un led porque ya te dije que a velocidades altas no somos capaces de distinguir este pequeño cambio con nuestros ojos. Este método es rudimentario porque además de que si aparece una interrupción se jode el invento (otro día hablamos de interrupciones que eso da para post), hay que tener en cuenta que los delay hacen que el microcontrolador se quede pensando y no puede hacer otra cosa que esperar.
Conclusiones
Bueno,al final el PWM ha resultado algo que se utiliza en motores, leds e incluso sonidos. Además de estar oculto dentro de Arduino y qué utilizas inconscientemente al generar una salida analógica. La cosa está en utilizar los pines correctos cuando queremos una variación en el voltaje de SALIDA.
Espero que te haya quedado claro qué es PWM y para qué sirve. Sígueme en Google+ (ahí en la barra de tu derecha) para hacerme feliz y que no mueran gatitos. Y ahí abajo puedes poner tu e-mail para que te avise de nuevos posts. Además, que nunca se sabe cuando me puede dar por hacerte algún regalito..guiño guiño 😉 ¿Nos vemos?
Información básica sobre Proteción de datos
Responsable ➥ Sergio Luján Cuenca
Finalidad ➥ Gestionar el envío de correos electrónicos con artículos, noticias y publicidad. Todo relacionado con los temas de rufianenlared.com
Legitimación ➥ Consentimiento del interesado
Destinatarios ➥ Estos datos se comunicarán a MailRelay para gestionar el envío de los correos electrónicos
Derechos ➥ Acceder, rectificar y suprimir los datos, así como otros derechos, como se explica en la política de privacidad
Plazo de conservación de los datos ➥ Hasta que se solicite la supresión por parte del interesado
Información adicional ➥ Puedes encontrarla en la política de privacidad y el aviso legal