Documentos de Académico
Documentos de Profesional
Documentos de Cultura
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/
Las salidas PWM con Arduino son muy útiles, por ejemplo, si quieres controlar la
velocidad de un motor eléctrico, controlar el brillo de un LED o controlar
un servomotor con Arduino.
Indice de contenidos
1. Qué es una señal PWM
2. Cómo cambiar la frecuencia de una señal PWM con Arduino
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, tal y como se muestra en la imagen siguiente.
Vuelvo a repetir, el periodo y la frecuencia son constantes. Lo que varía es el tiempo
que está en estado alto (HIGH) y bajo (LOW).
Esta capacidad de variar el tiempo en estado alto, es lo que realmente hace que
la señal PWM sea tan útil y práctica:
T: periodo de la señal.
tiempo que está en estado alto (T ) más el tiempo que está en estado bajo (T )
ON OFF
Se multiplica por 100 porque se suele expresar en tanto por ciento y representa el
tiempo en el que la señal está en estado alto dentro de un periodo.
Donde:
Como en las placas Arduino el voltaje en estado bajo es normalmente 0V, la expresión
se simplifica de la siguiente manera:
Donde:
Es importante que comprendas que aunque el voltaje promedio sea 4.3 V en realidad
lo que ocurre es que el pin está un tiempo en estado alto y otro en estado bajo. Arduino
es incapaz de variar el voltaje de sus pines, siempre van a 5V.
Las placas de Arduino o ESP8266 ya están adaptadas para poder generar una señal
PWM con Arduino de una forma muy sencilla utilizando la función analogWrite()
De esta forma, 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%.
Donde:
pin: es el pin de Arduino por donde queremos sacar la señal. Tiene que estar
marcado con el símbolo ~.
valor: es el ciclo de trabajo. Puede tomar valores entre 0 (apagado 0V) y 255
(encendido 5V).
Es importante notar que al solo poder establecer valores entre 0 y 255, la resolución
que se obtiene es de 19.6 mV. Eso significa que la mínima variación de voltaje que
podemos lograr con una señal PWM con Arduino es de 19.6 milivoltios.
Esta resolución es más que suficiente para la mayoría de los proyectos. Sin embargo,
puede ser un limitante para proyectos muy exquisitos que requieran una alta precisión.
Cuando utilizamos una señal PWM con Arduino para este fin, el LED se enciende
durante el ciclo de trabajo y se apaga durante el resto del periodo. Vamos, que cuando
la señal está en HIGH el LED está encendido y cuando está en LOW se apaga.
Esto sucede a mucha velocidad. La frecuencia de una señal PWM con Arduino es de
490 Hz (980 Hz si utilizas los pines 5 y 6) lo que viene a decir que se encenderá y
apagará 490 veces en un segundo.
El ojo humano es incapaz de detectar estos cambios tan rápidos. El efecto percibido es
que el LED brilla con menor intensidad aunque en realidad se está apagando y
encendiendo muy rápido.
Al variar el ciclo de trabajo (el tiempo que se mantiene en estado HIGH), se percibe
con un aumento o disminución del brillo del LED.
Es importante conectar el LED a un pin que sea capaz de generar una señal PWM.
Recuerda que son los que están marcados con el símbolo ~.
void loop() {
// set the brightness of pin 9:
analogWrite(led, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
En cualquier caso, aquí te dejo el código completo para controlar el brillo de un LED
utilizando una señal PWM con Arduino.
/*
Fade
This example shows how to fade an LED on pin 9 using the analogWrite()
function.
The analogWrite() function uses PWM, so if you want to change the pin you're
using, be sure to use another PWM capable pin. On most Arduino, the PWM pins
are identified with a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/Fade
*/
int led = 13; // the PWM pin the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 10; // how many points to fade the LED by
// the setup routine runs once when you press reset:
void setup() {
// declare pin 9 to be an output:
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
// set the brightness of pin 9:
analogWrite(led, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
Cómo cambiar la frecuencia de una señal PWM
con Arduino
Una pregunta que suele llegar de los oyentes, seguidores y alumnos es ¿se puede
cambiar la frecuencia de una señal PWM con Arduino?
Es importante que tengas presente que no existe una función que nos permita
modificar la frecuencia de la señal PWM con Arduino. No digo que sea imposible,
simplemente que no es simple.
¿Recuerdas que te comenté que para generar las señales PWM con Arduino el
procesador utiliza un temporizador? Pues resulta que es posible cambiar la velocidad
a la que este se incrementa provocando que la frecuencia de la señal PWM se
altere.
El problema con esta solución es que estos temporizadores son empleados por otras
funciones dentro del core de Arduino. Por lo tanto, si modificas su comportamiento
puede que algunas funciones dejen de funcionar correctamente.
Por ejemplo, un ventilador de ordenador debe alimentarse con 12 voltios sin embargo,
si lo alimentas con 5 voltios también gira pero más lento.
Este tipo de control es muy común en los ordenadores, donde la velocidad de los
ventiladores depende de la temperatura de los periféricos. Así, por ejemplo, cuando el
disco duro o el procesador se calienta el ventilador gira a mayor velocidad para
refrescar el equipo.
* Puedes utilizar cualquier placa Arduino ya sea UNO, Nano e incluso un ESP8266.
** Las resistencias tienen que tener una razón de 100 entre ellas.
*** La fuente de alimentación es para alimentar el motor y debe coincidir con el voltaje
nominal del motor.
Esto se debe a que parte de la corriente que activa el transistor se drena por la
resistencia R3 y este no se activa totalmente. En este caso yo he usado un factor de
100.
Vamos a dar funcionalidad a todo esto a través del código que veremos a continuación.
1. Leer potenciómetro
2. Cambiar de rango de 0-1023 (entrada analógica) a 0-255 (salida PWM)
3. Cambiar ciclo de trabajo señal PWM
}
void loop() {
// put your main code here, to run repeatedly:
raw_pot = analogRead(POT);
duty = map(raw_pot, 0, 1023, 0, 255); // mapeo el valor de la lectura al rango 0-
255
analogWrite( MOTOR, duty ); // actualizar ciclo de trabajo
delay(30);
}
Ahora carga el código y podrás controlar el motor a través del potenciómetro gracias a
una señal PWM con Arduino. Sería relativamente sencillo utilizar un sensor como
el DS18B20 para que, según la temperatura, varíe la velocidad del motor.