Tren de Pulsos:
Se denomina así porque el tiempo que la señal se encuentra en estado alto (HIGH) es igual al que está en estado bajo (LOW) y se asemeja a una serie de cuadrados o rectángulos.
Señal de tren de pulsos
Señal PWM:
El término PWM proviene del inglés (Pulse Width Modulation) que significa modulación por ancho de pulsos.
Una señal PWM es una señal digital similar al tren de pulsos, la principal diferencia con el tren de pulsos es que en la señal PWM, es posible variar el tiempo que la señal se mantiene en estado alto, pero siempre manteniendo el periodo constante.
Señal de PWM
Tiempos en señal PWM:
En una señal PWM tendremos un tiempo en que la señal estará en estado HIGH y un tiempo en estado LOW.
TON = tiempo en ALTO.
TOFF = tiempo en BAJO.
T = periodo de la señal.
T = TON + TOFF
Periodo de Señal PWM (TON - TOFF)
Ciclo de trabajo - Duty Cycle:
Ciclo de trabajo se representa mediante la letra D y se define como la razón entre el tiempo en estado alto (TON) y el periodo de la señal (T):
D = ( TON / T ) . 100%
☼ El ciclo de trabajo se representa en porcentaje por eso se multiplica por 100
Gráficos de señal PWM con distintos ciclos de trabajo
Voltaje Promedio:
El ciclo de trabajo permite controlar el voltaje promedio de la señal es decir, variar el voltaje de salida.
Cambiar el voltaje de salida de 5V a 3,75 V.
(PWM se emplea como conversor digital-analógico.)
Vp = ( VH - VL ) . (D/100)
VH = voltaje en ALTO.
VL = voltaje en BAJO.
Una señal PWM puede utilizarse a controlar el brillo de un LED al variar el ciclo de trabajo.
También puede utilizarse para controlar o la velocidad de un motor de CC.
Frecuencia de un PWM:
La frecuencia viene controlada por el período de repetición de la onda configurada. En algunos casos la frecuencia de la portadora es fija, en otros varía continuamente o se modifica en función de la modulación.
Por otro lado, en algunos casos el usuario puede seleccionarla de acuerdo con sus necesidades y las posibles resonancias mecánicas.
Según nuestra aplicación con PWM, la frecuencia escogida puede provocar diversos efectos.
Como se ve en los gráficos, la salida de la señal PWM no es completamente analógica. Por tanto, si la usamos por ejemplo para la alimentación de un motor DC, la propia inercia del motor hará que no se noten los pulsos, pero según la frecuencia se puede llegar a notar vibraciones o ruidos.
El uso en cargas inductivas (motores, electroimanes, relés, etc.) donde la rápida desconexión, cuando el pulso baja, puede ocasionar daños en las salidas digitales o los propios componentes. Para ello se deberá modificar la frecuencia de funcionamiento del PWM, o incluso en el último caso, disponer de protecciones oportunas, como diodos.
En el caso de Arduino, la frecuencia de PWM es de 500Hz, por lo que el periodo será de 2ms, pudiendo ser modificada si lo deseamos.
PWM con ARDUINO.
Para generar una señal PWM con Arduino utilizando la función analogWrite(), el microcontrolador emplea un contador-comparador de 8 bits y un valor que representa el ciclo útil de la señal a generar, este se montara sobre la frecuencia que tenga estándar en pin seleccionado.
(La frecuencia estándar para las salidas PWM en Arduino Uno, Mini y Nano es de 490Hz para todos los pines, excepto para el 5 y 6 cuya frecuencia es de 980Hz)
Un temporizador o contador de 8 bits no es más que un entero cuyo valor se va incrementando de 0 a 255 y una vez que alcanza ese valor regresa a 0 para recomenzar el ciclo.
Rampa de contador de 8 bits
Escalones del contador
El comparador cuenta con dos entradas y una salida. Este es el encargado de generar la señal PWM con Arduino utilizando el contador y el valor que representa al ciclo útil.
El valor que utiliza el comparador para determinar el ciclo útil no se expresa en tanto por ciento. Se expresa como un número entre 0 y 255 porque este es el valor máximo que puede alcanzar el contador (8 bits).
Un valor de 255 de ciclo útil realmente genera un ciclo de trabajo del 100%, mientras que con un valor de 127 se logra un ciclo de trabajo del 50%.
Ejemplo de PWM para controlar el brillo de un LED:
Circuito ARDUINO y LED con PWM
#define led 5
int valor = 0;
bool estado = false;
void setup() {
pinMode(led,OUTPUT);
Serial.begin(9600);
}
void loop() {
if (estado == false) {
analogWrite(led,valor);
delay(10);
valor++;
if (valor==255) {
estado == true;
} }
if (estado == true) {
analogWrite(led,valor);
delay(10);
valor--;
if (valor==0) {
estado == false;
} } } // fin loop
Código de testeo LED - PWM
▼ Simulación del circuito PWM-LED con el código de lectura para ARDUINO ▼
► Se puede observar en la simulación que el led va incrementando su brillo a medida que el ciclo de trabajo del PWM (visto en el osciloscopio) aumenta su porcentaje.
►Un 100% de ciclo de trabajo de PWM en una salida de ARDUINO equivaldrá a 5V, es en ese instante donde el LED genera todo su brillo.
Las funciones PWM por hardware emplean los Timer para generar la onda de salida.
Cada Timer da servicio a 2 o 3 salidas PWM. Para ello dispone de un registro de comparación por cada salida.
Cuando el tiempo alcanza el valor del registro de comparación, la salida invierte su valor.
Cada salida conectada a un mismo temporizador comparte la misma frecuencia, aunque pueden tener distintos Duty cycles, dependiendo del valor de su registro de comparación.
ASOCIACIÓN DE TIMERS Y PWM
En el caso de Arduino Uno, Mini y Nano
El Timer0 controla las salidas PWM 5 y 6.
El Timer1 controla las salidas PWM 9 y 10.
El Timer2 controla las salidas PWM 3 y 11.
INCOMPATIBILIDADES
El uso de los Timer no es exclusivo de las salidas PWM, si no que es compartido con otras funciones.
Emplear funciones que requieren el uso de estos Timer supondrá que no podremos emplear de forma simultánea alguno de los pines PWM.
A continuación alguna de las incompatibilidades más frecuentes
SERVO
La librería servo hace un uso intensivo de temporizadores por lo que, mientras la estemos usando, no podremos usar algunas de las salidas PWM.
En el caso de Arduino Uno, Mini y Nano, la librería servo usa el Timer 1, por lo que no podremos usar los pines 9 y 10 mientras usemos un servo.
COMUNICACIÓN SPI
En Arduino Uno, Mini y Nano, el pin 11 se emplea también para la función MOSI de la comunicación SPI.
Por lo tanto, no podremos usar ambas funciones de forma simultánea en este pin.
FUNCIÓN TONE
La función Tone emplea el Timer 2, por lo que no podremos usar los pines 3 y 11.
Para lograr una frecuencia más baja o más alta que la frecuencia predeterminada en los pines PWM, se puede usar un código de línea antes de inicializar el pin PWM, se muestran a continuación:
Aquí está la frecuencia predeterminada de cada pin PWM de Arduino UNO - NANO:
Frecuencia PWM para D3 y D11: 490.20 Hz (El DEFAULT)
Frecuencia PWM para D5 y D6: 976.56 Hz (El DEFAULT)
Frecuencia PWM para D9 y D10: 490.20 Hz (El DEFAULT)
► Códigos para cambios de Frecuencia:
Frecuencia de PWM para pines D5 & D6
TCCR0B = TCCR0B & B11111000 | B00000001;
establezca el divisor del temporizador 0 en 1 para una frecuencia PWM de 62500,00 Hz
TCCR0B = TCCR0B & B11111000 | B00000010;
establezca el divisor del temporizador 0 en 8 para una frecuencia PWM de 7812,50 Hz
TCCR0B = TCCR0B & B11111000 | B00000011;
establezca el divisor del temporizador 0 en 64 para una frecuencia PWM de 976,56 Hz (el PREDETERMINADO)
TCCR0B = TCCR0B & B11111000 | B00000100;
establezca el divisor del temporizador 0 en 256 para una frecuencia PWM de 244,14 Hz
TCCR0B = TCCR0B & B11111000 | B00000101;
establezca el divisor del temporizador 0 en 1024 para una frecuencia PWM de 61,04 Hz
Frecuencia de PWM para pines D9 y D10
TCCR1B = TCCR1B & B11111000 | B00000001;
Establezca el divisor del temporizador 1 en 1 para la frecuencia PWM de 31372,55 Hz
TCCR1B = TCCR1B & B11111000 | B00000010;
establezca el divisor del temporizador 1 en 8 para una frecuencia PWM de 3921,16 Hz
TCCR1B = TCCR1B & B11111000 | B00000011;
establezca el divisor del temporizador 1 en 64 para una frecuencia PWM de 490,20 Hz (el PREDETERMINADO)
TCCR1B = TCCR1B & B11111000 | B00000100;
establezca el divisor del temporizador 1 en 256 para una frecuencia PWM de 122,55 Hz
TCCR1B = TCCR1B & B11111000 | B00000101;
establezca el divisor del temporizador 1 en 1024 para una frecuencia PWM de 30,64 Hz
Frecuencia de PWM para pines D3 y D11
TCCR2B = TCCR2B & B11111000 | B00000001;
establezca el divisor del temporizador 2 en 1 para la frecuencia PWM de 31372,55 Hz
TCCR2B = TCCR2B & B11111000 | B00000010;
establezca el divisor del temporizador 2 en 8 para una frecuencia PWM de 3921,16 Hz
TCCR2B = TCCR2B & B11111000 | B00000011;
establezca el divisor del temporizador 2 en 32 para una frecuencia PWM de 980,39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100;
establezca el divisor del temporizador 2 en 64 para una frecuencia PWM de 490,20 Hz (el PREDETERMINADO)
TCCR2B = TCCR2B & B11111000 | B00000101;
establezca el divisor del temporizador 2 en 128 para una frecuencia PWM de 245,10 Hz
TCCR2B = TCCR2B & B11111000 | B00000110;
establezca el divisor del temporizador 2 en 256 para una frecuencia PWM de 122,55 Hz
TCCR2B = TCCR2B & B11111000 | B00000111;
configure el divisor del temporizador 2 en 1024 para una frecuencia PWM de 30,64 Hz
► EJEMPLO CAMBIO DE FRECUNCIA:
Se escriben dos programas separados para cada Arduino :
Programa A - Frecuencia por defecto en el Pin 3
void setup() {
pinMode(3,OUTPUT);
// ponga su código de configuración aquí, para ejecutar una vez:
}
void loop() {
analogWrite(3,155);
// pon tu código principal aquí, para ejecutar repetidamente:
}
Programa B - Frecuencia modificada en el Pin 3
void setup() {
TCCR2B = TCCR2B & B11111000 | B00000111; // para frecuencia PWM de 30,64 Hz
pinMode(3,OUTPUT);
// ponga su código de configuración aquí, para ejecutar una vez:
}
void loop() {
analogWrite(3,155);
// pon tu código principal aquí, para ejecutar repetidamente:
}