Señal PWM Con Arduino y Analogwrite
Señal PWM Con Arduino y Analogwrite
Usted está aquí: Inicio / Blog / Arduino / Señal PWM con Arduino y analogWrite
Gracias a las señales PWM con Arduino y a la función analogWrite, es muy sencillo poder controlar el voltaje que sale de un pin. Son
las llamadas salidas analógicas.
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.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 1/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Las señales PWM con Arduino son muy fáciles de utilizar gracias a la función analogWrite(). En este Gestionar consentimiento
tutorial aprenderás todo lo
necesario para poder utilizar señales PWM con Arduino.
Y no sólo es exclusivo de Arduino, también otros microcontroladores o SoC como el ESP8266, tienen salidas PWM.
Indice de contenidos
Imagínate que estás en un cruce de carreteras y otro vehículo te deja pasar. Como buen paisano que eres le das las gracias levantando
la mano. Eso es una señal, por ejemplo.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 2/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Hacerle una peineta a otro conductor también es una señal. Que tu perro mueva el rabo porque quiere que le des de comer es otra
señal.
Por lo tanto, una señal sirve para avisar de algo. Ya sea para dar las gracias, para insultar o para pedir de comer. Su objetivo es
transmitir información.
Una señal eléctrica hace lo mismo, transmitir información. Sin embargo, no lo hace a través de gestos, miradas o moviendo el rabo.
Lo hace a través de la electricidad. De ahí su nombre: señal eléctrica.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 3/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Las señales eléctricas varían con el tiempo, es decir, ahora mismo puede tener un valor pero hace 1 segundo tenía otro valor
diferente. Piensa en un niño pequeño. Cuando tiene 3 años mide 60 cm y con 8 mide 1,20 m. Algo parecido sucede con las señales
eléctricas.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 4/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
La diferencia es que en las señales eléctricas no varía su tamaño sino su voltaje o su corriente. Esas variaciones usualmente son
utilizadas para transportar información de un sistema a otro.
Dependiendo de cómo varían con el tiempo, se pueden clasificar en dos grandes grupos.
Todas estas señales tienen algo en común: tienen posibilidades infinitas. Eso es precisamente lo que identifica a una señal como
analógica, la posibilidad de tener infinitos valores.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 5/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Esto mismo sucede con algunas señales eléctricas. Por ejemplo, en los enchufes de una casa hay un voltaje de 220 voltios de
corriente alterna (o 120 voltios, en dependencia de donde vivas). Eso significa que el voltaje varía entre 220 V y -220 V tal como se
muestra en la siguiente figura.
El eje X representa el tiempo y el eje Y los valores de voltajes que va tomando la señal.
Ten en cuenta que aunque la señal está limitada por un valor máximo y uno mínimo, entre medias puede haber valores infinitos. Lo
mismo puede tener 70.3 V, 70.354 V que 70.3542 V. Puede tener tantos valores como números existen en ese rango.
Esto mismo ocurre con otras magnitudes físicas como la luz, la humedad o la temperatura.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 6/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
La temperatura de una habitación de tu casa no cambia de 23ºC a 24ºC. Primero tendrá 23,2345ºC, luego 23,2346 y así hasta llegar a
24ºC.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 7/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Ojo, que estos cambios pueden ser lentos como la temperatura, o rápidos como el giro de los neumáticos en un Fórmula 1.
Puedes pensar en el interruptor de la luz en tu cuarto, que solo puede tomar dos valores o estados: abierto o cerrado.
Por otra parte, imagina la palanca de cambios de un coche. Puede tener varias posiciones: reversa, punto muerto y 1ra, 2da, 3ra, etc.
Son varios estados, pero es una cantidad finita, no puedes poner la palanca en la posición 1.7 o 3.5.
Cuando oigo señal digital me vienen siempre a la mente los pines digitales de un Arduino o una placa basada en ESP8266. Y es que
precisamente, las señales que generamos con estos pines son digitales.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 9/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Es más, podemos afirmar que son digitales y binarias, ya que solo pueden tener dos estados:
Pero todas las señales digitales no son así. Recuerda que una señal digital puede tener más de dos estados posibles.
Lo que sí que comparten todas las señales digitales es que los posibles estados son finitos y están bien definidos.
Aclarado qué es una señal y qué son las señales analógicas y digitales, veamos algunas características importantes de las señales.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 10/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Señales periódicas
Una señal periódica es una señal que se repite a una frecuencia y a intervalos determinados.
Por ejemplo, piensa en un periódico de prensa. Su nombre se debe, precisamente, a esta característica. Todos los días tienes un nuevo
periódico en el quiosco de la esquina. Es algo que ocurre con frecuencia a intervalos determinados.
Puede ser cualquier evento como un semáforo. La luz verde se enciende cada 45 segundos. El churrero que todos los domingos se
pone en la esquina de mi barrio o el email diario que Luis envía todos los días contando alguna anécdota relacionada con Arduino.
Por supuesto, este comportamiento también lo encontramos en las señales eléctricas. Un ejemplo claro de señal periódica, es el voltaje
del enchufe en una casa, como vimos anteriormente.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 11/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Como puedes observar, la señal no es más que una repetición periódica de la sección marcada en rojo.
Pero este fenómeno no solo ocurre con señales analógicas. También ocurre con las señales digitales. En la siguiente imagen puedes
ver un ejemplo de señal digital periódica.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 12/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Es una señal digital ternaria, es decir que solo puede tener tres posibles estados. En este caso esos estados son: -5V, 0V y 5V. Al
igual que en el caso anterior, la forma de onda se repite continuamente.
El tiempo que transcurre entre una repetición y la siguiente se denomina periodo de la señal y se expresa en segundos.
Normalmente lo encontrarás con la letra T.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 13/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Otra forma de expresar la repetitividad de una señal es mediante la frecuencia. Esta se define como la cantidad de veces por
segundo que se repite la señal, se expresa en hercios (Hz) y se calcula como el inverso del periodo:
Donde:
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 14/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
f = es la frecuencia
T = es el periodo.
Una señal con un periodo de 1 ms tiene una frecuencia de 1 kHz o 1.000 Hz lo que nos viene a decir que la señal se repite 1.000 veces
por segundo.
Si fuera de 1 Hz ¿cuántas veces se repetiría por segundo? Efectivamente, 1 vez por segundo.
Veamos un ejemplo de señal periódica muy simple pero muy útil, después sabrás porqué.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 15/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
La imagen muestra una señal digital conocida como tren de pulsos cuadrados. 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.
¿Cuál es el periodo en el tren de pulsos cuadrados? Partimos de un punto A cuando la señal comienza el estado bajo (LOW) y
llegamos a un punto B donde la señal finaliza el estado alto (HIGH). El tiempo transcurrido entre A y B es el periodo de la señal.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 16/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
El periodo de la señal es de 1 μs, lo que equivale a una frecuencia de 1 MHz, o lo que es igual que los pulsos se repiten 1 millón
(1.000.000 Hz) veces por segundo.
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.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 17/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
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:
Pueden utilizarse para controlar un servomotor mediante señales pulsantes con diferentes tiempos en alto.
Sirven para emular una salida analógica.
Es muy empleada en algunas fuentes de alimentación en la etapa de regulación.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 18/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 19/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
En la señal anterior se cumple: T = TON + TOFF. Es lógico, el tiempo total (T) es igual al tiempo que está en estado alto (TON) más el
tiempo que está en estado bajo (TOFF)
El ciclo de trabajo o duty cycle de la señal es uno de los conceptos más importantes de una señal PWM. Este 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):
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.
Por ejemplo, un ciclo de trabajo igual a 50% quiere decir que la señal está la mitad del tiempo en estado alto y la otra mitad en estado
bajo. Si es al 25% estará el 25% del tiempo en estado alto y el 75% en estado bajo.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 20/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
El ciclo de trabajo permite controlar el voltaje promedio de la señal es decir, variar el voltaje de salida. Podrías cambiar el voltaje de
salida de 5V a 3,75V por ejemplo. Este parámetro es fundamental cuando la señal PWM se emplea como conversor digital-analógico.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 21/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Donde:
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 22/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Como en las placas Arduino el voltaje en estado bajo es normalmente 0V, la expresión se simplifica de la siguiente manera:
Donde:
VCC es el voltaje que manejan los pines digitales de la placa. 5V para Arduino UNO, Arduino MEGA, Arduino Nano, etc… y
3,3V para placas cómo Wemos, NodeMCU, etc…
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()
Según la documentación técnica de Arduino, esta función permite generar señales PWM con Arduino en todos los pines marcados
con el símbolo ~. Es la línea curva que se pone encima de la ñ.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 23/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
No todas las placas de Arduino y ESP8266 utilizan los mismos pines PWM. En la siguiente tabla te dejo la relación de los pines que
puedes utilizar con la función analogWrite() en algunas placas de Arduino y ESP8266. También puedes ver la frecuencia que utiliza
cada pin.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 24/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Leonardo, Micro, Yún 3, 5, 6, 9, 10, 11, 13 490 Hz (pines 3 y 11: 980 Hz)
Si tu placa no aparece en la anterior tabla, ponte en contacto con el vendedor o fabricante para que te remita a la
documentación técnica.
Para generar una señal PWM con Arduino utilizando la función analogWrite(), el procesador emplea un recurso llamado
temporizador o contador de 8 bits (en inglés timer o counter), un comparador y un valor que representa el ciclo útil de la señal a
generar.
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 alcanza ese
valor regresa a 0 para recomenzar el ciclo. Se incrementa hasta 255, ya que este es el máximo valor que se puede obtener con 8 bits.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 25/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Al tratarse de una señal digital, los valores son discretos: 0, 1, 2, 3, …, 253, 254, 255. En realidad sería uan especie de escalera
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 26/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
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.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 27/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
El valor que utiliza el comparador para determinar el ciclo útil no se expresa en tanto por ciento. En su lugar se expresa como un
número entre 0 y 255 porque este es el valor máximo que puede alcanzar el contador (recuerda que es de 8 bits).
Para generar la señal PWM con Arduino, el comparador mantiene su salida en estado alto (HIGH) mientras el valor del temporizador
sea menor que el del ciclo útil. Una vez el valor del contador supera el valor del ciclo útil, la salida pasa a estado bajo (LOW).
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%.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 28/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Este proceso se repite infinitamente hasta que el comparador sea desactivado o el temporizador detenido.
Todo este proceso lo realiza el microcontrolador por sí solo cuando utilizamos la función analogWrite().
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 29/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
analogWrite(pin, valor)
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).
El segundo parámetro, ciclo de trabajo, puede tomar valores entre 0 y 255. Eso significa que si pasas a la función 0, obtendrás 0V que
equivale a un ciclo de trabajo del 0%. Si pones 178, obtendrás un voltaje promedio de 3,5V que equivale a un ciclo de trabajo del 70%.
La función analogWrite() no tiene ningún vínculo con los pines analógicos de las placas Arduino (A0, A1, etc.)
0 0% 0V
63 25% 1,25 V
76 30% 1,5 V
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 30/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
255 100% 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.
Los ESP8266 por el contrario, tienen una resolución de 10-bit lo que equivale a un rango de valores de 0 a 1023 consiguiendo una
resolución de 3,22 mV sobre un voltaje de 3,3V.
Como todo lo que hemos visto hasta ahora no ha sido más que teoría, vamos a ponerlo en práctica con un ejercicio utilizando una
salida PWM con Arduino.
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.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 31/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
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.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 32/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
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.
De hecho, el brillo que se percibe es equivalente al de alimentar el LED con el voltaje promedio de la señal PWM. Entonces si
utilizamos una señal PWM con Arduino UNO y un ciclo de trabajo del 50% será como si el LED recibiera 2.5 voltios y así lo veremos.
Para comprender esto te propongo analizar un caso muy simple, el ejemplo fade que trae el IDE de Arduino.
1x Placa Arduino (da lo mismo si es Arduino UNO, Arduino MEGA o Arduino Nano)
1x Resistencia (cualquier valor entre 220 Ω y 1 kΩ es válido)
1x LED (cualquier tipo y color te vale)
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 33/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
Si utilizas un Arduino MEGA no necesitas montar ningún circuito ya que el LED integrado en la placa y que está conectado al pin 13
del Arduino MEGA, también es capaz de generar una señal PWM con Arduino.
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 ~.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 34/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
LED: modificando el valor de esta variable establecemos en que pin se ha conectado el LED. Una vez más te recuerdo que tiene
que ser un pin PWM.
fadeAmount: permite establecer en cuantas unidades variará el ciclo de trabajo de la señal PWM con Arduino.
También se declara una variable brightness. Esta variable se utiliza para almacenar el ciclo de trabajo de la señal PWM con Arduino es
decir, que tendrá un valor entre 0 y 255.
En la función setup() simplemente se configura el pin donde está conectado el LED como salida. Esto no es necesario sin embargo, no
es ningún problema hacerlo.
1
2 void setup() {
3 pinMode(led, OUTPUT);
4 }
5
En cada iteración de la función loop() se incrementa o decrementa el valor de la variable brightness. Si este se desborda es decir, si se
hace mayor que 255 o menor que 0, el signo de fadeAmount se invierte. De esa forma si el valor estaba aumentando ahora empieza a
disminuir o viceversa.
1 void loop() {
2 // set the brightness of pin 9:
3 analogWrite(led, brightness);
4
5 // change the brightness for next time through the loop:
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 35/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
6 brightness = brightness + fadeAmount;
7
8 // reverse the direction of the fading at the ends of the fade:
9 if (brightness <= 0 || brightness >= 255) {
10 fadeAmount = -fadeAmount;
11 }
12 // wait for 30 milliseconds to see the dimming effect
13 delay(30);
14 }
Te recomiendo que juegues con los valores de fadeAmount y el delay utilizado en la función loop() para obtener tiempos y resultados
levemente diferentes.
Te advierto que si utilizas un valor de fadeAmount muy grande los cambios de iluminación serán muy bruscos. Por el contrario, si
utilizas un valor pequeño los cambios de iluminación serán muy suaves dando un efecto realmente vistoso.
En cualquier caso, aquí te dejo el código completo para controlar el brillo de un LED utilizando una señal PWM con Arduino.
1 /*
2 Fade
3
4 This example shows how to fade an LED on pin 9 using the analogWrite()
5 function.
6
7 The analogWrite() function uses PWM, so if you want to change the pin you're
8 using, be sure to use another PWM capable pin. On most Arduino, the PWM pins
9 are identified with a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.
10
11 This example code is in the public domain.
12
13 http://www.arduino.cc/en/Tutorial/Fade
14 */
15
16 int led = 13; // the PWM pin the LED is attached to
17 int brightness = 0; // how bright the LED is
18 int fadeAmount = 10; // how many points to fade the LED by
19
20 // the setup routine runs once when you press reset:
21 void setup() {
22 // declare pin 9 to be an output:
23 pinMode(led, OUTPUT);
24 }
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 36/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
25
26 // the loop routine runs over and over again forever:
27 void loop() {
28 // set the brightness of pin 9:
29 analogWrite(led, brightness);
30
31 // change the brightness for next time through the loop:
32 brightness = brightness + fadeAmount;
33
34 // reverse the direction of the fading at the ends of the fade:
35 if (brightness <= 0 || brightness >= 255) {
36 fadeAmount = -fadeAmount;
37 }
38 // wait for 30 milliseconds to see the dimming effect
39 delay(30);
40 }
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.
Dicho esto, no hay una forma sencilla de cambiar la frecuencia de una señal PWM con Arduino.
Los motores de DC tienen una alta inercia. Eso significa que aunque apagues un motor en marcha, tardan un tiempo en detenerse
totalmente. Es el motivo por el cual cuando desconectas un ventilador de la corriente o lo apagas por su control, tarda unos segundos
en detenerse.
Otro dato curioso es que su velocidad de giro depende del voltaje de alimentación del motor.
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.
En los catálogos de motores de DC se suelen especificar los parámetros fundamentales de estos. En la tabla de especificaciones
estándar se destacan los valores máximos de voltaje y velocidad de giro (en revoluciones por minuto r/min).
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 38/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
También se muestran las gráficas que indican cómo varía la velocidad de giro con respecto al voltaje y el torque del motor.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 39/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
A medida que aumenta el voltaje la velocidad aumenta de forma lineal. Ojo, tienes que tener mucho cuidado porque también
aumenta la corriente que circula por el motor.
Eso significa que si somos capaces de controlar el voltaje que aplicamos a un motor podemos controlar su velocidad. Eso convierte
a la señal PWM con Arduino en una herramienta hecha a medida para esta tarea.
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.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 40/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
El problema es que los pines digitales de Arduino solo son capaces de manejar 5 voltios y 40 mA como máximo. Esto es una
limitación a la hora de controlar cargas de potencia.
Sin embargo, ya hablamos de controlar voltajes y corrientes altas utilizando un transistor bipolar o BJT. Precisamente, un transistor y
una señal PWM con Arduino nos permite controlar la velocidad del ventilador de una forma muy sencilla.
* 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.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 41/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 42/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
En esta configuración, el transistor BJT se comporta como un interruptor que es controlado por el pin digital 6 de la placa. Cuando se
pone un estado alto (HIGH), el interruptor se cierra encendiendo el motor. Si pones un estado bajo (LOW) este se abre apagando
el motor.
La resistencia R3 actúa como pull-down para evitar que el pin de control del transistor quede flotante cuando Arduino es reiniciado o
apagado. Es importante que esta resistencia sea mucho mayor que R1, de lo contrario el circuito no funcionará correctamente.
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.
También hay un potenciómetro a la entrada analógica A0 que permite establecer la velocidad del motor. Un mayor voltaje en A0
indica una mayor velocidad.
Vamos a dar funcionalidad a todo esto a través del código que veremos a continuación.
En primer lugar he definido las constantes MOTOR y POT. La primera indica a qué pin se ha conectado el motor, y la segunda el pin del
potenciómetro.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 43/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
También se han declarado las variables raw_pot y duty para almacenar las lecturas analógicas y el ciclo útil de la señal PWM
respectivamente.
1
2 #define MOTOR 6 // pin al que se ha conectado el motor.
3 #define POT A0 // pin al que se ha conectado el potenciometro
4
5 int raw_pot; // almacenar el valor del potenciometro
6
7 int duty; // ciclo util de la PWM
8
En la función setup() se configura el pin del motor como salida y se pone en estado bajo. Esto es para garantizar que el motor esté
apagado antes de la primera lectura analógica.
1 void setup() {
2 // apago el motor poniendo el pin en estado bajo
3 pinMode(MOTOR, OUTPUT);
4 digitalWrite( MOTOR, LOW );
5 }
En la función loop() se implementa el sistema de control que permite variar la velocidad del motor mediante el potenciómetro. Utiliza el
siguiente algoritmo:
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
En el paso 2 se utiliza la función map() para el cambio de rango. Esta función requiere 5 parámetros:
Donde:
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 44/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
1 void loop() {
2 raw_pot = analogRead(POT);
3
4 duty = map(raw_pot, 0, 1023, 0, 255); // mapeo el valor de la lectura al rango 0-255
5
6 analogWrite( MOTOR, duty ); // actualizar ciclo de trabajo
7
8 delay(30);
9 }
1
2 #define MOTOR 6 // pin al que se ha conectado el motor.
3 #define POT A0 // pin al que se ha conectado el potenciometro
4
5 int raw_pot; // almacenar el valor del potenciometro
6
7 int duty; // ciclo util de la PWM
8
9 void setup() {
10 // apago el motor poniendo el pin en estado bajo
11 pinMode(MOTOR, OUTPUT);
12 digitalWrite( MOTOR, LOW );
13
14 }
15
16 void loop() {
17 // put your main code here, to run repeatedly:
18
19 raw_pot = analogRead(POT);
20
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 45/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
21 duty = map(raw_pot, 0, 1023, 0, 255); // mapeo el valor de la lectura al rango 0-255
22
23 analogWrite( MOTOR, duty ); // actualizar ciclo de trabajo
24
25 delay(30);
26 }
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.
Cualquier duda o sugerencia sobre señales PWM con Arduino en los comentarios aquí abajo.
Gracias a Shutterstock por ceder los derechos de algunas imágenes de este artículo.
hace 3 años • 2 comentarios hace 2 años • 4 comentarios hace 3 años • 28 comentarios hace 2 años • 7 comentarios hace 2 años • 2 comentarios
En este artículo te enseño Zigbee es un protocolo Servomotor con Arduino, No tendrá la potencia de Smart TV, teléfonos,
como utilizar un LCD con privativo usado para vincular aprende a controlar los giros servidores de la mismísima iluminación del hogar, o
Arduino paso a paso. … dispositivos … de este tipo de motores. … Alphabet, pero sin duda … simplemente, la luz de tu …
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 46/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
0 Comentarios
1 Acceder
G Sé el primero en comentar...
Nombre
Sé el primero en comentar.
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 47/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 48/49
8/9/24, 6:29 PM Señal PWM con Arduino y analogWrite
[+ info...]
https://programarfacil.com/blog/arduino-blog/pwm-con-arduino-analogico/ 49/49