- Què és PWM (Pulse with Modulation)?
- PWM a STM32
- Components necessaris
- Detalls del pin de STM32
- Diagrama de circuits i connexions
- Programació STM32
A l'article anterior hem vist sobre la conversió ADC mitjançant STM32. En aquest tutorial, aprendrem sobre PWM (Pulse Width Modulation) a STM32 i com podem controlar la brillantor del LED o la velocitat del ventilador de CC mitjançant la tècnica PWM.
Sabem que hi ha dos tipus de senyal: analògic i digital. Els senyals analògics tenen tensions com (3V, 1V… etc) i els senyals digitals (1 'i 0). Les sortides dels sensors són de senyals analògics i aquests senyals analògics es converteixen en digitals mitjançant ADC, perquè els microcontroladors només entenen el digital. Després de processar aquests valors ADC, cal tornar a convertir la sortida en forma analògica per conduir els dispositius analògics. Per a això fem servir certs mètodes com ara convertidors PWM, digitals a analògics (DAC), etc.
Què és PWM (Pulse with Modulation)?
PWM és una manera de controlar els dispositius analògics mitjançant un valor digital, com ara controlar la velocitat del motor, la brillantor d’un led, etc. Sabem que el motor i el led funcionen amb senyal analògic. Però el PWM no proporciona una sortida analògica pura, el PWM sembla un senyal analògic realitzat per polsos curts, que es proporciona mitjançant el cicle de treball.
Cicle de treball del PWM
El percentatge de temps en què el senyal PWM roman ALT (puntual) s’anomena cicle de treball. Si el senyal sempre està activat, està en un 100% de cicle de treball i si sempre està apagat, és un 0% de cicle de treball.
Cicle de treball = Temps d’activació / (Temps d’encès + Temps d’APAGAT)
PWM a STM32
STM32F103C8 té 15 pins PWM i 10 pins ADC. Hi ha 7 temporitzadors i cada sortida PWM és proporcionada per un canal connectat a 4 temporitzadors. Té una resolució PWM de 16 bits (2 16), és a dir, comptadors i les variables poden arribar a ser de 65535. Amb una freqüència de rellotge de 72 MHz, una sortida PWM pot tenir un període màxim d’uns mil·lisegons.
- Per tant, el valor de 65535 proporciona LLUMINOSITAT COMPLETA del LED I VELOCITAT COMPLETA del ventilador de CC (cicle de treball 100%)
- De la mateixa manera, el valor de 32767 proporciona MITJA LLUMINOSITAT DEL LED I MITJA VELOCITAT del ventilador de CC (cicle de treball del 50%)
- I el valor de 13107 dóna (20%) LLUMINOSITAT I (20%) VELOCITAT (20% Cicle de treball)

En aquest tutorial, fem servir potenciòmetre i STM32 per variar la brillantor del LED i la velocitat d’un ventilador de CC segons la tècnica PWM. S'utilitza una pantalla LCD de 16x2 per mostrar el valor ADC (0-4095) i la variable modificada (valor PWM) que es genera (0-65535).
Aquí hi ha alguns exemples de PWM amb altres microcontroladors:
- Generació de PWM mitjançant microcontrolador PIC amb MPLAB i XC8
- Control de servomotor amb Raspberry Pi
- Dimmer LED basat en Arduino mitjançant PWM
- Modulació d'amplada de pols (PWM) mitjançant MSP430G2
Consulteu aquí tots els projectes relacionats amb PWM.
Components necessaris
- STM32F103C8
- Ventilador de CC
- IC del controlador de motor ULN2003
- LED (VERMELL)
- LCD (16x2)
- Potenciòmetre
- Taula de pa
- Bateria de 9V
- Jumper Wires
Ventilador de CC: el ventilador de corrent continu que s’utilitza aquí és un ventilador BLDC d’un PC antic. Requereix un subministrament extern, de manera que estem utilitzant una bateria de 9 V CC.
IC del controlador de motor ULN2003: s'utilitza per conduir el motor en una direcció, ja que el motor és unidireccional i també es necessita alimentació externa per al ventilador. Obteniu més informació sobre el circuit de controlador de motor basat en l'ULN2003 aquí. A continuació es mostra el diagrama d’imatges de l’ULN2003:

Els pins (IN1 a IN7) són pins d'entrada i (OUT 1 a OUT 7) són pins de sortida corresponents. COM es dóna Voltatge de font positiu necessari per als dispositius de sortida.
LED: s’utilitza un led de color VERMELL que emet llum VERMELL. Es pot utilitzar qualsevol color.
Potenciòmetres: s’utilitzen dos potenciòmetres: un és per al divisor de tensió per a entrada analògica a ADC i un altre per controlar la brillantor del led.
Detalls del pin de STM32

Com podem veure, els pins PWM estan indicats en format d'ona (~), hi ha 15 pins, els pins ADC es representen en color verd, hi ha 10 pins ADC que s'utilitzen per a entrades analògiques.
Diagrama de circuits i connexions

Les connexions de STM32 amb diversos components s’expliquen a continuació:
STM32 amb entrada analògica (ADC)
El potenciòmetre present al costat esquerre del circuit s’utilitza com a regulador de tensió que regula la tensió des del pin de 3,3 V. La sortida del potenciòmetre, és a dir, el pin central del potenciòmetre, està connectada al pin ADC (PA4) de STM32.
STM32 amb LED
El pin de sortida STM32 PWM (PA9) està connectat al pin positiu del LED mitjançant una resistència de sèrie i un condensador.
LED amb resistència i condensador
Una resistència en sèrie i un condensador en paral·lel es connecten amb LED per generar una ona analògica correcta a partir de la sortida PWM, ja que la sortida analògica no és pura quan es genera directament des del pin PWM.
STM32 amb ULN2003 i ULN2003 amb ventilador
El pin de sortida STM32 PWM (PA8) està connectat al pin d'entrada (IN1) de l'ULN2003 IC i el corresponent pin de sortida (OUT1) de l'ULN2003 està connectat al cable negatiu del DC FAN.
El pin positiu del ventilador de CC està connectat al pin COM de l'ICL ULN2003 i la bateria externa (9 V CC) també està connectada al mateix pin COM de l'IC ULN2003. El pin GND d'ULN2003 està connectat al pin GND de STM32 i el negatiu de la bateria està connectat al mateix pin GND.
STM32 amb pantalla LCD (16x2)
|
Pin LCD núm |
Nom del pin LCD |
Nom del pin STM32 |
|
1 |
Terra (Gnd) |
Terra (G) |
|
2 |
VCC |
5V |
|
3 |
VEE |
Pin del centre del potenciòmetre |
|
4 |
Selecciona registre (RS) |
PB11 |
|
5 |
Lectura / Escriptura (RW) |
Terra (G) |
|
6 |
Activa (EN) |
PB10 |
|
7 |
Bit de dades 0 (DB0) |
Sense connexió (NC) |
|
8 |
Bit de dades 1 (DB1) |
Sense connexió (NC) |
|
9 |
Bit de dades 2 (DB2) |
Sense connexió (NC) |
|
10 |
Bit de dades 3 (DB3) |
Sense connexió (NC) |
|
11 |
Bit de dades 4 (DB4) |
PB0 |
|
12 |
Bit de dades 5 (DB5) |
PB1 |
|
13 |
Bit de dades 6 (DB6) |
PC13 |
|
14 |
Bit de dades 7 (DB7) |
PC14 |
|
15 |
LED positiu |
5V |
|
16 |
LED negatiu |
Terra (G) |
Per controlar el contrast de la pantalla LCD s’utilitza un potenciòmetre a la part dreta. La taula anterior mostra la connexió entre LCD i STM32.

Programació STM32
Igual que el tutorial anterior, vam programar el STM32F103C8 amb Arduino IDE a través del port USB sense utilitzar el programador FTDI. Per obtenir informació sobre la programació de STM32 amb Arduino IDE, seguiu l'enllaç. Podem continuar programant com a Arduino. Al final es dóna un codi complet.
En aquesta codificació, agafarem un valor analògic d’entrada del pin ADC (PA4) que es connecta al pin central del potenciòmetre esquerre i després convertirem el valor analògic (0-3,3V) en format digital o enter (0-4095). Aquest valor digital també es proporciona com a sortida PWM per controlar la brillantor i la velocitat del LED del ventilador de CC. S'utilitza una pantalla LCD de 16x2 per mostrar ADC i el valor assignat (valor de sortida PWM).
Primer hem d’incloure un fitxer de capçalera LCD, declarar els pins LCD i inicialitzar-los mitjançant el codi següent. Obteniu més informació sobre la interfície de la pantalla LCD amb STM32 aquí.
#incloure
A continuació, declareu i definiu els noms dels pins mitjançant el pin de STM32
const int analoginput = PA4; // Entrada del potenciòmetre const int led = PA9; // Sortida LED const int ventilador = PA8; // sortida del ventilador
Ara dins de la configuració () , hem de mostrar alguns missatges i esborrar-los al cap de pocs segons i especificar el pin INPUT i els pins de sortida PWM
lcd.begin (16,2); // Preparació del LCD lcd.clear (); // Esborra LCD lcd.setCursor (0,0); // Estableix el cursor a la fila0 i a la columna0 lcd.print ("CIRCUIT DIGEST"); // Mostra Circuit Digest lcd.setCursor (0,1); // Estableix el cursor a les columnes 0 i fila1 lcd.print ("PWM USANT STM32"); // Mostra PWM mitjançant STM32 delay (2000); // Temps de retard lcd.clear (); // Esborra LCD pinMode (entrada analògica, INPUT); // estableix el mode d'entrada analògica del mode pin com INPUT pinMode (led, PWM); // estableix el mode de pin dirigit com a sortida pinwode PWM (ventilador, PWM); // estableix el ventilador del mode pin com a sortida PWM
El pin d’entrada analògica (PA4) s’estableix com a INPUT mitjançant pinMode ( entrada analògica , INPUT), el pin LED s’estableix com a sortida PWM mitjançant pinMode (led, PWM) i el pin del ventilador s’estableix com a sortida PWM mitjançant pinMode (ventilador, PWM) . Aquí els pins de sortida PWM estan connectats al LED (PA9) i al ventilador (PA8).
A continuació, en la funció void loop () , llegim el senyal analògic del pin ADC (PA4) i l’emmagatzemem en una variable sencera que converteix el voltatge analògic en valors enters digitals (0-4095) mitjançant el codi següent int valueadc = analogRead (analoginput);
El més important que cal tenir en compte aquí són els pins PWM que són els canals de STM32 amb una resolució de 16 bits (0-65535), de manera que hem de mapar-lo amb valors analògics mitjançant la funció de mapa com a continuació.
int result = mapa (valueadc, 0, 4095, 0, 65535).
Si no s’utilitza el mapatge, no obtindrem la velocitat completa del ventilador ni la brillantor total del LED variant el potenciòmetre.
A continuació, escrivim la sortida PWM al LED mitjançant pwmWrite (led, result) i la sortida PWM al ventilador mitjançant les funcions pwmWrite (ventilador, resultat ).
Finalment, mostrem el valor d’entrada analògica (valor ADC) i els valors de sortida (valors PWM) a la pantalla LCD mitjançant les ordres següents
lcd.setCursor (0,0); // Estableix el cursor a les files0 i columna0 lcd.print ("valor ADC ="); // imprimeix les paraules “” lcd.print (valueadc); // mostra valueadc lcd.setCursor (0,1); // Estableix el cursor a les columnes0 i fila1 lcd.print ("Sortida ="); // imprimeix les paraules a "" lcd.print (resultat); // mostra el resultat del valor
A continuació es mostra el codi complet amb un vídeo de demostració.
