- Co je PWM (Pulse with Modulation)?
- PWM v STM32
- Požadované komponenty
- Detaily PIN STM32
- Schéma zapojení a zapojení
- Programování STM32
V předchozím článku jsme viděli o převodu ADC pomocí STM32. V tomto tutoriálu se dozvíme o PWM (Pulse Width Modulation) v STM32 a jak můžeme ovládat jas LED nebo rychlost DC ventilátoru pomocí PWM techniky.
Víme, že existují dva typy signálu: analogový a digitální. Analogové signály mají napětí jako (3 V, 1 V… atd.) A digitální signály mají (1 'a 0). Výstupy senzorů jsou analogových signálů a tyto analogové signály se převádějí na digitální pomocí ADC, protože mikrokontroléry rozumějí pouze digitálním. Po zpracování těchto hodnot ADC je třeba znovu převést výstup do analogové podoby, aby bylo možné řídit analogová zařízení. K tomu používáme určité metody, jako jsou PWM, převaděče digitálních na analogové (DAC) atd.
Co je PWM (Pulse with Modulation)?
PWM je způsob ovládání analogových zařízení pomocí digitální hodnoty, jako je ovládání rychlosti motoru, jasu LED atd. Víme, že motor a LED pracují na analogovém signálu. Ale PWM neposkytuje čistý analogový výstup, PWM vypadá jako analogový signál vytvářený krátkými pulzy, který je poskytován pracovním cyklem.
Pracovní cyklus PWM
Procento času, ve kterém signál PWM zůstává VYSOKÝ (v čase), se nazývá pracovní cyklus. Pokud je signál vždy zapnutý, je ve 100% pracovním cyklu a pokud je vždy vypnutý, je to 0% pracovní cyklus.
Pracovní cyklus = čas zapnutí / (čas zapnutí + čas vypnutí)
PWM v STM32
STM32F103C8 má 15 pinů PWM a 10 pinů ADC. K dispozici je 7 časovačů a každý výstup PWM poskytuje kanál připojený ke 4 časovačům. Má 16bitové rozlišení PWM (2 16), to znamená čítače a proměnné mohou být až 65535. Při hodinové frekvenci 72 MHz může mít výstup PWM maximální dobu přibližně jedné milisekundy.
- Hodnota 65535 tedy dává PLNÝ JAS LED a PLNOU RYCHLOST stejnosměrného ventilátoru (100% pracovní cyklus)
- Podobně hodnota 32767 dává POLOVIČNÍ JAS LED A POLOVIČNÍ RYCHLOST stejnosměrného ventilátoru (50% pracovní cyklus)
- A hodnota 13107 dává (20%) JAS A (20%) RYCHLOST (20% pracovní cyklus)
V tomto tutoriálu používáme potenciometr a STM32 ke změně jasu LED a rychlosti stejnosměrného ventilátoru technikou PWM. 16x2 LCD se používá k zobrazení hodnoty ADC (0-4095) a upravené proměnné (hodnota PWM), která je na výstupu (0-65535).
Zde je několik příkladů PWM s jiným mikrokontrolérem:
- Generování PWM pomocí mikrokontroléru PIC s MPLAB a XC8
- Ovládání servomotoru s Raspberry Pi
- Arduino LED stmívač pomocí PWM
- Pulzní šířková modulace (PWM) pomocí MSP430G2
Zkontrolujte všechny projekty související s PWM zde.
Požadované komponenty
- STM32F103C8
- DC ventilátor
- Integrovaný obvod ovladače motoru ULN2003
- LED (ČERVENÁ)
- LCD (16x2)
- Potenciometr
- Nepájivá deska
- Baterie 9V
- Propojovací dráty
Stejnosměrný ventilátor: Zde používaný stejnosměrný ventilátor je ventilátor BLDC ze starého počítače. Vyžaduje externí napájení, takže používáme 9V stejnosměrnou baterii.
ULN2003 IC Driver Driver: Používá se k pohonu motoru v jednom směru, protože motor je jednosměrný a pro ventilátor je vyžadováno také externí napájení. Další informace o obvodu ovladače motoru na základě ULN2003 naleznete zde. Níže je uveden pic diagram ULN2003:
Piny (IN1 až IN7) jsou vstupní piny a (OUT 1 až OUT 7) odpovídající výstupní piny. COM je dáno Pozitivní zdrojové napětí požadované pro výstupní zařízení.
LED: Používá se ČERVENÁ barevná LED, která vyzařuje ČERVENÉ světlo. Lze použít libovolné barvy.
Potenciometry: Používají se dva potenciometry, jeden pro dělič napětí pro analogový vstup do ADC a druhý pro ovládání jasu LED.
Detaily PIN STM32
Jak vidíme, PWM piny jsou označeny ve vlnovém formátu (~), takových kolíků je 15, piny ADC jsou znázorněny zeleně, 10 pinů ADC je použito pro analogové vstupy.
Schéma zapojení a zapojení
Propojení STM32 s různými komponentami je vysvětleno níže:
STM32 s analogovým vstupem (ADC)
Potenciometr na levé straně obvodu se používá jako regulátor napětí, který reguluje napětí z kolíku 3,3 V. Výstup z potenciometru, tj. Středního pinu potenciometru, je připojen k pinu ADC (PA4) STM32.
STM32 s LED
Výstupní kolík STM32 PWM (PA9) je připojen ke kladnému kolíku LED pomocí sériového rezistoru a kondenzátoru.
LED s odporem a kondenzátorem
Rezistor v sérii a kondenzátor paralelně jsou spojeny s LED, aby generovaly správnou analogovou vlnu z výstupu PWM, protože analogový výstup není čistý, když je generován přímo z pinu PWM.
STM32 s ULN2003 a ULN2003 s ventilátorem
Výstupní pin STM32 PWM (PA8) je připojen ke vstupnímu pinu (IN1) ULN2003 IC a odpovídající výstupní pin (OUT1) ULN2003 je připojen k zápornému vodiči DC FAN.
Kladný kolík stejnosměrného ventilátoru je připojen ke kolíku COM ULN2003 IC a externí baterie (9V DC) je také připojena ke stejnému kolíku COM ULN2003 IC. Kolík GND ULN2003 je připojen ke kolíku GND STM32 a záporný pól baterie je připojen ke stejnému kolíku GND.
STM32 s LCD (16x2)
Číslo PIN LCD |
Název PINu LCD |
Název PIN STM32 |
1 |
Ground (GND) |
Zem (G) |
2 |
VCC |
5V |
3 |
VEE |
Kolík ze středu potenciometru |
4 |
Výběr rejstříku (RS) |
PB11 |
5 |
Čtení / zápis (RW) |
Zem (G) |
6 |
Povolit (EN) |
PB10 |
7 |
Datový bit 0 (DB0) |
Žádné připojení (NC) |
8 |
Datový bit 1 (DB1) |
Žádné připojení (NC) |
9 |
Datový bit 2 (DB2) |
Žádné připojení (NC) |
10 |
Datový bit 3 (DB3) |
Žádné připojení (NC) |
11 |
Datový bit 4 (DB4) |
PB0 |
12 |
Datový bit 5 (DB5) |
PB1 |
13 |
Datový bit 6 (DB6) |
PC13 |
14 |
Datový bit 7 (DB7) |
PC14 |
15 |
Pozitivní LED |
5V |
16 |
LED negativní |
Zem (G) |
Potenciometr na pravé straně slouží k ovládání kontrastu LCD displeje. Výše uvedená tabulka ukazuje spojení mezi LCD a STM32.
Programování STM32
Stejně jako v předchozím tutoriálu jsme naprogramovali STM32F103C8 na Arduino IDE přes USB port bez použití programátoru FTDI. Chcete-li se dozvědět více o programování STM32 s Arduino IDE, klikněte na odkaz. Můžeme pokračovat v programování jako v Arduinu. Celý kód je uveden na konci.
V tomto kódování vezmeme vstupní analogovou hodnotu z pinu ADC (PA4), který je připojen ke středovému pinu levého potenciometru, a poté převedeme analogovou hodnotu (0-3,3 V) do digitálního nebo celočíselného formátu (0-4095). Tato digitální hodnota je dále poskytována jako PWM výstup pro řízení jasu LED a rychlosti stejnosměrného ventilátoru. K zobrazení ADC a mapované hodnoty (výstupní hodnota PWM) se používá 16x2 LCD.
Nejprve musíme zahrnout soubor záhlaví LCD, deklarovat piny LCD a inicializovat je pomocí níže uvedeného kódu. Další informace o propojení LCD se STM32 se dozvíte zde.
#zahrnout
Dále deklarujte a definujte názvy pinů pomocí kolíku STM32
const int analogový vstup = PA4; // Vstup z potenciometru const int led = PA9; // LED výstup const int fan = PA8; // výkon ventilátoru
Nyní uvnitř setupu () musíme zobrazit některé zprávy a po několika sekundách je vymazat a určit PIN INPUT a PWM výstupní piny
lcd.begin (16,2); // Příprava na LCD lcd.clear (); // Vymaže LCD lcd.setCursor (0,0); // Nastaví kurzor na řádek0 a sloupec0 lcd.print ("CIRCUIT DIGEST"); // Zobrazí přehled okruhu lcd.setCursor (0,1); // Nastaví kurzor na column0 a row1 lcd.print ("PWM USING STM32"); // Zobrazí PWM pomocí zpoždění STM32 (2000); // Zpoždění lcd.clear (); // Vymaže LCD pinMode (analogový vstup, VSTUP); // nastavení analogového vstupu v režimu pin jako INPUT pinMode (led, PWM); // nastavit režim pin pin jako PWM výstup pinMode (ventilátor, PWM); // nastavit pinový ventilátor jako PWM výstup
Analogový vstupní pin (PA4) je nastaven jako INPUT pomocí pinMode (analogový vstup, INPUT), LED pin je nastaven jako PWM výstup pomocí pinMode (led, PWM) a pin ventilátoru je nastaven jako PWM výstup pomocí pinMode (ventilátor, PWM) . Zde jsou výstupní piny PWM připojeny k LED (PA9) a ventilátoru (PA8).
Dále ve funkci void loop () načteme analogový signál z pinu ADC (PA4) a uložíme jej do celočíselné proměnné, která převádí analogové napětí na digitální celočíselné hodnoty (0-4095) pomocí níže uvedeného kódu int valueadc = analogRead (analoginput);
Zde je důležité si uvědomit, že PWM piny, což jsou kanály STM32, mají 16bitové rozlišení (0-65535), takže je musíme mapovat pomocí analogových hodnot pomocí mapové funkce jako níže
int výsledek = mapa (valueadc, 0, 4095, 0, 65535).
Pokud se mapování nepoužije, nedostaneme plnou rychlost ventilátoru nebo plný jas LED změnou potenciometru.
Potom zapíšeme PWM výstup na LED pomocí pwmWrite (led, result) a PWM výstup do ventilátoru pomocí funkcí pwmWrite (fan, result ).
Nakonec pomocí následujících příkazů zobrazíme na LCD displeji analogovou vstupní hodnotu (hodnotu ADC) a výstupní hodnoty (hodnoty PWM)
lcd.setCursor (0,0); // Nastaví kurzor na řádek0 a sloupec0 lcd.print ("hodnota ADC ="); // vypíše slova „“ lcd.print (valueadc); // zobrazí hodnotueadc lcd.setCursor (0,1); // Nastaví kurzor na sloupec0 a řádek1 lcd.print ("Výstup ="); // vytiskne slova v "" lcd.print (výsledek); // zobrazí výsledek hodnoty
Kompletní kód s ukázkovým videem je uveden níže.