- ¿Qué es PWM (pulso con modulación)?
- PWM en STM32
- Componentes requeridos
- Detalles de pin de STM32
- Diagrama de circuito y conexiones
- Programación STM32
En el artículo anterior, vimos acerca de la conversión de ADC usando STM32. En este tutorial, aprenderemos sobre PWM (Modulación de ancho de pulso) en STM32 y cómo podemos controlar el brillo del LED o la velocidad del ventilador de CC utilizando la técnica PWM.
Sabemos que hay dos tipos de señal: Analógica y Digital. Las señales analógicas tienen voltajes como (3V, 1V… etc) y las señales digitales tienen (1 'y 0's). Las salidas de los sensores son de señales analógicas y estas señales analógicas se convierten en digitales mediante ADC, porque los microcontroladores solo entienden lo digital. Después de procesar esos valores de ADC, nuevamente la salida debe convertirse en forma analógica para controlar los dispositivos analógicos. Para eso utilizamos ciertos métodos como PWM, convertidores de digital a analógico (DAC), etc.
¿Qué es PWM (pulso con modulación)?
PWM es una forma de controlar los dispositivos analógicos utilizando valores digitales como controlar la velocidad del motor, el brillo de un led, etc. Sabemos que el motor y el led funcionan con señal analógica. Pero el PWM no proporciona una salida analógica pura, el PWM parece una señal analógica hecha por pulsos cortos, que es proporcionada por ciclo de trabajo.
Ciclo de trabajo del PWM
El porcentaje de tiempo en el que la señal PWM permanece ALTA (a tiempo) se denomina ciclo de trabajo. Si la señal está siempre encendida, está en un ciclo de trabajo del 100% y si siempre está apagada, es un ciclo de trabajo del 0%.
Ciclo de trabajo = tiempo de encendido / (tiempo de encendido + tiempo de apagado)
PWM en STM32
STM32F103C8 tiene 15 pines PWM y 10 pines ADC. Hay 7 temporizadores y cada salida PWM es proporcionada por un canal conectado a 4 temporizadores. Tiene una resolución PWM de 16 bits (2 16), es decir, los contadores y las variables pueden ser tan grandes como 65535. Con una frecuencia de reloj de 72 MHz, una salida PWM puede tener un período máximo de aproximadamente un milisegundo.
- Por lo tanto, el valor de 65535 proporciona BRILLO COMPLETO del LED Y VELOCIDAD COMPLETA del ventilador de CC (ciclo de trabajo del 100%)
- Asimismo, el valor de 32767 da MEDIO BRILLO del LED Y MEDIA VELOCIDAD del ventilador de CC (50% del ciclo de trabajo)
- Y el valor de 13107 da (20%) BRILLO Y (20%) VELOCIDAD (20% de ciclo de trabajo)
En este tutorial, usamos potenciómetro y STM32 para variar el brillo del LED y la velocidad de un ventilador de CC mediante la técnica PWM. Se utiliza una pantalla LCD de 16x2 para mostrar el valor ADC (0-4095) y la variable modificada (valor PWM) que se emite (0-65535).
Aquí hay algunos ejemplos de PWM con otro microcontrolador:
- Generando PWM usando el microcontrolador PIC con MPLAB y XC8
- Control de servomotor con Raspberry Pi
- Atenuador LED basado en Arduino usando PWM
- Modulación de ancho de pulso (PWM) usando MSP430G2
Consulta todos los proyectos relacionados con PWM aquí.
Componentes requeridos
- STM32F103C8
- Ventilador DC
- IC del controlador de motor ULN2003
- LED (ROJO)
- LCD (16x2)
- Potenciómetro
- Tablero de circuitos
- Batería 9V
- Cables de puente
Ventilador de CC: El ventilador de CC que se usa aquí es un ventilador BLDC de una PC vieja. Requiere un suministro externo, por lo que estamos usando una batería de 9 V CC.
ULN2003 Motor Driver IC: se utiliza para impulsar el motor en una dirección, ya que el motor es unidireccional y también se requiere alimentación externa para el ventilador. Obtenga más información sobre el circuito de controlador de motor basado en ULN2003 aquí. A continuación se muestra el diagrama de imagen de ULN2003:
Los pines (IN1 a IN7) son pines de entrada y (OUT 1 a OUT 7) son pines de salida correspondientes. COM recibe voltaje de fuente positivo requerido para dispositivos de salida.
LED: Se utiliza un LED de color ROJO que emite luz ROJA. Se puede utilizar cualquier color.
Potenciómetros: Se utilizan dos potenciómetros, uno para el divisor de voltaje para la entrada analógica al ADC y otro para controlar el brillo del led.
Detalles de pin de STM32
Como podemos ver, los pines PWM están indicados en formato de onda (~), hay 15 pines de este tipo, los pines ADC están representados en color verde, hay 10 pines ADC que se utilizan para entradas analógicas.
Diagrama de circuito y conexiones
Las conexiones de STM32 con varios componentes se explican a continuación:
STM32 con entrada analógica (ADC)
El potenciómetro presente en el lado izquierdo del circuito se usa como regulador de voltaje que regula el voltaje del pin de 3.3V. La salida del potenciómetro, es decir, el pin central del potenciómetro, se conecta al pin ADC (PA4) de STM32.
STM32 con LED
El pin de salida STM32 PWM (PA9) está conectado al pin positivo del LED a través de una resistencia en serie y un condensador.
LED con resistencia y condensador
Una resistencia en serie y un condensador en paralelo están conectados con LED para generar una onda analógica correcta desde la salida PWM, ya que la salida analógica no es pura cuando se genera directamente desde el pin PWM.
STM32 con ULN2003 y ULN2003 con ventilador
El pin de salida STM32 PWM (PA8) está conectado al pin de entrada (IN1) de ULN2003 IC y el pin de salida correspondiente (OUT1) de ULN2003 está conectado al cable negativo del DC FAN.
El pin positivo del ventilador de CC está conectado al pin COM del ULN2003 IC y la batería externa (9V CC) también está conectada al mismo pin COM del ULN2003 IC. El pin GND de ULN2003 está conectado al pin GND de STM32 y el negativo de la batería está conectado al mismo pin GND.
STM32 con LCD (16x2)
Pin LCD No |
Nombre del pin LCD |
Nombre de pin STM32 |
1 |
Tierra (Gnd) |
Tierra (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin del centro del potenciómetro |
4 |
Registro Seleccionar (RS) |
PB11 |
5 |
Lectura / escritura (RW) |
Tierra (G) |
6 |
Habilitar (EN) |
PB10 |
7 |
Bit de datos 0 (DB0) |
Sin conexión (NC) |
8 |
Bit de datos 1 (DB1) |
Sin conexión (NC) |
9 |
Bit de datos 2 (DB2) |
Sin conexión (NC) |
10 |
Bit de datos 3 (DB3) |
Sin conexión (NC) |
11 |
Bit de datos 4 (DB4) |
PB0 |
12 |
Bit de datos 5 (DB5) |
PB1 |
13 |
Bit de datos 6 (DB6) |
PC13 |
14 |
Bit de datos 7 (DB7) |
PC14 |
15 |
LED positivo |
5V |
dieciséis |
LED negativo |
Tierra (G) |
Se usa un potenciómetro en el lado derecho para controlar el contraste de la pantalla LCD. La tabla anterior muestra la conexión entre LCD y STM32.
Programación STM32
Como en el tutorial anterior, programamos el STM32F103C8 con Arduino IDE a través del puerto USB sin usar el programador FTDI. Para aprender a programar STM32 con Arduino IDE, siga el enlace. Podemos continuar programando como en Arduino. El código completo se proporciona al final.
En esta codificación vamos a tomar un valor analógico de entrada del pin ADC (PA4) que está conectado al pin central del potenciómetro izquierdo y luego convertir el valor analógico (0-3.3V) en formato digital o entero (0-4095). Este valor digital se proporciona además como salida PWM para controlar el brillo del LED y la velocidad del ventilador de CC. Se utiliza una pantalla LCD de 16x2 para mostrar el ADC y el valor mapeado (valor de salida PWM).
Primero, debemos incluir el archivo de encabezado de LCD, declarar los pines de LCD e inicializarlos usando el siguiente código. Obtenga más información sobre la interfaz de LCD con STM32 aquí.
#incluir
Luego declare y defina los nombres de los pines usando el pin de STM32
const int entrada analógica = PA4; // Entrada desde potenciómetro const int led = PA9; // Salida LED const int fan = PA8; // salida del ventilador
Ahora, dentro de la configuración () , necesitamos mostrar algunos mensajes y borrarlos después de unos segundos y especificar el pin INPUT y los pines de salida PWM
lcd.begin (16,2); // Preparando LCD lcd.clear (); // Borra la pantalla LCD lcd.setCursor (0,0); // Coloca el cursor en la fila0 y la columna0 lcd.print ("CIRCUIT DIGEST"); // Muestra el resumen de circuitos lcd.setCursor (0,1); // Establece el Cursor en column0 y row1 lcd.print ("PWM USING STM32"); // Muestra PWM usando STM32 delay (2000); // Tiempo de retardo lcd.clear (); // Borra LCD pinMode (entrada analógica, INPUT); // establece la entrada analógica del modo pin como INPUT pinMode (led, PWM); // establece el led de modo pin como salida PWM pinMode (ventilador, PWM); // establece el ventilador en modo pin como salida PWM
El pin de entrada analógica (PA4) se establece como INPUT por pinMode (entrada analógica, INPUT), el pin LED se establece como salida PWM por pinMode (led, PWM) y el pin del ventilador se establece como salida PWM por pinMode (ventilador, PWM) . Aquí los pines de salida PWM están conectados al LED (PA9) y al Ventilador (PA8).
A continuación, en la función void loop () , leemos la señal analógica del pin ADC (PA4) y la almacenamos en una variable entera que convierte el voltaje analógico en valores enteros digitales (0-4095) usando el siguiente código int valueadc = analogRead (analoginput);
Lo importante a tener en cuenta aquí es que los pines PWM que son canales de STM32 tienen una resolución de 16 bits (0-65535), por lo que necesitamos mapear eso con valores analógicos usando la función de mapa como se muestra a continuación.
int resultado = mapa (valoradc, 0, 4095, 0, 65535).
Si no se utiliza el mapeo, no obtendremos la máxima velocidad del ventilador o el brillo total del LED al variar el potenciómetro.
Luego escribimos la salida PWM al LED usando pwmWrite (led, result) y la salida PWM al ventilador usando las funciones pwmWrite (fan, result ).
Finalmente mostramos el valor de entrada analógica (valor ADC) y los valores de salida (valores PWM) en la pantalla LCD usando los siguientes comandos
lcd.setCursor (0,0); // Establece el cursor en row0 y column0 lcd.print ("ADC value ="); // imprime las palabras “” lcd.print (valueadc); // muestra valueadc lcd.setCursor (0,1); // Establece el cursor en column0 y row1 lcd.print ("Output ="); // imprime las palabras en "" lcd.print (resultado); // muestra el resultado del valor
A continuación se proporciona el código completo con un video de demostración.