- Kaj je PWM (impulz z modulacijo)?
- PWM v STM32
- Potrebne komponente
- Podrobnosti o zatiču STM32
- Shema vezja in povezave
- Programiranje STM32
V prejšnjem članku smo videli pretvorbo ADC z uporabo STM32. V tej vadnici bomo spoznali PWM (Pulse Width Modulation) v STM32 in kako lahko s PWM tehniko nadzorujemo svetlost LED ali hitrost DC ventilatorja.
Vemo, da obstajata dve vrsti signala: analogni in digitalni. Analogni signali imajo napetosti (3V, 1V… itd.), Digitalni signali pa (1 'in 0). Izhodi senzorjev so analogni in ti analogni signali se pretvorijo v digitalne z uporabo ADC, ker mikrokrmilniki razumejo samo digitalno. Po obdelavi teh vrednosti ADC je treba izhod znova pretvoriti v analogno obliko za pogon analognih naprav. Za to uporabljamo določene metode, kot so PWM, digitalno analogni pretvorniki (DAC) itd.
Kaj je PWM (impulz z modulacijo)?
PWM je način za nadzor analognih naprav z digitalno vrednostjo, kot je nadzor hitrosti motorja, svetlost LED itd. Vemo, da motor in led deluje na analogni signal. Toda PWM ne zagotavlja čisto analognega izhoda, PWM je videti kot analogni signal, ki ga oddajajo kratki impulzi, kar zagotavlja delovni cikel.
Delovni cikel PWM
Odstotek časa, v katerem signal PWM ostane VISOK (pravočasno), se imenuje delovni cikel. Če je signal vedno vklopljen, je v 100% obratovalnem ciklu in če je vedno izklopljen, je 0% obratovalni cikel.
Delovni cikel = čas vklopa / (čas vklopa + čas izklopa)
PWM v STM32
STM32F103C8 ima 15 zatičev PWM in 10 zatičev ADC. Obstaja 7 časovnikov, vsak izhod PWM pa ima kanal, priključen na 4 časovnike. Ima 16-bitno ločljivost PWM (2 16), to pomeni, da so števci in spremenljivke lahko velike tudi do 65535. Z urno frekvenco 72MHz ima lahko izhod PWM največ približno eno milisekundo.
- Torej vrednost 65535 daje POPOLNO SVETLOST LED IN PUNO HITROST enosmernega ventilatorja (100% obratovalni cikel)
- Podobno vrednost 32767 daje POLA SVETLOST LED IN POLA HITROST enosmernega ventilatorja (50% obratovalni cikel)
- In vrednost 13107 daje (20%) SVETLOST IN (20%) HITROST (20% delovnega cikla)
V tej vadnici uporabljamo potenciometer in STM32 za spreminjanje svetlosti LED in hitrosti enosmernega ventilatorja s PWM tehniko. LCD 16x2 se uporablja za prikaz vrednosti ADC (0-4095) in spremenjene spremenljivke (vrednost PWM), ki je izhodna (0-65535).
Tu je nekaj primerov PWM z drugim mikrokrmilnikom:
- Ustvarjanje PWM z uporabo mikrokrmilnika PIC z MPLAB in XC8
- Krmiljenje servo motorja z Raspberry Pi
- LED zatemnilnik na osnovi Arduina z uporabo PWM
- Modulacija širine impulza (PWM) z uporabo MSP430G2
Tukaj preverite vse projekte, povezane s PWM.
Potrebne komponente
- STM32F103C8
- DC ventilator
- ULN2003 IC voznik motorja
- LED (RDEČA)
- LCD (16x2)
- Potenciometer
- Breadboard
- Baterija 9V
- Jumper žice
Ventilator enosmernega toka: Tu je vgrajen enosmerni ventilator BLDC iz starega računalnika. Potrebuje zunanje napajanje, zato uporabljamo 9V enosmerno baterijo.
IC voznika motorja ULN2003: Uporablja se za pogon motorja v eno smer, saj je motor enosmeren, za ventilator pa je potrebna tudi zunanja moč. Več o vezju motornega gonilnika, ki temelji na ULN2003, preberite tukaj. Spodaj je slikovni diagram ULN2003:
Zatiči (IN1 do IN7) so vhodni zatiči, (OUT 1 do OUT 7) pa ustrezni izhodni zatiči. COM dobi pozitivno napetost vira, potrebno za izhodne naprave.
LED: Uporablja se RDEČA barvna led, ki oddaja RDEČO svetlobo. Uporabite lahko poljubne barve.
Potenciometri: Uporabljata se dva potenciometra, eden je za delilnik napetosti za analogni vhod na ADC, drugi pa za nadzor svetlosti LED.
Podrobnosti o zatiču STM32
Kot vidimo, so zatiči PWM označeni v valovnem formatu (~), takšnih zatičev je 15, zatiči ADC so predstavljeni v zeleni barvi, 10 zatičev ADC je uporabljenih za analogne vhode.
Shema vezja in povezave
Povezave STM32 z različnimi komponentami so razložene spodaj:
STM32 z analognim vhodom (ADC)
Potenciometer, ki je prisoten na levi strani vezja, se uporablja kot regulator napetosti, ki uravnava napetost iz 3,3V zatiča. Izhod iz potenciometra, tj. Sredinski zatič potenciometra, je povezan z ADC zatičem (PA4) STM32.
STM32 z LED
Izhodni zatič PWM STM32 (PA9) je povezan s pozitivnim zatičem LED prek serijskega upora in kondenzatorja.
LED z uporom in kondenzatorjem
Upor v zaporedju in vzporedni kondenzator sta povezana z LED, da ustvarijo pravilno analogno valovanje iz izhoda PWM, saj analogni izhod ni čist, če je generiran neposredno iz PWM zatiča.
STM32 z ULN2003 in ULN2003 z ventilatorjem
STM32 PWM izhodni zatič (PA8) je povezan z vhodnim zatičem (IN1) ULN2003 IC, ustrezni izhodni zatič (OUT1) ULN2003 pa je povezan z negativno žico enosmernega ventilatorja.
Pozitivni zatič enosmernega ventilatorja je povezan z zatičem COM na ULN2003 IC, zunanja baterija (9V DC) pa je povezana tudi z istim COM-vtičem na ULN2003 IC. Zatič GND ULN2003 je povezan z zatičem GND STM32, negativ baterije pa je povezan z istim zatičem GND.
STM32 z LCD (16x2)
Številka LCD |
Ime pin LCD |
Ime pin STM32 |
1. |
Tla (Gnd) |
Tla (G) |
2. |
VCC |
5V |
3. |
VEE |
Pin iz središča potenciometra |
4. |
Izbira registra (RS) |
PB11 |
5. |
Branje / pisanje (RW) |
Tla (G) |
6. |
Omogoči (EN) |
PB10 |
7. |
Podatkovni bit 0 (DB0) |
Brez povezave (NC) |
8. |
Podatkovni bit 1 (DB1) |
Brez povezave (NC) |
9. |
Podatkovni bit 2 (DB2) |
Brez povezave (NC) |
10. |
Podatkovni bit 3 (DB3) |
Brez povezave (NC) |
11. |
Podatkovni bit 4 (DB4) |
PB0 |
12. |
Podatkovni bit 5 (DB5) |
PB1 |
13. |
Podatkovni bit 6 (DB6) |
PC13 |
14. |
Podatkovni bit 7 (DB7) |
PC14 |
15. |
LED pozitivna |
5V |
16. |
LED negativno |
Tla (G) |
Potenciometer na desni strani se uporablja za nadzor kontrasta LCD zaslona. Zgornja tabela prikazuje povezavo med LCD in STM32.
Programiranje STM32
Tako kot prejšnja vadnica smo tudi STM32F103C8 z Arduino IDE programirali prek vrat USB brez uporabe programerja FTDI. Če želite izvedeti več o programiranju STM32 z Arduino IDE, sledite povezavi. Programiramo lahko tako kot v Arduinu. Na koncu je podana celotna koda.
Pri tem kodiranju bomo vzeli vhodno analogno vrednost iz ADC zatiča (PA4), ki je povezan s sredinskim zatičem levega potenciometra, in nato pretvorili analogno vrednost (0-3,3V) v digitalno ali celoštevilčno obliko (0-4095). Ta digitalna vrednost je nadalje na voljo kot izhod PWM za nadzor svetlosti LED in hitrosti enosmernega ventilatorja. LCD 16x2 se uporablja za prikaz ADC in preslikane vrednosti (izhodna vrednost PWM).
Najprej moramo vključiti glavo glave LCD, prijaviti zatiče LCD in jih inicializirati s spodnjo kodo. Več o povezovanju LCD-ja s STM32 preberite tukaj.
#include
Nato navedite in definirajte imena nožic s pomočjo nožice STM32
const int analoginput = PA4; // Vhod iz potenciometra const int led = PA9; // LED izhod const int ventilator = PA8; // izhod ventilatorja
Zdaj znotraj nastavitve () moramo prikazati nekaj sporočil in jih po nekaj sekundah počistiti ter določiti vhodni zatič in izhodne zatiče PWM
lcd.begin (16,2); // Priprava LCD-ja lcd.clear (); // izbriše LCD lcd.setCursor (0,0); // nastavi kurzor na vrstico0 in stolpec0 lcd.print ("CIRCUIT DIGEST"); // prikaže izvleček vezja lcd.setCursor (0,1); // Nastavi kazalec v stolpcu0 in vrstici1 lcd.print ("PWM USING STM32"); // prikaže PWM z zakasnitvijo STM32 (2000); // Čas zakasnitve lcd.clear (); // Počisti LCD pinMode (analogni vhod, INPUT); // nastavimo analogni vhod za način pin kot INPUT pinMode (led, PWM); // nastavimo način zatiča, voden kot PWM izhod pinMode (ventilator, PWM); // nastavimo ventilator v načinu zatiča kot izhod PWM
Analogni vhodni pin (PA4) je nastavljen kot INPUT by pinMode (analoginput, INPUT), LED pin je nastavljen kot PWM output z pinMode (led, PWM) in pin ventilatorja je nastavljen kot PWM output by pinMode (ventilator, PWM) . Tu so izhodni zatiči PWM priključeni na LED (PA9) in ventilator (PA8).
Nato v funkciji void loop () preberemo analogni signal z ADC zatiča (PA4) in ga shranimo v celoštevilčno spremenljivko, ki pretvori analogno napetost v digitalne celoštevilčne vrednosti (0-4095), tako da uporabimo spodnjo kodo int valueadc = analogRead (analoginput);
Pomembno je omeniti, da so PWM zatiči, ki imajo kanale STM32 16-bitno ločljivost (0-65535), zato moramo to preslikati z analognimi vrednostmi z uporabo funkcije map, kot je spodaj
int rezultat = zemljevid (valueadc, 0, 4095, 0, 65535).
Če se preslikava ne uporablja, s spreminjanjem potenciometra ne bomo dobili polne hitrosti ventilatorja ali polne svetlosti LED.
Nato na LED zapišemo izhod PWM z uporabo pwmWrite (led, rezultat) in PWM izhod na ventilator s funkcijo pwmWrite (ventilator, rezultat ).
Na koncu prikažemo analogno vhodno vrednost (vrednost ADC) in izhodne vrednosti (vrednosti PWM) na LCD zaslonu z uporabo naslednjih ukazov
lcd.setCursor (0,0); // nastavi kurzor na vrstico0 in stolpec0 lcd.print ("vrednost ADC ="); // natisne besede “” lcd.print (valueadc); // prikaže valueadc lcd.setCursor (0,1); // Nastavi kazalec na stolpec0 in vrstico1 lcd.print ("Output ="); // natisne besede v "" lcd.print (rezultat); // prikaže rezultat vrednosti
Celotna koda z demonstracijskim videoposnetkom je navedena spodaj.