¿Qué ocurre cuando para controlar un dispositivo necesitamos una salida analógica? Es decir, una señal que puede obtener cualquier valor comprendido entre, por ejemplo, 0 y 5 voltios. Esta señal puede ser generada de muchas formas, por ejemplo con un potenciómetro. Aunque en este caso lo vamos a hacer con un microcontrolador y siendo más concreto, con Arduino.
La base del sistema será una señal PWM generada por Arduino la cual la haremos pasar por un filtro paso bajos de primer orden. Al salir del filtro habremos eliminado la señal PWM y nos quedaremos solo con la componente continua.
Una señal cuadrada como la de PWM es una señal compuesta por otras muchas señales.
Si eres ingeniera o ingeniero seguro que te suena Fourier y si no lo eres, te animo a que investigues sobre las series de Fourier. Simplificándolo mucho, Fourier dice que cualquier señal periódica puede ser reproducida usando señales senoidales y una señal constante.
El valor medio de una señal PWM varia en función de el duty cicle de la señal. A mayor ciclo de trabajo, mayor valor medio de tensión portará la señal PWM. Al hacer pasar la señal PWM por un filtro paso bajos, todas las componentes del PWM se atenúan salvo la componente continua.
Tal y como se ve en la siguiente captura de pantalla del osciloscopio, la salida analógica obtenida no es totalmente continua, si no que tiene algo de rizo. Esto es debido a que es muy difícil atenuar por completo las componentes cuya frecuencia sea distinta de cero.
Es importante tener en cuenta que al hablar de un filtro RC sobre una salida de un microcontrolador la corriente que podremos extraer tras el filtro será muy baja.
Puedes echarle un vistazo al vídeo para verlo en acción.
Generando una salida analógica con Arduino y PWM
El siguiente código es un ejemplo muy sencillo sobre como generar una señal PWM usando Arduino.
El ejemplo realiza un barrido desde 0 hasta 255, generando una salida analógica de tensión ascendiente desde 0 hasta 5 voltios.
/* PWM to analog By: Enrique RincónIngenieril Date: July 7th, 2016 License: This code is public domain. */ void setup(){ pinMode(6,OUTPUT); } void loop(){ for(int i=0; i < 256; i++){ analogWrite(6,i); delay(10);archiconocidos } }