- Ce este PWM (Pulse with Modulation)?
- PWM în STM32
- Componente necesare
- Detalii PIN ale STM32
- Diagrama circuitului și conexiunile
- Programare STM32
În articolul anterior am văzut despre conversia ADC folosind STM32. În acest tutorial, vom afla despre PWM (Pulse Width Modulation) în STM32 și cum putem controla luminozitatea LED-ului sau viteza ventilatorului DC folosind tehnica PWM.
Știm că există două tipuri de semnal: analog și digital. Semnalele analogice au tensiuni precum (3V, 1V… etc), iar semnalele digitale au (1 'și 0). Ieșirile senzorilor sunt de semnale analogice și aceste semnale analogice sunt convertite în digitale folosind ADC, deoarece microcontrolerele înțeleg doar digitalul. După procesarea acelor valori ADC, din nou ieșirea trebuie convertită în formă analogică pentru a conduce dispozitivele analogice. Pentru aceasta folosim anumite metode, cum ar fi convertoarele PWM, convertorul digital la analog (DAC) etc.
Ce este PWM (Pulse with Modulation)?
PWM este o modalitate de a controla dispozitivele analogice utilizând valoarea digitală, cum ar fi controlul vitezei motorului, luminozitatea unui led etc. Știm că motorul și ledul funcționează pe semnal analogic. Dar PWM nu oferă ieșire analogică pură, PWM arată ca un semnal analogic realizat de impulsuri scurte, care este furnizat de ciclul de funcționare.
Ciclul de funcționare al PWM
Procentul de timp în care semnalul PWM rămâne HIGH (la timp) este numit ciclu de funcționare. Dacă semnalul este întotdeauna PORNIT, este în ciclu de funcționare 100% și dacă este întotdeauna oprit, este ciclu de funcționare de 0%.
Ciclul de funcționare = Timp de pornire / (Timp de pornire + Timp de oprire)
PWM în STM32
STM32F103C8 are 15 pini PWM și 10 pini ADC. Există 7 temporizatoare și fiecare ieșire PWM este furnizată de un canal conectat la 4 temporizatoare. Are o rezoluție PWM pe 16 biți (2 16), adică contoare și variabilele pot fi la fel de mari ca 65535. Cu o rată de ceas de 72 MHz, o ieșire PWM poate avea o perioadă maximă de aproximativ o milisecundă.
- Deci, valoarea 65535 oferă LUMINOSITATE COMPLETĂ a LED-ului ȘI VITEZĂ COMPLETĂ a ventilatorului de curent continuu (ciclu de funcționare 100%)
- De asemenea, valoarea 32767 oferă JUMATATE LUMINOSITATE LED și JUMATATE VITEZĂ ventilator DC (50% ciclu de funcționare)
- Și valoarea de 13107 oferă (20%) LUMINOSITATE ȘI (20%) VITEZĂ (20% Ciclul de funcționare)
În acest tutorial, folosim potențiometrul și STM32 pentru a varia luminozitatea LED-ului și viteza unui ventilator DC prin tehnica PWM. Un ecran LCD de 16x2 este utilizat pentru a afișa valoarea ADC (0-4095) și variabila modificată (valoarea PWM) care este afișată (0-65535).
Iată câteva exemple PWM cu alt microcontroler:
- Generarea PWM utilizând microcontrolerul PIC cu MPLAB și XC8
- Servomotor Control cu Raspberry Pi
- Dimmer cu LED bazat pe Arduino folosind PWM
- Modulația lățimii impulsurilor (PWM) utilizând MSP430G2
Verificați aici toate proiectele legate de PWM.
Componente necesare
- STM32F103C8
- Ventilator DC
- IC driver driver ULN2003
- LED (ROȘU)
- LCD (16x2)
- Potențiometru
- Breadboard
- Baterie 9V
- Sârme jumper
Ventilator de curent continuu: ventilatorul de curent continuu utilizat aici este un ventilator BLDC de pe un PC vechi. Este nevoie de o sursă externă, astfel că folosim o baterie de 9V c.c.
ULN2003 IC driver motor: Este folosit pentru a acționa motorul într-o singură direcție, deoarece motorul este unidirecțional și, de asemenea, este necesară alimentarea externă pentru ventilator. Aflați mai multe despre circuitul driverului de motor bazat pe ULN2003 aici. Mai jos este diagrama pic a ULN2003:
Pinii (IN1 la IN7) sunt pinii de intrare și (OUT 1 la OUT 7) sunt pinii de ieșire corespunzători. COM este dat la tensiunea sursei pozitive necesare pentru dispozitivele de ieșire.
LED: se folosește led colorat ROȘU care emite lumină ROȘIE. Orice culori pot fi folosite.
Potențiometre: se utilizează două potențiometre, unul este pentru divizorul de tensiune pentru intrarea analogică la ADC și altul este pentru controlul luminozității ledului.
Detalii PIN ale STM32
După cum putem vedea, pinii PWM sunt indicați în format de undă (~), există 15 astfel de pini, pinii ADC sunt reprezentați în culoare verde, există 10 pini ADC care sunt folosiți pentru intrările analogice.
Diagrama circuitului și conexiunile
Conexiunile STM32 cu diferite componente sunt explicate după cum urmează:
STM32 cu intrare analogică (ADC)
Potențiometrul prezent în partea stângă a circuitului este utilizat ca regulator de tensiune care reglează tensiunea de la pinul de 3,3V. Ieșirea din potențiometru, adică pinul central al potențiometrului, este conectată la pinul ADC (PA4) al STM32.
STM32 cu LED
Pinul de ieșire STM32 PWM (PA9) este conectat la pinul pozitiv al LED-ului printr-un rezistor de serie și un condensator.
LED cu rezistor și condensator
Un rezistor în serie și un condensator în paralel sunt conectați cu LED pentru a genera unda analogică corectă de la ieșirea PWM, deoarece ieșirea analogică nu este în stare pură atunci când este generată direct de la pinul PWM.
STM32 cu ULN2003 și ULN2003 cu ventilator
Pinul de ieșire STM32 PWM (PA8) este conectat la pinul de intrare (IN1) al ULN2003 IC și pinul de ieșire corespunzător (OUT1) al ULN2003 este conectat la firul negativ al DC FAN.
Pinul pozitiv al ventilatorului DC este conectat la pinul COM al ULN2003 IC, iar bateria externă (9V DC) este, de asemenea, conectată la același pin COM al IC ULN2003. Pinul GND al ULN2003 este conectat la pinul GND al STM32 și negativul bateriei este conectat la același pin GND.
STM32 cu LCD (16x2)
Pin LCD nr |
Numele pinului LCD |
Numele pinului STM32 |
1 |
Teren (Gnd) |
Teren (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin din Centrul Potențiometrului |
4 |
Selectare înregistrare (RS) |
PB11 |
5 |
Citire / Scriere (RW) |
Teren (G) |
6 |
Activați (EN) |
PB10 |
7 |
Bit de date 0 (DB0) |
Fără conexiune (NC) |
8 |
Bit de date 1 (DB1) |
Fără conexiune (NC) |
9 |
Bit de date 2 (DB2) |
Fără conexiune (NC) |
10 |
Bit de date 3 (DB3) |
Fără conexiune (NC) |
11 |
Bit de date 4 (DB4) |
PB0 |
12 |
Bit de date 5 (DB5) |
PB1 |
13 |
Bit de date 6 (DB6) |
PC13 |
14 |
Bit de date 7 (DB7) |
PC14 |
15 |
LED pozitiv |
5V |
16 |
LED negativ |
Teren (G) |
Un potențiometru din partea dreaptă este utilizat pentru a controla contrastul afișajului LCD. Tabelul de mai sus arată conexiunea dintre LCD și STM32.
Programare STM32
La fel ca tutorialul anterior, am programat STM32F103C8 cu Arduino IDE prin port USB fără a folosi programator FTDI. Pentru a afla despre programarea STM32 cu Arduino IDE, urmați linkul. Putem continua programarea ca în Arduino. Codul complet este dat la sfârșit.
În această codificare vom lua o valoare analogică de intrare de la pinul ADC (PA4) care este conectat la pinul central al potențiometrului stâng și apoi vom converti valoarea analogică (0-3,3V) în format digital sau întreg (0-4095). Această valoare digitală este furnizată în continuare ca ieșire PWM pentru a controla luminozitatea și viteza LED-ului ventilatorului DC. Un LCD 16x2 este utilizat pentru a afișa ADC și valoarea mapată (valoarea de ieșire PWM).
Mai întâi trebuie să includem fișierul antet LCD, să declarăm pinii LCD și să le inițializăm folosind codul de mai jos. Aflați mai multe despre interfața LCD cu STM32 aici.
#include
În continuare, declarați și definiți numele pinului folosind pinul STM32
const int analoginput = PA4; // Intrare din potențiometru const int led = PA9; // ieșire LED const int ventilator = PA8; // ieșire ventilator
Acum, în interiorul setării () , trebuie să afișăm câteva mesaje și să le ștergem după câteva secunde și să specificăm pinul INPUT și pinii de ieșire PWM
lcd.inceput (16,2); // Pregătirea ecranului LCD lcd.clear (); // Șterge LCD lcd.setCursor (0,0); // Setează cursorul la rândul0 și coloana0 lcd.print ("CIRCUIT DIGEST"); // Afișează Circuit Digest lcd.setCursor (0,1); // Setează cursorul la coloana0 și rândul1 lcd.print ("PWM USING STM32"); // Afișează PWM folosind întârziere STM32 (2000); // Timp de întârziere lcd.clear (); // Șterge LCD pinMode (analoginput, INPUT); // setați modul pin intrare analogică ca INPUT pinMode (led, PWM); // setați modul pin condus ca ieșire PWM pinMode (ventilator, PWM); // setați ventilatorul mod pin ca ieșire PWM
Pinul de intrare analogică (PA4) este setat ca INPUT prin pinMode (analoginput, INPUT), pinul LED este setat ca ieșire PWM prin pinMode (led, PWM) și pinul ventilatorului este setat ca ieșire PWM prin pinMode (ventilator, PWM) . Aici pinii de ieșire PWM sunt conectați la LED (PA9) și ventilator (PA8).
Apoi în funcția de buclă nulă () , citim semnalul analogic de la pinul ADC (PA4) și îl stocăm într-o variabilă întreagă care convertește tensiunea analogică în valori întregi digitale (0-4095) folosind codul de mai jos int valueadc = analogRead (analoginput);
Un lucru important de remarcat aici este pinii PWM, adică canalele STM32 are o rezoluție de 16 biți (0-65535), deci trebuie să o mapăm cu valori analogice folosind funcția de hartă, ca mai jos.
int result = hartă (valueadc, 0, 4095, 0, 65535).
Dacă maparea nu este utilizată, nu vom obține viteza maximă a ventilatorului sau luminozitatea maximă a LED-ului prin modificarea potențiometrului.
Apoi scriem ieșirea PWM pe LED folosind pwmWrite (led, rezultat) și ieșirea PWM la ventilator utilizând funcțiile pwmWrite (ventilator, rezultat ).
În cele din urmă, afișăm valoarea de intrare analogică (valoarea ADC) și valorile de ieșire (valorile PWM) pe afișajul LCD utilizând următoarele comenzi
lcd.setCursor (0,0); // Setează cursorul la rândul0 și coloana0 lcd.print ("valoare ADC ="); // tipărește cuvintele „” lcd.print (valueadc); // afișează valueadc lcd.setCursor (0,1); // Setează cursorul la coloana0 și rândul1 lcd.print ("Ieșire ="); // imprimă cuvintele în "" lcd.print (rezultat); // afișează rezultatul valorii
Codul complet cu un videoclip demonstrativ este prezentat mai jos.