- Co to jest PWM (impuls z modulacją)?
- PWM w STM32
- Wymagane składniki
- Szczegóły pinów STM32
- Schemat obwodu i połączenia
- Programowanie STM32
W poprzednim artykule widzieliśmy o konwersji ADC przy użyciu STM32. W tym samouczku dowiemy się o PWM (modulacji szerokości impulsu) w STM32 i jak możemy kontrolować jasność diody LED lub prędkość wentylatora DC za pomocą techniki PWM.
Wiemy, że istnieją dwa rodzaje sygnału: analogowy i cyfrowy. Sygnały analogowe mają napięcia takie jak (3 V, 1 V… itd.), A sygnały cyfrowe mają (1 'i 0'). Wyjścia czujników są sygnałami analogowymi i te sygnały analogowe są konwertowane na cyfrowe za pomocą ADC, ponieważ mikrokontrolery rozumieją tylko cyfrowe. Po przetworzeniu tych wartości ADC ponownie wyjście musi zostać przekonwertowane na postać analogową, aby sterować urządzeniami analogowymi. W tym celu używamy pewnych metod, takich jak PWM, przetworniki cyfrowo-analogowe (DAC) itp.
Co to jest PWM (impuls z modulacją)?
PWM to sposób na sterowanie urządzeniami analogowymi za pomocą wartości cyfrowych, takich jak sterowanie prędkością silnika, jasnością diody itp. Wiemy, że silnik i dioda LED pracują na sygnale analogowym. Ale PWM nie zapewnia czystego wyjścia analogowego, PWM wygląda jak sygnał analogowy wytwarzany przez krótkie impulsy, które są dostarczane przez cykl pracy.
Cykl pracy PWM
Procent czasu, w którym sygnał PWM pozostaje WYSOKI (w czasie) jest nazywany cyklem pracy. Jeśli sygnał jest zawsze włączony, to jest w 100% cyklu pracy, a jeśli jest zawsze wyłączony, to cykl pracy 0%.
Cykl pracy = czas włączenia / (czas włączenia + czas wyłączenia)
PWM w STM32
STM32F103C8 ma 15 pinów PWM i 10 pinów ADC. Dostępnych jest 7 timerów, a każde wyjście PWM jest dostarczane przez kanał podłączony do 4 timerów. Ma 16-bitową rozdzielczość PWM (2 16), to znaczy liczniki i zmienne mogą mieć nawet 65535. Przy częstotliwości taktowania 72 MHz, wyjście PWM może mieć maksymalny okres około jednej milisekundy.
- Tak więc wartość 65535 daje PEŁNĄ JASNOŚĆ LED I PEŁNĄ PRĘDKOŚĆ wentylatora DC (100% cykl pracy)
- Podobnie wartość 32767 daje POŁOWĘ JASNOŚCI LED I POŁOWĘ PRĘDKOŚCI wentylatora DC (cykl pracy 50%)
- A wartość 13107 daje (20%) JASNOŚĆ I (20%) PRĘDKOŚĆ (20% cykl pracy)
W tym samouczku używamy potencjometru i STM32 do zmiany jasności diody LED i prędkości wentylatora DC za pomocą techniki PWM. Wyświetlacz LCD 16x2 służy do wyświetlania wartości ADC (0-4095) i zmodyfikowanej zmiennej (wartość PWM), która jest wyprowadzana (0-65535).
Oto kilka przykładów PWM z innym mikrokontrolerem:
- Generowanie PWM za pomocą mikrokontrolera PIC z MPLAB i XC8
- Sterowanie serwomotorem z Raspberry Pi
- Ściemniacz LED oparty na Arduino wykorzystujący PWM
- Modulacja szerokości impulsu (PWM) przy użyciu MSP430G2
Sprawdź wszystkie projekty związane z PWM tutaj.
Wymagane składniki
- STM32F103C8
- Wentylator DC
- Układ scalony sterownika silnika ULN2003
- LED (CZERWONA)
- LCD (16x2)
- Potencjometr
- Płytka prototypowa
- Bateria 9V
- Przewody połączeniowe
Wentylator DC: Zastosowany tutaj wentylator DC to wentylator BLDC ze starego komputera.Wymaga zewnętrznego zasilania, więc używamy baterii 9 V DC.
Układ scalony sterownika silnika ULN2003: Służy do napędzania silnika w jednym kierunku, ponieważ silnik jest jednokierunkowy, a także wymagane jest zewnętrzne zasilanie wentylatora. Dowiedz się więcej o obwodzie sterownika silnika opartym na ULN2003 tutaj. Poniżej znajduje się schemat pic ULN2003:
Piny (IN1 do IN7) są pinami wejściowymi, a (OUT 1 do OUT 7) są odpowiednimi pinami wyjściowymi. COM ma dodatnie napięcie źródła wymagane dla urządzeń wyjściowych.
LED: Używana jest czerwona dioda LED, która emituje CZERWONE światło. Można zastosować dowolne kolory.
Potencjometry: Dwa potencjometry są używane, jeden służy do dzielenia napięcia na wejście analogowe do ADC, a drugi do sterowania jasnością diody LED.
Szczegóły pinów STM32
Jak widać, piny PWM są oznaczone w formacie falowym (~), takich pinów jest 15, piny ADC są oznaczone kolorem zielonym, 10 pinów ADC jest używanych do wejść analogowych.
Schemat obwodu i połączenia
Połączenia STM32 z różnymi komponentami wyjaśniono poniżej:
STM32 z wejściem analogowym (ADC)
Potencjometr znajdujący się po lewej stronie obwodu służy jako regulator napięcia, który reguluje napięcie z pinu 3,3V. Wyjście z potencjometru, tj. Środkowy pin potencjometru, jest połączone z pinem ADC (PA4) STM32.
STM32 z diodą LED
Styk wyjściowy STM32 PWM (PA9) jest podłączony do dodatniego styku diody LED przez rezystor szeregowy i kondensator.
Dioda LED z rezystorem i kondensatorem
Szeregowy rezystor i kondensator równolegle są połączone z diodą LED, aby generować prawidłową falę analogową z wyjścia PWM, ponieważ wyjście analogowe nie jest czyste, gdy jest generowane bezpośrednio z pinu PWM.
STM32 z ULN2003 i ULN2003 z wentylatorem
Styk wyjściowy STM32 PWM (PA8) jest podłączony do styku wejściowego (IN1) układu scalonego ULN2003, a odpowiedni styk wyjściowy (OUT1) ULN2003 jest podłączony do przewodu ujemnego wentylatora DC.
Dodatni pin wentylatora prądu stałego jest podłączony do styku COM układu scalonego ULN2003, a bateria zewnętrzna (9 V DC) jest również podłączona do tego samego styku COM układu scalonego ULN2003. Pin GND ULN2003 jest podłączony do pinu GND STM32, a biegun ujemny akumulatora jest podłączony do tego samego pinu GND.
STM32 z wyświetlaczem LCD (16x2)
Nr styku wyświetlacza LCD |
Nazwa styku wyświetlacza LCD |
Nazwa styku STM32 |
1 |
Ziemia (Gnd) |
Mielone (G) |
2 |
VCC |
5V |
3 |
VEE |
Kołek ze środka potencjometru |
4 |
Zarejestruj Wybierz (RS) |
PB11 |
5 |
Odczyt / zapis (RW) |
Mielone (G) |
6 |
Włącz (EN) |
PB10 |
7 |
Bit danych 0 (DB0) |
Brak połączenia (NC) |
8 |
Bit danych 1 (DB1) |
Brak połączenia (NC) |
9 |
Bit danych 2 (DB2) |
Brak połączenia (NC) |
10 |
Bit danych 3 (DB3) |
Brak połączenia (NC) |
11 |
Bit danych 4 (DB4) |
PB0 |
12 |
Bit danych 5 (DB5) |
PB1 |
13 |
Bit danych 6 (DB6) |
PC13 |
14 |
Bit danych 7 (DB7) |
PC14 |
15 |
Dioda LED dodatnia |
5V |
16 |
Negatyw LED |
Mielone (G) |
Potencjometr po prawej stronie służy do regulacji kontrastu wyświetlacza LCD. Powyższa tabela przedstawia połączenie między wyświetlaczem LCD a STM32.
Programowanie STM32
Podobnie jak w poprzednim samouczku, zaprogramowaliśmy STM32F103C8 z Arduino IDE przez port USB bez użycia programatora FTDI. Aby dowiedzieć się o programowaniu STM32 z Arduino IDE, kliknij link. Programowanie możemy kontynuować jak w Arduino. Na końcu podajemy pełny kod.
W tym kodowaniu weźmiemy wejściową wartość analogową z pinu ADC (PA4), który jest podłączony do środkowego pinu lewego potencjometru, a następnie przekonwertujemy wartość analogową (0-3,3 V) na format cyfrowy lub całkowity (0-4095). Ta wartość cyfrowa jest ponadto dostarczana jako wyjście PWM do sterowania jasnością diod LED i prędkością wentylatora DC. Wyświetlacz LCD 16x2 służy do wyświetlania ADC i zmapowanej wartości (wartość wyjściowa PWM).
Najpierw musimy załączyć plik nagłówkowy LCD, zadeklarować piny LCD i zainicjować je za pomocą poniższego kodu. Dowiedz się więcej o łączeniu LCD z STM32 tutaj.
#zawierać
Następnie zadeklaruj i zdefiniuj nazwy pinów używając pinu STM32
const int analoginput = PA4; // Wejście z potencjometru const int led = PA9; // wyjście LED const int fan = PA8; // wyjście wentylatora
Teraz w setup () musimy wyświetlić kilka komunikatów i wyczyścić je po kilku sekundach oraz określić pin INPUT i pin wyjściowy PWM
lcd.begin (16,2); // Przygotowanie wyświetlacza LCD lcd.clear (); // Czyści LCD lcd.setCursor (0,0); // Ustawia kursor w wierszu0 i kolumnie0 lcd.print ("CIRCUIT DIGEST"); // Wyświetla podsumowanie obwodu lcd.setCursor (0,1); // Ustawia kursor w kolumnie0 i wierszu1 lcd.print ("PWM USING STM32"); // Wyświetla PWM przy użyciu opóźnienia STM32 (2000); // Czas opóźnienia lcd.clear (); // Czyści LCD pinMode (analoginput, INPUT); // ustaw wejście analogowe w trybie pinowym jako INPUT pinMode (led, PWM); // ustaw tryb pinowy jako wyjście PWM pinMode (wentylator, PWM); // ustaw wentylator w trybie pin jako wyjście PWM
Analogowy pin wejściowy (PA4) jest ustawiony jako INPUT przez pinMode (wejście analogowe, INPUT), pin LED jest ustawiony jako wyjście PWM przez pinMode (dioda, PWM), a pin wentylatora jest ustawiony jako wyjście PWM przez pinMode (wentylator, PWM) . Tutaj piny wyjściowe PWM są podłączone do diody LED (PA9) i wentylatora (PA8).
Następnie w funkcji void loop () odczytujemy sygnał analogowy z pinu ADC (PA4) i przechowujemy go w zmiennej całkowitej, która konwertuje napięcie analogowe na cyfrowe wartości całkowite (0-4095) za pomocą poniższego kodu int valueadc = analogRead (analoginput);
Ważną rzeczą do zapamiętania jest to, że piny PWM, czyli kanały STM32 mają 16-bitową rozdzielczość (0-65535), więc musimy to zmapować za pomocą wartości analogowych za pomocą funkcji mapowania jak poniżej
int result = map (valueadc, 0, 4095, 0, 65535).
Jeśli mapowanie nie jest używane, nie uzyskamy pełnej prędkości wentylatora lub pełnej jasności diody zmieniając potencjometr.
Następnie zapisujemy wyjście PWM do diody LED za pomocą pwmWrite (led, wynik) i wyjście PWM do wentylatora za pomocą funkcji pwmWrite (wentylator, wynik ).
Na koniec wyświetlamy wartość wejścia analogowego (wartość ADC) i wartości wyjściowe (wartości PWM) na wyświetlaczu LCD za pomocą następujących poleceń
lcd.setCursor (0,0); // Ustawia kursor w wiersz 0 i kolumna 0 lcd.print ("ADC value ="); // wypisuje słowa „” lcd.print (valueadc); // wyświetla valueadc lcd.setCursor (0,1); // Ustawia kursor w kolumnie0 i wierszu1 lcd.print ("Output ="); // wypisuje słowa w "" lcd.print (wynik); // wyświetla wartość wyniku
Kompletny kod wraz z filmem demonstracyjnym znajduje się poniżej.