PWM Arduino
La señal de PWM con Arduino es generada en los pines especificados con el símbolo (~), en la mayoría de las placas Arduino disponibles en el mercado (aquellas que tienen como corazón el microcontrolador ATmega168 o ATmega328), las Salidas PWM o PWM Output Arduino se encuentran en los pines 3, 5, 6, 9, 10 y 11. En Arduino Mega, esto funciona del pin 2 al 13 y del 44 al 46. Y en modelos más antiguos con un micro ATmega8 solo tiene como PWM Output en Arduino los pines 9, 10 y 11, A continuación, podemos ver una imagen con la ubicación de las Salidas PWM en un Arduino UNO.
La señal PWM con Arduino es una señal periódica (o sea que se repite con el pasar del tiempo) la cual le podemos modificar su ciclo de trabajo (Duty Cicle – En Ingles).
Por ejemplo, el PWM de un PIN en Arduino es simplemente una señal binaria (0v o 5v) que podremos configurar para que trabaje un determinado tiempo en Encendido o 5v y el resto de tiempo en Apagado o 0v, y repita este procedimiento infinitamente, pudiendo variar este ancho de pulso en cualquier instante, tal y como se puede observar en la siguiente figura, que representa el PWM en un PIN de Arduino.
Esto es interesante, porque el voltaje medio que se le aplica a la carga es proporcional al tiempo que la señal se mantuvo en 5v y con esto podemos lograr varias aplicaciones como controlar la luminosidad de un LED (PWM Led Arduino), la velocidad de un motor (PWM Motor Arduino), regular resistencias calefactoras a través de relés de estado sólido, controlar un servomotor con Arduino, etc.
Recordemos que una resolución de 8bits en una salida PWM significa que tenemos 256 niveles. Es decir, representamos el Duty cycle mediante un número de 0 a 255.
Timer – PWM Arduino
Como hablamos en la entrada de Timer Arduino, la señal y frecuencia del PWM del Arduino están gobernados por los diferentes temporizadores o TIMERs que posee la placa de desarrollo.
Cada uno de los Timers del Arduino está en la capacidad de controlar 2 o 3 pwm asignando un registro de comparación para cada señal, de tal forma que cuando el temporizador alcance el valor del registro de comparación simplemente cambia el estado lógico de la salida. Logrando de esa forma la señal binaria del PWM.
En la siguiente tabla se muestra los pines PWM que son administradas por cada Timer junto con su frecuencia (PWM frequency Arduino).
BOARD PWM PINS PWM FREQUENCY
Uno, Nano, Mini 3, 5, 6, 9, 10, 11 490 Hz (pins 5 and 6: 980 Hz)
Mega 2 – 13, 44 – 46 490 Hz (pins 4 and 13: 980 Hz)
Leonardo, Micro, Yún 3, 5, 6, 9, 10, 11, 13 490 Hz (pins 3 and 11: 980 Hz)
Uno WiFi Rev.2 3, 5, 6, 9, 10 976 Hz
MKR boards * 0 – 8, 10, A3 (18), A4 (19) 732 Hz
MKR1000 WiFi * 0 – 8, 10, 11, A3 (18), A4 (19) 732 Hz
Zero * 3 – 13, A0 (14), A1 (15) 732 Hz
Due ** 2-13 1000 Hz
101 3, 5, 6, 9 pins 3 and 9: 490 Hz, pins 5 and 6: 980 Hz
l PWM en los pines 5 y 6 tendrán ciclos de trabajo más altos de lo esperado. Esto se debe a las interacciones con las funciones millis () y delay (), que comparten el mismo TIMER interno utilizado para generar esas salidas PWM. Esto se notará principalmente en configuraciones de ciclo de trabajo bajo (por ejemplo, 0-10) y puede dar como resultado que un valor de 0 no apague completamente la salida en los pines 5 y 6.
Configurar el PWM en Arduino
Para la configuración del PWM Output Arduino simplemente utilizamos la siguiente instrucción:
Sintaxis
analogWrite (pin, valor)
Parámetros
pin: el pin PWM Arduino a ser escrito. Tipos de datos permitidos: int.
valor: el ciclo de trabajo: entre 0 (siempre apagado) y 255 (siempre encendido). Tipos de datos permitidos: int.
PWM Frecuencia (Frequency) Arduino
La señal PWM está determinada por la velocidad del TIMER. Suponiendo que está utilizando un Arduino UNO, el reloj de este contador es igual al reloj del sistema dividido por un valor de preescaler. El pescaleres un valor de 3 bits almacenado en los tres bits menos significativos del registro del TIMER: CS02, CS01 y CS00.
Existen tres registros de temporizador / contador: TCCR0B, TCCR1B y TCCR2B.
Como hay tres preescaladores diferentes, los seis pines PWM se dividen en tres pares, cada par tiene su propio preescalador. Por ejemplo, los pines de Arduino 6 y 5 están controlados por TCCR0B, por lo que se puede configurar los pines Arduino 6 y 5 para emitir una señal PWM a una determinada frecuencia. Los pines Arduino 9 y 10 están controlados por TCCR1B, por lo que pueden configurarse a una frecuencia diferente de los pines 6 y 5. Los pines Arduino 11 y 3 están controlados por TCCR2B, por lo que pueden configurarse a una tercera frecuencia. Pero no puede establecer diferentes frecuencias para los pines controlados por el mismo preescalador (por ejemplo, los pines 6 y 5 deben estar en la misma frecuencia).
¿Cómo se cambia la frecuencia PWM?
En void setup () establezca o borre los bits CS02, CS01 y CS00 en el registro TCCRnB correspondiente.
Para Arduino Uno, Nano, YourDuino RoboRED, Mini Driver, Lilly Pad y cualquier otra placa que use ATmega 8, 168 o 328
//Set PWM frequency for D5 & D6 -------------------------------
//TCCR0B = TCCR0B & B11111000 | B00000001; // set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz
//TCCR0B = TCCR0B & B11111000 | B00000010; // set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz
TCCR0B = TCCR0B & B11111000 | B00000011; // set timer 0 divisor to 64 for PWM frequency of 976.56 Hz (The DEFAULT)
//TCCR0B = TCCR0B & B11111000 | B00000100; // set timer 0 divisor to 256 for PWM frequency of 244.14 Hz
//TCCR0B = TCCR0B & B11111000 | B00000101; // set timer 0 divisor to 1024 for PWM frequency of 61.04 Hz
// Set PWM frequency for D9 & D10 ------------------------------
//TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000010; // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR1B = TCCR1B & B11111000 | B00000011; // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)
//TCCR1B = TCCR1B & B11111000 | B00000100; // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000101; // set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz
// Set PWM frequency for D3 & D11 ------------------------------
//TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000010; // set timer 2 divisor to 8 for PWM frequency of 3921.16 Hz
//TCCR2B = TCCR2B & B11111000 | B00000011; // set timer 2 divisor to 32 for PWM frequency of 980.39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100; // set timer 2 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)
//TCCR2B = TCCR2B & B11111000 | B00000101; // set timer 2 divisor to 128 for PWM frequency of 245.10 Hz
//TCCR2B = TCCR2B & B11111000 | B00000110; // set timer 2 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000111; // set timer 2 divisor to 1024 for PWM frequency of 30.64 Hz
Para Arduino Mega1280, Mega2560, MegaADK, Spider o cualquier otra placa que use ATmega1280 o ATmega2560
// Set PWM frequency for D4 & D13 ------------------------------
//TCCR0B = TCCR0B & B11111000 | B00000001; // set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz
//TCCR0B = TCCR0B & B11111000 | B00000010; // set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz
TCCR0B = TCCR0B & B11111000 | B00000011; <// set timer 0 divisor to 64 for PWM frequency of 976.56 Hz (Default)
//TCCR0B = TCCR0B & B11111000 | B00000100; // set timer 0 divisor to 256 for PWM frequency of 244.14 Hz
//TCCR0B = TCCR0B & B11111000 | B00000101; // set timer 0 divisor to 1024 for PWM frequency of 61.04 Hz
// Set PWM frequency for D11 & D12 -----------------------------
//TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000010; // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR1B = TCCR1B & B11111000 | B00000011; // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR1B = TCCR1B & B11111000 | B00000100; // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000101; // set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz
//Set PWM frequency for D9 & D10 ------------------------------
//TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000010; // set timer 2 divisor to 8 for PWM frequency of 3921.16 Hz
//TCCR2B = TCCR2B & B11111000 | B00000011; // set timer 2 divisor to 32 for PWM frequency of 980.39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100; // set timer 2 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR2B = TCCR2B & B11111000 | B00000101; // set timer 2 divisor to 128 for PWM frequency of 245.10 Hz
//TCCR2B = TCCR2B & B11111000 | B00000110; // set timer 2 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000111; // set timer 2 divisor to 1024 for PWM frequency of 30.64 Hz
// Set PWM frequency for D2, D3 & D5 ---------------------------
//TCCR3B = TCCR3B & B11111000 | B00000001; // set timer 3 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR3B = TCCR3B & B11111000 | B00000010; // set timer 3 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR3B = TCCR3B & B11111000 | B00000011; // set timer 3 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR3B = TCCR3B & B11111000 | B00000100; // set timer 3 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR3B = TCCR3B & B11111000 | B00000101; // set timer 3 divisor to 1024 for PWM frequency of 30.64 Hz
// Set PWM frequency for D6, D7 & D8 ---------------------------
//TCCR4B = TCCR4B & B11111000 | B00000001; // set timer 4 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR4B = TCCR4B & B11111000 | B00000010; // set timer 4 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR4B = TCCR4B & B11111000 | B00000011; // set timer 4 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR4B = TCCR4B & B11111000 | B00000100; // set timer 4 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR4B = TCCR4B & B11111000 | B00000101; // set timer 4 divisor to 1024 for PWM frequency of 30.64 Hz
//Set PWM frequency for D44, D45 & D46 ------------------------
//TCCR5B = TCCR5B & B11111000 | B00000001; // set timer 5 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR5B = TCCR5B & B11111000 | B00000010; // set timer 5 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR5B = TCCR5B & B11111000 | B00000011; // set timer 5 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR5B = TCCR5B & B11111000 | B00000100; // set timer 5 divisor to 256 for PWM frequency of 122.55 Hz
En este primer ejemplo veremos cómo variar la intensidad de un LED y el PWM es perfecto para controlar dicha intensidad del LED con Arduino. Para le control PWM del LED con Arduino vamos a utilizar un potenciómetro conectado a un Pin Análogo.
Con esta práctica vamos a aprender como variar la velocidad de un motor DC con Arduino. Para eso vamos a utilizar un potenciometro, un mosfer IRFZ44N, un diodo 1N4001, una resistencia de 220ohms.
en este ejemplo estamos usando el MOSFET IRFZ44N como un Switch, dado que es un dispositivo capaz de mover grandes potencias. La idea básica es que la señal PWM Swichee a alta velocidad el mosfet y de esa forma podremos regular la velocidad del motor DC con Arduino.
En la implementación práctica, usaremos una motobomba de 12v, por lo tanto debemos usar dos fuentes de alimentación. Una para el arduino y otra para la motobomba. Recordar conectar ambas tierras de las fuentes, para crear una única tierra común.
Códigos
A continuación están los dos códigos de los ejemplos que fueron explicados en detalle en los videos. Para accesar al código solo basta con compartir el contenido de este post, para permitir que más personas conozcan el sitio web y de esa forma podremos contribuir con el conocimiento para las demás personas.
LED
#define LED 3 // PIN 3 as LED
const int POT = A0; //Potenciometro
void setup() {
// put your setup code here, to run once:
pinMode(LED,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(LED,analogRead(POT)/4);
}
Motobomba
#define BOMBA 3 // PIN 3 as PUMP
const int POT = A0; //Potenciometro
void setup() {
// put your setup code here, to run once:
pinMode(BOMBA,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(BOMBA,analogRead(POT)/4);
}
No hay comentarios:
Publicar un comentario