- Što je PWM (puls s modulacijom)?
- PWM u STM32
- Komponente potrebne
- Pojedinosti pribadače za STM32
- Kružni dijagram i veze
- Programiranje STM32
U prethodnom članku vidjeli smo o ADC konverziji pomoću STM32. U ovom uputstvu naučit ćemo o PWM (modulacija širine impulsa) u STM32 i kako možemo kontrolirati svjetlinu LED-a ili brzinu istosmjernog ventilatora pomoću PWM tehnike.
Znamo da postoje dvije vrste signala: analogni i digitalni. Analogni signali imaju napone poput (3V, 1V… itd.), A digitalni signali (1 'i 0). Izlazi senzora su analognih signala i ti analogni signali se pretvaraju u digitalne pomoću ADC-a, jer mikrokontroleri razumiju samo digitalne. Nakon obrade tih ADC vrijednosti, izlaz opet treba pretvoriti u analogni oblik za pogon analognih uređaja. Za to koristimo određene metode poput PWM, digitalno analognih (DAC) pretvarača itd.
Što je PWM (puls s modulacijom)?
PWM je način upravljanja analognim uređajima pomoću digitalne vrijednosti poput kontrole brzine motora, svjetline LED-a itd. Znamo da motor i led rade na analognom signalu. Ali PWM ne pruža čisti analogni izlaz, PWM izgleda kao analogni signal koji se stvara kratkim impulsima, a koji se osigurava u radnom ciklusu.
Radni ciklus PWM
Postotak vremena u kojem PWM signal ostaje VISOK (na vrijeme) naziva se radnim ciklusom. Ako je signal uvijek UKLJUČEN, on je u 100% radnom ciklusu, a ako je uvijek isključen, to je 0% radnog ciklusa.
Radni ciklus = Vrijeme UKLJUČIVANJA / (Vrijeme UKLJUČIVANJA + Vrijeme isključivanja)
PWM u STM32
STM32F103C8 ima 15 PWM pinova i 10 ADC pinova. Postoji 7 timera, a svaki PWM izlaz pruža kanal spojen na 4 timera. Ona ima 16-bitni PWM razlučivost (2 16), koji je brojila i varijable mogu biti tako velike kao što 65535. Sa stopom 72MHz sat, PWM izlaz može imati maksimalno razdoblje od oko jedne milisekunde.
- Tako vrijednost 65535 daje PUNU SVJETLOST LEDA I PUNU BRZINU istosmjernog ventilatora (100% radni ciklus)
- Isto tako vrijednost 32767 daje POVOLJNU SJAJOST LEDA I POVOLJNU BRZinu istosmjernog ventilatora (50% radnog ciklusa)
- A vrijednost 13107 daje (20%) SVJETLOST I (20%) BRZINU (20% radnog ciklusa)

U ovom uputstvu koristimo potenciometar i STM32 za mijenjanje svjetline LED-a i brzine istosmjernog ventilatora pomoću PWM tehnike. LCD 16x2 koristi se za prikaz ADC vrijednosti (0-4095) i modificirane varijable (vrijednost PWM) koja je na izlazu (0-65535).
Evo nekoliko primjera PWM-a s drugim mikrokontrolerom:
- Generiranje PWM-a pomoću PIC mikrokontrolera s MPLAB-om i XC8
- Upravljanje servo motorom s Raspberry Pi
- LED zatamnjivač zasnovan na Arduinu koji koristi PWM
- Modulacija širine impulsa (PWM) pomoću MSP430G2
Ovdje provjerite sve projekte povezane s PWM-om.
Komponente potrebne
- STM32F103C8
- Ventilator istosmjerne struje
- ULN2003 IC vozač motora
- LED (CRVENA)
- LCD (16x2)
- Potenciometar
- Breadboard
- Baterija 9V
- Jumper žice
DC ventilator: Ovdje se koristi ventilator istosmjerne struje, BLDC ventilator sa starog računala. Potreban mu je vanjski izvor napajanja, pa koristimo bateriju od 9 V DC.
IC vozača motora ULN2003: Koristi se za pogon motora u jednom smjeru, jer je motor jednosmjeran, a za ventilator je potrebna i vanjska snaga. Ovdje saznajte više o krugu motornog pogona temeljenom na ULN2003. Ispod je slikovni dijagram ULN2003:

Igle (IN1 do IN7) su ulazne igle (OUT 1 do OUT 7) odgovarajuće izlazne igle. COM dobiva pozitivan napon izvora potreban za izlazne uređaje.
LED: koristi se CRVENA LED u boji koja emitira CRVENU svjetlost. Mogu se koristiti bilo koje boje.
Potenciometri: Koriste se dva potenciometra, jedan je za razdjelnik napona za analogni ulaz na ADC, a drugi za kontrolu svjetline LED-a.
Pojedinosti pribadače za STM32

Kao što vidimo, PWM pinovi su naznačeni u valnom formatu (~), takvih je 15, ADC pinovi su predstavljeni u zelenoj boji, 10 ADC pinova se koristi za analogne ulaze.
Kružni dijagram i veze

Poveznice STM32 s raznim komponentama objašnjene su na sljedeći način:
STM32 s analognim ulazom (ADC)
Potenciometar prisutan na lijevoj strani kruga koristi se kao regulator napona koji regulira napon sa 3,3V pina. Izlaz iz potenciometra, odnosno središnjeg pina potenciometra povezan je s ADC pinom (PA4) STM32.
STM32 sa LED
Izlazni pin STM32 PWM (PA9) povezan je s pozitivnim pinom LED-a kroz serijski otpornik i kondenzator.
LED s otpornikom i kondenzatorom
Otpornik u seriji i kondenzator paralelno povezani su sa LED diodom kako bi generirali ispravan analogni val iz PWM izlaza, jer analogni izlaz nije čist od generiranja izravno iz PWM pina.
STM32 s ULN2003 i ULN2003 s ventilatorom
STM32 PWM izlazni pin (PA8) spojen je na ulazni pin (IN1) ULN2003 IC, a odgovarajući izlazni pin (OUT1) ULN2003 povezan je s negativnom žicom istosmjernog ventilatora.
Pozitivni pin DC ventilatora povezan je s COM pinom ULN2003 IC, a vanjska baterija (9V DC) također je povezana s istim COM pinom ULN2003 IC. GND pin ULN2003 spojen je na GND pin STM32, a negativ baterije povezan je s istim GND pinom.
STM32 s LCD-om (16x2)
|
LCD pin br |
Naziv LCD ekrana |
Naziv pin-a STM32 |
|
1 |
Prizemlje (Gnd) |
Uzemljenje (G) |
|
2 |
VCC |
5V |
|
3 |
VEE |
Prikvačivač iz središta potenciometra |
|
4 |
Odaberite registar (RS) |
PB11 |
|
5 |
Čitanje / pisanje (RW) |
Uzemljenje (G) |
|
6 |
Omogući (EN) |
PB10 |
|
7 |
Bit podataka 0 (DB0) |
Nema veze (NC) |
|
8 |
Bit podataka 1 (DB1) |
Nema veze (NC) |
|
9 |
Bit podataka 2 (DB2) |
Nema veze (NC) |
|
10 |
Bit podataka 3 (DB3) |
Nema veze (NC) |
|
11 |
Bit podataka 4 (DB4) |
PB0 |
|
12 |
Bit podataka 5 (DB5) |
PB1 |
|
13 |
Bit podataka 6 (DB6) |
PC13 |
|
14 |
Bit podataka 7 (DB7) |
PC14 |
|
15 |
LED pozitivan |
5V |
|
16 |
LED negativan |
Uzemljenje (G) |
Potenciometar s desne strane koristi se za kontrolu kontrasta LCD zaslona. Gornja tablica prikazuje vezu između LCD-a i STM32.

Programiranje STM32
Kao i prethodni tutorial, STM32F103C8 programirali smo s Arduino IDE-om putem USB priključka bez upotrebe FTDI programera. Da biste saznali više o programiranju STM32 s Arduino IDE, slijedite vezu. Programiranje možemo nastaviti kao u Arduinu. Kompletni kod dan je na kraju.
U ovom ćemo kodiranju uzeti ulaznu analognu vrijednost iz ADC pina (PA4) koji je povezan sa središnjim pinom lijevog potenciometra, a zatim pretvoriti analognu vrijednost (0-3,3 V) u digitalni ili cjelobrojni format (0-4095). Ova digitalna vrijednost dalje se pruža kao PWM izlaz za kontrolu svjetline LED-a i brzine istosmjernog ventilatora. LCD 16x2 koristi se za prikaz ADC-a i mapirane vrijednosti (PWM izlazna vrijednost).
Prvo moramo uključiti datoteku zaglavlja LCD-a, deklarirati LCD igle i inicijalizirati ih pomoću donjeg koda. Ovdje saznajte više o povezivanju LCD-a sa STM32.
#include
Zatim navedite i definirajte imena pinova pomoću pin-a STM32
const int analoginput = PA4; // Ulaz iz potenciometra const int led = PA9; // LED izlaz const int ventilator = PA8; // izlaz ventilatora
Sada unutar postave () , moramo prikazati neke poruke i očistiti ih nakon nekoliko sekundi te odrediti INPUT pin i PWM izlazne igle
lcd.početak (16,2); // Priprema LCD zaslona lcd.clear (); // briše LCD lcd.setCursor (0,0); // Postavlja kursor na redak0 i stupac0 lcd.print ("CIRCUIT DIGEST"); // prikazuje sažetak kruga lcd.setCursor (0,1); // Postavlja kursor na lcd.print stupca0 i retka1 ("PWM USING STM32"); // prikazuje PWM pomoću STM32 kašnjenja (2000); // Vrijeme odgode lcd.clear (); // Briše LCD pinMode (analogni ulaz, INPUT); // postavljanje analognog ulaza u način pin-a kao INPUT pinMode (led, PWM); // postavljanje načina pina vodeno kao PWM izlaz pinMode (ventilator, PWM); // postavljanje ventilatora u načinu rada pin kao PWM izlaz
Analogni ulazni pin (PA4) postavljen je kao INPUT by pinMode (analoginput, INPUT), LED pin je postavljen kao PWM izlaz pinMode (led, PWM), a pin ventilatora postavljen je kao PWM izlaz pinMode (ventilator, PWM) . Ovdje su izlazi PWM spojeni na LED (PA9) i ventilator (PA8).
Sljedeće u funkciji void loop () čitamo analogni signal s ADC pina (PA4) i pohranjujemo ga u cjelobrojnu varijablu koja pretvara analogni napon u digitalne cjelobrojne vrijednosti (0-4095) pomoću donjeg koda int valueadc = analogRead (analoginput);
Ovdje je važno napomenuti da su PWM pinovi, odnosno kanali STM32, imaju 16-bitnu rezoluciju (0-65535), tako da to moramo mapirati s analognim vrijednostima pomoću funkcije karte kao dolje
int rezultat = mapa (valueadc, 0, 4095, 0, 65535).
Ako se ne koristi mapiranje, promjenom potenciometra nećemo dobiti punu brzinu ventilatora ili punu svjetlinu LED-a.
Zatim na LED zapisujemo PWM izlaz pomoću pwmWrite (led, rezultat) i PWM izlaz na ventilator pomoću funkcija pwmWrite (ventilator, rezultat ).
Na kraju prikazujemo analognu ulaznu vrijednost (ADC vrijednost) i izlazne vrijednosti (PWM vrijednosti) na LCD zaslonu pomoću sljedećih naredbi
lcd.setCursor (0,0); // Postavlja kursor na redak0 i stupac0 lcd.print ("ADC value ="); // ispisuje riječi “” lcd.print (valueadc); // prikazuje valueadc lcd.setCursor (0,1); // Postavlja kursor na stupac0 i red1 lcd.print ("Output ="); // ispisuje riječi u "" lcd.print (rezultat); // prikazuje rezultat vrijednosti
Kompletni kôd s demonstracijskim videom dan je u nastavku.
