22- Se帽al PWM en Arduino

Muy a menudo en rob贸tica, es necesario controlar sin problemas alg煤n proceso, ya sea el brillo de un LED, la potencia de un calentador o la velocidad de rotaci贸n de un motor. Es bastante obvio que el control est谩 directamente relacionado con el cambio de voltaje en el receptor: tanto el LED brillar谩 de manera diferente como el motor girar谩 a una velocidad diferente. Pero el problema es que solo un DAC, un convertidor de digital a anal贸gico, puede controlar el voltaje, y nuestro microcontrolador no tiene un DAC incorporado, solo tenemos una se帽al digital, es decir, ya sea encendido o apagado:


Que es PWM.

Se帽ales analogico digitales en Arduino
Se帽ales anal贸gico digitales en Arduino

驴Es posible lograr un control suave de la se帽al digital? 隆Resulta que puedes! Imagine un ventilador funcionando a plena potencia, el voltaje es constante. Imag铆nese ahora que el voltaje se aplica por un segundo, y por un segundo – no, y as铆 contin煤a 芦en un c铆rculo禄. El ventilador comenzar谩 a girar el doble de lento, pero lo m谩s probable es que notemos los momentos de encendido y apagado, especialmente si el ventilador es peque帽o. Un ventilador grande es m谩s inerte y es posible que ni siquiera note los cambios de velocidad en dos segundos. Ahora puede encender el voltaje durante 0,5 segundos y apagarlo durante los 1,5 segundos restantes. El ventilador girar谩 al 25% de la velocidad m谩xima. Acabamos de presentar la llamada se帽al PWM, modulaci贸n de ancho de pulso.

Estructura de las se帽ales pwm en Arduino
Estructura de las se帽ales pwm en Arduino

Tambi茅n funcionar谩 con una bombilla incandescente, porque tiene gran inercia, pero con un LED veremos c贸mo se enciende y se apaga, porque pr谩cticamente no tiene retardo de encendido / apagado. 驴Qu茅 hacer? Es muy simple, sube la frecuencia. En el experimento mental, tuvimos un per铆odo de 2 segundos, que es 0.5 Hz. Ahora imagine una se帽al de este tipo con una frecuencia de, digamos, 1000 Hz. o 25.000 Hz (25 kHz). Ahora el papel lo juega la inercia del ojo, no notar谩 destellos a tal frecuencia, para 茅l solo ser谩 una disminuci贸n en el brillo. 隆El problema esta resuelto!


El Duty Cycle en PWM.

Al cambiar el llamado 芦llenado禄 de la se帽al PWM, es posible cambiar el voltaje 芦total禄 (integrado) durante un per铆odo determinado. Cuanto mayor sea el llenado de PWM, mayor ser谩 el voltaje, pero no m谩s alto que el voltaje m谩ximo 芦PWM禄.

A la relaci贸n entre el tiempo en que la se帽al esta en On y el tiempo que esta en Off se le llama Duty Cycle. Tambi茅n llamado relaci贸n marca-espacio.

Duty cycle en se帽ales PWM
Duty cycle en se帽ales PWM

Con una se帽al PWM, incluso puede modular se帽ales anal贸gicas complejas, como una onda sinusoidal. La siguiente imagen muestra el PWM (abajo) y el mismo PWM despu茅s de los filtros:

Modulaci贸n de onda sinusoidal
Modulaci贸n de onda sinusoidal

As铆 funcionan los inversores DC-AC. Volviendo a las propiedades de la se帽al PWM, solo hay dos: la frecuencia (frequency) y la relaci贸n (duty). Pasemos a generar PWM con Arduino.


Generando Pwm en Arduino.

En la lecci贸n sobre funciones temporizaciones, dije que el microcontrolador tiene los llamados contadores que cuentan las 芦ciclos禄 del generador de reloj (cuarzo). Estos contadores generan una se帽al PWM, es decir el n煤cleo computacional del propio microcontrolador no participa en esto. Adem谩s de los c谩lculos, incluso la salida de la se帽al de la pata del Mc descansa sobre los hombros del contador. Esto es muy importante de entender, porque la se帽al PWM no ralentiza la ejecuci贸n del c贸digo, ya que literalmente 鈥渆s otra pieza de hardware鈥 la que est谩 involucrada en su generaci贸n.

En las placas UNO / Nano / Pro Mini, tenemos tres contadores de temporizador, cada temporizador tiene dos salidas a los pines MC, es decir, tenemos 2 * 3 = 6 pines capaces de generar una se帽al PWM. Para la generaci贸n PWM, tenemos una funci贸n lista para usar analogWrite ( pin, duty ).

  • Pin, es un pin del temporizador. Para Nano / Uno, estos son los pines D3, D5, D6, D9, D10, D11. En algunas placas est谩n marcadas * con un asterisco, pero en general, para determinar los pines PWM en cualquier otro modelo de Arduino, basta con mirar el pinout.
  • Duty– Relaci贸n de la se帽al PWM. Por defecto, todas las 芦salidas禄 PWM son de 8 bits, es decir, el duty puede tomar un valor con una 芦resoluci贸n禄 de 8 bits, que es 0-255.

Combinemos este conocimiento con la lecci贸n anterior e intentemos cambiar el brillo del LED conectado a trav茅s de una resistencia al pin D3. Potenci贸metro conectado al pin A0.

void setup() {
  pinMode(3, OUTPUT);  // D3 como salida
}
void loop() {
 // PWM para pin 3 , 1023/4 = 255 
  analogWrite(3, analogRead(0) / 4);
  delay(10);
}

El ejemplo considerado cambia el brillo del LED dependiendo de la posici贸n del eje del potenci贸metro.

Algunas palabras sobre la se帽al PWM 鈥渆st谩ndar鈥: la obtenemos con la configuraci贸n que nos brinda la biblioteca Arduino.h, y esta configuraci贸n se subestima en gran medida en comparaci贸n con las capacidades de Arduino. Hablaremos de 芦mejorar禄 PWM m谩s adelante, pero ahora echemos un vistazo a las caracter铆sticas de PWM 芦fuera de la caja禄:

TemporizadorPinesFrecuenciaResoluci贸n
Temporizador 0D5 y D6976 Hz8 bits (0-255)
Temporizador 1D9 y D10488 Hz8 bits (0-255)
Temporizador 2D3 y D11488 Hz8 bits (0-255)

Estos son n煤meros mejorables, especialmente en t茅rminos de frecuencia. Todos los temporizadores son de talla 煤nica, para que el usuario no piense y no estudie documentaci贸n innecesaria. Volveremos a cambiar la frecuencia y el ancho del PWM en una lecci贸n separada.


Deja un comentario