Paso 14: Cómo la modulación de anchura de pulso funciona
Electrónicamente "tomando la media de una señal" se puede traducir a "pasarla a un filtro low-pass", como en el anterior paso.
¿Cómo genera a una señal PWM del Arduino? Hay un tutorial muy bueno sobre PWM:
http://Arduino.CC/en/Tutorial/SecretsOfArduinoPWM
Vemos sólo los puntos que se necesitan para este proyecto.
En el ATMega328P hay tres temporizadores que pueden utilizar para generar señales PWM, cada una de ellas tiene características diferentes que puede utilizar. Para cada temporizador corresponden dos registros llamados A comparar registros de salida / B (OCRnx) que se utilizan para definir el ciclo de trabajo de la señal.
En cuanto a la ADC hay un prescaler (ver imagen), que retrasa el reloj principal para tener un control preciso de la frecuencia PWM. El reloj retrasado se alimenta a un contador que aumenta un Temporizador/contador de registro (TCNTn). Este registro se compara continuamente a lo OCRnx, cuando son iguales se envía una señal a un generador de forma de onda que genera un pulso en el pin de salida. Así que el truco es establecer el registro OCRnx en algún valor para cambiar el valor medio de la señal.
Si queremos una señal de V 5 (máximo) debemos fijar un ciclo de trabajo 100% o un 255 en el OCRnx (máximo para un número de 8 bits), mientras que si queremos una señal de V 0.5 debemos establecer un ciclo de trabajo 10% o un 25 en el OCRnx.
Puesto que el reloj tiene que llenar el registro de TCNTn antes de comenzar desde el principio para un nuevo pulso de la frecuencia de salida del PWM es:
f = (reloj principal) / divisor / (máximo TCNTn)
exempli gratia para el Timer 0 y 2 (8 bits) con sin prescaler será: 16 MHz / 256 = 62,5 KHz mientras que para el Timer 1 (16 bits) será 16 MHz / 65536 = 244 Hz.
Decidí usar el número de temporizador 2 porque
- Contador de tiempo 0 se utiliza internamente por el IDE de Arduino para funciones tales como millis();
- Temporizador de 1 tiene una frecuencia de salida demasiado lenta ya que es un temporizador de 16 bits.
En el ATMega328P hay diferentes tipos de modo de operación de los contadores de tiempo, pero lo que quería era el Fast PWM con ninguna escala para obtener la frecuencia máxima de salida posible.