- Mi az a PWM (impulzus modulációval)?
- PWM az STM32-ben
- Szükséges alkatrészek
- Az STM32 tű részletei
- Áramkör és kapcsolatok
- STM32 programozása
Korábbi cikkünkben láthattunk az ADC átalakításról az STM32 segítségével. Ebben az oktatóanyagban megismerhetjük az STM32 PWM-jét (impulzusszélesség-moduláció), és hogyan szabályozhatjuk a LED fényerejét vagy az egyenáramú ventilátor sebességét PWM-technikával.
Tudjuk, hogy kétféle jel létezik: analóg és digitális. Az analóg jeleknek feszültségük van (3V, 1V… stb.), A digitális jeleknek pedig (1 'és 0'). Az érzékelők kimenetei analóg jelek, és ezeket az analóg jeleket az ADC segítségével alakítják át digitálisan, mert a mikrovezérlők csak a digitálisat értik. Az ADC értékek feldolgozása után a kimenetet ismét analóg formába kell átalakítani az analóg eszközök meghajtása érdekében. Ehhez bizonyos módszereket használunk, például PWM, Digital to Analog (DAC) konvertereket stb.
Mi az a PWM (impulzus modulációval)?
A PWM az analóg eszközök digitális értékek segítségével történő vezérlésének módja, például a motor sebességének, a led fényerejének stb. Szabályozása. Tudjuk, hogy a motor és a led analóg jelen működik. De a PWM nem nyújt tiszta analóg kimenetet, a PWM úgy néz ki, mint egy rövid impulzusok által létrehozott analóg jel, amelyet a munkaciklus biztosít.
A PWM munkaciklusa
Az az idő százalékos aránya, amelyben a PWM jel HIGH marad (időben), ciklusnak számít. Ha a jel mindig BE van kapcsolva, akkor 100% -os működési ciklusban van, és ha mindig ki van kapcsolva, akkor 0% -os működési ciklus.
Üzemeltetési ciklus = bekapcsolási idő / (bekapcsolási idő + kikapcsolási idő)
PWM az STM32-ben
Az STM32F103C8 15 PWM és 10 ADC tűvel rendelkezik. 7 időzítő van, és mindegyik PWM kimenetet egy 4 időzítőhöz csatlakoztatott csatorna biztosítja. 16 bites PWM felbontással rendelkezik (2 16), vagyis a számlálók és a változók akár 65535 méretűek is lehetnek. 72 MHz-es órajel mellett a PWM kimenet maximális periódusa körülbelül egy milliszekundum lehet.
- Tehát a 65535 értéke a LED TELJES FÉNYESSÉGÉT ÉS A DC ventilátor TELJES SEBESSÉGÉT adja (100% -os munkaciklus)
- Ugyanígy a 32767 értéke a FÉL FÉNY LED-et ÉS FÉLFOKOZATOT az egyenáramú ventilátorról (50% -os munkaciklus)
- Az 13107 értéke pedig (20%) FÉNYESSÉGET ÉS (20%) SEBESSÉGET (20% Duty Cycle)
Ebben az oktatóanyagban potenciométert és STM32-t használunk a LED fényerejének és az egyenáramú ventilátor sebességének PWM technikával történő változtatására. 16x2-es LCD-t használnak az ADC-érték (0-4095) és a kimeneti módosított változó (PWM-érték) megjelenítésére (0-65535).
Íme néhány PWM példa más mikrovezérlőkkel:
- PWM előállítása PIC mikrokontrollerrel MPLAB és XC8 segítségével
- Szervomotor vezérlés Raspberry Pi-vel
- Arduino alapú LED dimmer PWM használatával
- Pulzusszélesség-moduláció (PWM) az MSP430G2 segítségével
Itt tekintheti meg az összes PWM-mel kapcsolatos projektet.
Szükséges alkatrészek
- STM32F103C8
- DC ventilátor
- ULN2003 Motor Driver IC
- LED (RED)
- LCD (16x2)
- Potenciométer
- Kenyérlemez
- 9V-os akkumulátor
- Jumper huzalok
DC ventilátor: Az itt használt DC ventilátor egy régi számítógép BLDC ventilátora. Külső tápellátást igényel, ezért 9 V DC akkumulátort használunk.
ULN2003 Motor Driver IC: A motor egyirányú meghajtására szolgál, mivel a motor egyirányú, és a ventilátorhoz külső áram is szükséges. Tudjon meg többet az ULN2003 alapú motorvezérlő áramkörről itt. Az alábbiakban az ULN2003 kép diagramja látható:
A csapok (IN1 - IN7) bemeneti csapok, az (OUT 1 - OUT 7) pedig a megfelelő kimeneti csapok. A COM megkapta a kimeneti eszközökhöz szükséges pozitív forrásfeszültséget.
LED: RED színű ledet használnak, amely RED fényt bocsát ki. Bármilyen szín használható.
Potenciométerek: Két potenciométert használnak, az egyiket az ADC analóg bemenetére szolgáló feszültségosztóra, a másik pedig a led fényerejének szabályozására szolgál.
Az STM32 tű részletei
Amint láthatjuk, a PWM csapok hullámformátumban vannak megjelölve (~), 15 ilyen csap van, az ADC csapok zöld színnel vannak ábrázolva, 10 ADC csap van, amelyeket analóg bemenetekhez használnak.
Áramkör és kapcsolatok
Az STM32 különféle alkatrészekkel való összekapcsolását az alábbiakban ismertetjük:
STM32 analóg bemenettel (ADC)
Az áramkör bal oldalán lévő potenciométert feszültségszabályozóként használják, amely a 3,3 V-os tű feszültségét szabályozza. A potenciométer kimenete, azaz a potenciométer középső csapja az STM32 ADC csatlakozójához (PA4) csatlakozik.
STM32 LED-del
Az STM32 PWM kimeneti tű (PA9) soros ellenálláson és kondenzátoron keresztül csatlakozik a LED pozitív tűjéhez.
LED ellenállással és kondenzátorral
A soros ellenállást és a párhuzamos kondenzátort a LED-szel kapcsolják össze, hogy megfelelő analóg hullámot hozzanak létre a PWM kimenetről, mivel az analóg kimenet nem tiszta, ha közvetlenül a PWM csapról generálják.
STM32 ULN2003-mal és ULN2003 ventilátorral
Az STM32 PWM kimeneti tű (PA8) az ULN2003 IC bemeneti tűjéhez (IN1) csatlakozik, az ULN2003 megfelelő kimeneti tűjéhez (OUT1) pedig a DC FAN negatív vezetékéhez csatlakozik.
Az egyenáramú ventilátor pozitív csapja az ULN2003 IC COM csatlakozójához, a külső akkumulátor (9V DC) pedig az ULN2003 IC azonos COM csatlakozójához is csatlakozik. Az ULN2003 GND csapja az STM32 GND tűjéhez, az akkumulátor negatív pedig ugyanahhoz a GND csaphoz van csatlakoztatva.
STM32 LCD-vel (16x2)
LCD tű sz |
LCD tű neve |
STM32 tű neve |
1 |
Föld (Gnd) |
Föld (G) |
2 |
VCC |
5V |
3 |
VEE |
Tű a potenciométer közepétől |
4 |
Register Select (RS) |
PB11 |
5. |
Olvasás / írás (RW) |
Föld (G) |
6. |
Engedélyezés (EN) |
PB10 |
7 |
0. adatbit (DB0) |
Nincs kapcsolat (NC) |
8. |
1. adatbit (DB1) |
Nincs kapcsolat (NC) |
9. |
2. adatbit (DB2) |
Nincs kapcsolat (NC) |
10. |
3. adatbit (DB3) |
Nincs kapcsolat (NC) |
11. |
4. adatbit (DB4) |
PB0 |
12. |
5. adatbit (DB5) |
PB1 |
13. |
6. adatbit (DB6) |
PC13 |
14 |
7. adatbit (DB7) |
PC14 |
15 |
LED pozitív |
5V |
16. |
LED negatív |
Föld (G) |
A jobb oldalon található potenciométerrel szabályozható az LCD kijelző kontrasztja. A fenti táblázat bemutatja az LCD és az STM32 közötti kapcsolatot.
STM32 programozása
Az előző oktatóanyaghoz hasonlóan az STM32F103C8-at az Arduino IDE-vel USB porton keresztül programoztuk, FTDI programozó használata nélkül. Az STM32 Arduino IDE programozásával kapcsolatos információkért kövesse a linket. Úgy folytathatjuk a programozást, mint az Arduino-ban. A teljes kódot a végén adjuk meg.
Ebben a kódolásban analóg bemenetet veszünk az ADC tűtől (PA4), amely a bal oldali potenciométer középső csapjához van csatlakoztatva, majd az analóg értéket (0-3,3 V) digitális vagy egész formátumúra (0-4095) alakítjuk át. Ez a digitális érték tovább PWM kimenetként szolgál a LED fényerejének és a DC ventilátor sebességének szabályozására. 16x2 LCD-t használnak az ADC és a leképezett érték (PWM kimeneti érték) megjelenítésére.
Először be kell illesztenünk az LCD fejlécfájlt, deklarálnunk kell az LCD csapokat és inicializálnunk kell őket az alábbi kód segítségével. Itt többet tudhat meg az LCD és az STM32 összekapcsolásáról.
#include
Ezután deklarálja és definiálja a pin neveket az STM32 pin segítségével
const int analóg bemenet = PA4; // Bemenet a potenciométerről const int led = PA9; // LED kimenet const int ventilátor = PA8; // ventilátor kimenet
Most a setup () belsejében meg kell jelenítenünk néhány üzenetet és néhány másodperc múlva törölni kell őket, és meg kell adnunk az INPUT és PWM kimeneti csapokat
lcdbegin (16,2); // Az LCD előkészítése lcd.clear (); // Az LCD lcd.setCursor törlése (0,0); // A kurzort beállítja a0 sorba és a 0 oszlopba lcd.print ("CIRCUIT DIGEST"); // Megjeleníti a Circuit Digest lcd.setCursor (0,1); // A kurzort beállítja a0 oszlopba és az 1. sorba lcd.print ("PWM STM32 HASZNÁLÁSÁVAL"); // Megjeleníti a PWM-et STM32 delay (2000) használatával; // Késleltetési idő lcd.clear (); // Törli az LCD pinMode módot (analóg bemenet, INPUT); // pin mód analóg bemenetének beállítása INPUT pinMode (led, PWM); // set pin mode led as PWM output pinMode (fan, PWM); // állítsa a csapos üzemmódú ventilátort PWM kimenetre
Az analóg bemeneti tűt (PA4) INPUT-ként állítja be a pinMode ( analóg bemenet , INPUT), a LED-tűt PWM kimenetként állítja be pinMode (led, PWM), és a ventilátor csapot PWM kimenetként állítja be a pinMode (ventilátor, PWM) . Itt a PWM kimeneti csapok a LED-hez (PA9) és a ventilátorhoz (PA8) vannak csatlakoztatva.
Ezután a void loop () függvényben az analóg jelet olvassuk le az ADC tűről (PA4), és egy egész változóban tároljuk, amely az analóg feszültséget digitális egész értékekké (0-4095) alakítja át az alábbi kód használatával: int valueadc = analogRead (analoginput);
Fontos megjegyezni, hogy itt vannak a PWM csapok, amelyek az STM32 csatornái 16 bites felbontásúak (0-65535), ezért ezt analóg értékekkel kell feltérképeznünk az alábbi térképfunkcióval
int eredmény = térkép (valueadc, 0, 4095, 0, 65535).
Ha a térképezést nem használják, akkor a potenciométer változtatásával nem fogjuk elérni a ventilátor teljes sebességét vagy a LED teljes fényerejét.
Ezután a PWM kimenetet a LED-re írjuk , a pwmWrite (led, eredmény) és a PWM kimenetet a ventilátorra a pwmWrite (ventilátor, eredmény ) funkciók segítségével.
Végül az alábbi parancsok segítségével jelenítjük meg az analóg bemeneti értéket (ADC érték) és a kimeneti értékeket (PWM értékeket) az LCD kijelzőn.
lcd.setCursor (0,0); // A kurzort beállítja a0 sorba és az oszlopba 0 lcd.print ("ADC érték ="); // kinyomtatja a „” szavakat lcd.print (valueadc); // megjeleníti az valueadc lcd.setCursor (0,1); // A kurzort beállítja a0 oszlopba és az 1. sorba lcd.print ("Output ="); // kinyomtatja a "" lcd.print (result) szavakat ; // megjeleníti az érték eredményét
A teljes kód egy bemutató videóval az alábbiakban található.