- Kas yra PWM (impulsas su moduliacija)?
- PWM STM32
- Būtini komponentai
- Informacija apie STM32 kaištį
- Grandinės schema ir jungtys
- Programavimas STM32
Ankstesniame straipsnyje matėme apie ADC konversiją naudojant STM32. Šioje pamokoje sužinosime apie STW32 PWM (impulso pločio moduliacija) ir kaip mes galime valdyti šviesos diodų ryškumą arba nuolatinės srovės ventiliatoriaus greitį naudodami PWM techniką.
Mes žinome, kad yra dviejų tipų signalai: analoginis ir skaitmeninis. Analoginių signalų įtampa yra tokia (3V, 1V… ir kt.), O skaitmeniniuose - 1 ir 0. Jutiklių išėjimai yra analoginių signalų ir šie analoginiai signalai yra paverčiami skaitmeniniais naudojant ADC, nes mikrovaldikliai supranta tik skaitmeninius. Apdorojus tas ADC reikšmes, išvestį vėl reikia konvertuoti į analoginę formą, kad būtų galima valdyti analoginius įrenginius. Tam mes naudojame tam tikrus metodus, tokius kaip PWM, „Digital to Analog“ (DAC) keitikliai ir kt.
Kas yra PWM (impulsas su moduliacija)?
PWM yra būdas valdyti analoginius įrenginius naudojant skaitmeninę vertę, pvz., Variklio greičio, šviesos diodo ryškumo ir pan. Kontrolę. Mes žinome, kad variklis ir lempa veikia esant analoginiam signalui. Bet PWM neteikia grynos analoginės išvesties, PWM atrodo kaip analoginis signalas, kurį sukuria trumpi impulsai, kurį teikia darbo ciklas.
PWM darbo ciklas
Laiko procentas, per kurį PWM signalas lieka AUKŠTAS (laiku), vadinamas darbo ciklu. Jei signalas visada įjungtas, jis yra 100% darbo ciklo, o jei jis visada išjungtas, jis yra 0%.
Darbo ciklas = Įjungti laiką / (Įjungti laiką + Išjungti laiką)
PWM STM32
STM32F103C8 yra 15 PWM kaiščių ir 10 ADC kaiščių. Yra 7 laikmačiai, o kiekvieną PWM išvestį teikia kanalas, prijungtas prie 4 laikmačių. Jis turi 16 bitų PWM skiriamąją gebą (2 16), tai yra skaitikliai ir kintamieji gali būti tokie dideli kaip 65535. Su 72 MHz taktiniu dažniu PWM išvesties maksimalus laikotarpis gali būti maždaug viena milisekundė.
- Taigi 65535 vertė suteikia PILNĄ LED ŠVIESĄ IR PILNĄ NENUOLATINĖS GALINĖS ventiliatoriaus greitį (100% darbo ciklas).
- Lygiai taip pat 32767 vertė suteikia PUSĮ šviesos diodo ryškumą ir pusiau greitį nuolatinės srovės ventiliatoriaus (50% darbo ciklas)
- 13107 vertė suteikia (20%) ryškumą ir (20%) greitį (20% muito ciklas)
Šioje pamokoje mes naudojame potenciometrą ir STM32, kad PWM technika keistume LED ryškumą ir nuolatinės srovės ventiliatoriaus greitį. 16x2 skystųjų kristalų ekranas naudojamas rodyti ADC vertę (0-4095) ir modifikuotą kintamąjį (PWM reikšmė), kuris yra išvestis (0-65535).
Čia yra keletas PWM pavyzdžių su kitais mikrovaldikliais:
- PWM generavimas naudojant PIC mikrovaldiklį su MPLAB ir XC8
- Servo variklio valdymas su „Raspberry Pi“
- „Arduino“ pagrindu veikiantis LED reguliatorius naudojant PWM
- Impulso pločio moduliacija (PWM) naudojant MSP430G2
Čia patikrinkite visus su PWM susijusius projektus.
Būtini komponentai
- STM32F103C8
- DC ventiliatorius
- ULN2003 variklio vairuotojo IC
- LED (RED)
- LCD (16x2)
- Potenciometras
- Bandomoji Lenta
- Baterija 9V
- Šuolių laidai
DC ventiliatorius: čia naudojamas nuolatinės srovės ventiliatorius yra senojo kompiuterio BLDC ventiliatorius. Tam reikia išorinio maitinimo šaltinio, todėl naudojame 9 V nuolatinės srovės bateriją.
ULN2003 variklio tvarkyklės IC: jis naudojamas varikliui vairuoti viena kryptimi, nes variklis yra vienakryptis, o ventiliatoriui taip pat reikalinga išorinė energija. Sužinokite daugiau apie ULN2003 variklio tvarkyklę čia. Žemiau yra ULN2003 paveikslėlio schema:
Kaiščiai (nuo IN1 iki IN7) yra įvesties kaiščiai, o (nuo OUT 1 iki OUT 7) yra atitinkami išvesties kaiščiai. COM suteikiama teigiamo šaltinio įtampa, reikalinga išvesties įrenginiams.
Šviesos diodas: naudojamas raudonos spalvos šviesos diodas, kuris skleidžia raudoną šviesą. Galima naudoti bet kokias spalvas.
Potenciometrai: naudojami du potenciometrai, vienas skirtas įtampos dalikliui, skirtam analoginiam įėjimui į ADC, kitas - šviesos diodo ryškumui valdyti.
Informacija apie STM32 kaištį
Kaip matome, PWM kaiščiai yra nurodyti bangos formatu (~), yra 15 tokių kaiščių, ADC kaiščiai yra vaizduojami žalios spalvos, yra 10 ADC kaiščių, kurie naudojami analoginiams įėjimams.
Grandinės schema ir jungtys
STM32 sujungimas su įvairiais komponentais paaiškinamas taip:
STM32 su analoginiu įėjimu (ADC)
Kairėje grandinės pusėje esantis potenciometras naudojamas kaip įtampos reguliatorius, reguliuojantis įtampą iš 3,3 V kaiščio. Potenciometro išėjimas, ty centrinis potenciometro kaištis, yra sujungtas su STM32 ADC kaiščiu (PA4).
STM32 su LED
STM32 PWM išvesties kaištis (PA9) yra prijungtas prie teigiamo LED kaiščio per nuoseklųjį rezistorių ir kondensatorių.
Šviesos diodas su rezistoriumi ir kondensatoriumi
Nuoseklus rezistorius ir lygiagretus kondensatorius yra sujungti su šviesos diodais, kad generuotų teisingą analoginę bangą iš PWM išėjimo, nes analoginis išėjimas nėra grynas, kai generuojamas tiesiai iš PWM kaiščio.
STM32 su ULN2003 ir ULN2003 su ventiliatoriumi
STM32 PWM išvesties kaištis (PA8) yra prijungtas prie ULN2003 IC įvesties kaiščio (IN1), o atitinkamas ULN2003 išvesties kaištis (OUT1) yra prijungtas prie neigiamo nuolatinės srovės ventiliatoriaus laido.
Teigiamas nuolatinės srovės ventiliatoriaus kaištis yra prijungtas prie ULN2003 IC COM kaiščio, o išorinė baterija (9V DC) taip pat prijungta prie to paties ULN2003 IC COM kaiščio. ULN2003 GND kaištis yra prijungtas prie STM32 GND kaiščio, o neigiamas akumuliatoriaus akumuliatorius yra prijungtas prie to paties GND kaiščio.
STM32 su LCD (16x2)
LCD kaiščio Nr |
LCD smeigtuko pavadinimas |
STM32 kaiščio pavadinimas |
1 |
Žemė (Gnd) |
Žemė (G) |
2 |
VCC |
5V |
3 |
VEE |
Kaištis iš potenciometro centro |
4 |
„Register Select“ (RS) |
PB11 |
5 |
Skaityti / rašyti (RW) |
Žemė (G) |
6 |
Įgalinti (EN) |
PB10 |
7 |
0 duomenų bitas (DB0) |
Nėra ryšio (NC) |
8 |
1 duomenų bitas (DB1) |
Nėra ryšio (NC) |
9 |
2 duomenų bitas (DB2) |
Nėra ryšio (NC) |
10 |
3 duomenų bitas (DB3) |
Nėra ryšio (NC) |
11 |
4 duomenų bitas (DB4) |
PB0 |
12 |
5 duomenų bitas (DB5) |
PB1 |
13 |
6 duomenų bitas (DB6) |
PC13 |
14 |
7 duomenų bitas (DB7) |
PC14 |
15 |
LED teigiamas |
5V |
16 |
LED neigiamas |
Žemė (G) |
Dešinėje pusėje esantis potenciometras naudojamas LCD ekrano kontrastui valdyti. Aukščiau pateiktoje lentelėje parodytas ryšys tarp LCD ir STM32.
Programavimas STM32
Kaip ir ankstesnę mokymo programą, per USB prievadą, nenaudodami FTDI programuotojo, užprogramavome STM32F103C8 su „Arduino IDE“. Norėdami sužinoti apie STM32 programavimą su „Arduino IDE“, spustelėkite nuorodą. Programavimą galime tęsti kaip „Arduino“. Pabaigoje pateikiamas visas kodas.
Šiame kodavime imsime analoginę įvesties vertę iš ADC kaiščio (PA4), kuris yra prijungtas prie kairio potenciometro centrinio kaiščio, ir tada konvertuosime analoginę vertę (0–3,3 V) į skaitmeninį arba sveiko skaičiaus formatą (0–4095). Ši skaitmeninė vertė toliau pateikiama kaip PWM išvestis, kad būtų galima valdyti LED ryškumą ir nuolatinės srovės ventiliatoriaus greitį. 16x2 skystųjų kristalų ekranas naudojamas rodyti ADC ir susietą vertę (PWM išėjimo vertę).
Pirmiausia turime įtraukti LCD antraštės failą, deklaruoti LCD kaiščius ir inicializuoti juos naudodami žemiau esantį kodą. Sužinokite daugiau apie LCD sąsają su STM32 čia.
# įtraukti
Tada deklaruokite ir apibrėžkite kaiščių pavadinimus naudodami STM32 kaištį
const int analoginis įėjimas = PA4; // Įvestis iš potenciometro const int led = PA9; // LED išėjimas const int ventiliatorius = PA8; // ventiliatoriaus išėjimas
Dabar sąrankos viduje () turime parodyti kai kuriuos pranešimus ir išvalyti juos po kelių sekundžių ir nurodyti INPUT kaištį ir PWM išvesties kaiščius
lcd.pradėti (16,2); // Pasirengimas skystųjų kristalų ekranui lcd.clear (); // Išvalo LCD lcd.setCursor (0,0); // Nustato žymeklį 0 eilutėje ir stulpelyje0 lcd.print ("CIRCUIT DIGEST"); // Rodo grandinės santrauką lcd.setCursor (0,1); // Nustato žymeklį 0 stulpelyje ir 1 eilutėje lcd.print ("PWM USING STM32"); // Parodo PWM naudojant STM32 delsa (2000); // Vėlavimo laikas lcd.clear (); // Išvalo LCD pinMode (analoginis įėjimas, INPUT); // nustatyti pin mode analoginput kaip INPUT pinMode (led, PWM); // nustatyti PIN režimą kaip PWM išėjimo pinMode (ventiliatorius, PWM); // nustatykite kaiščių režimo ventiliatorių kaip PWM išėjimą
Analoginio įvesties kaištis (PA4) nustatomas kaip „INPUT by pinMode“ ( analoginis įėjimas , INPUT), LED kaištis nustatomas kaip „PWM“ išvestis naudojant „ pinMode“ (LED, PWM), o ventiliatoriaus kaištis nustatytas kaip „PWM“ išvestis naudojant „ pinMode“ (ventiliatorius, PWM) . Čia PWM išvesties kaiščiai yra prijungti prie šviesos diodų (PA9) ir ventiliatorių (PA8).
Toliau funkcijoje „ void loop ()“ skaitome analoginį signalą iš ADC kaiščio (PA4) ir saugome jį sveikojo skaičiaus kintamajame, kuris analoginę įtampą paverčia skaitmeninio sveikojo skaičiaus reikšmėmis (0–4095), naudodamas žemiau esantį kodą int valueadc = analogRead (analoginput);
Svarbus dalykas, kurį reikia atkreipti dėmesį į tai, yra PWM kaiščiai, kurie yra STM32 kanalai, turintys 16 bitų skiriamąją gebą (0-65535), todėl turime tai susieti su analoginėmis vertėmis, naudodami žemėlapio funkciją, kaip nurodyta toliau.
int rezultatas = žemėlapis (valueadc, 0, 4095, 0, 65535).
Jei žemėlapis nenaudojamas, keisdami potenciometrą, mes negausime viso ventiliatoriaus greičio ar viso LED ryškumo.
Tada mes rašome PWM išvestį į šviesos diodą, naudodami pwmWrite (LED, rezultatas) ir PWM išėjimą į ventiliatorių, naudodami pwmWrite (ventiliatorius, rezultatas ) funkcijas.
Galiausiai LCD ekrane rodome analoginės įvesties vertę (ADC reikšmę) ir išvesties vertes (PWM reikšmes) naudodami šias komandas
lcd.setCursor (0,0); // Nustato žymeklį 0 eilutėje ir stulpelyje0 lcd.print ("ADC reikšmė ="); // spausdina žodžius „” lcd.print (valueadc); // rodo valueadc lcd.setCursor (0,1); // Nustato žymeklį 0 stulpelyje ir 1 eilutėje lcd.print ("Output ="); // spausdina žodžius "" lcd.print (rezultatas); // rodo vertės rezultatą
Visas kodas su demonstraciniu vaizdo įrašu pateikiamas žemiau.