Stm32PwmController ist ein MicroController-Programm geschrieben für
das STM32F103-BluePill-Board, welches die PWM-Ausgänge des
STM32F103 mit zeitlich veränderbaren PWM-Signalen ansteuert.
Ein Oszilloskop zeigt vier unterschiedliche PWM-Kanäle und Ausgänge
eines der freien Timer des STM32F103, wobei das PWM-Verhältnis jedes
Kanals mit der Zeit von 0% auf 100% ansteigt, um dann wieder auf 0%
spontan abzufallen und damit einen neuen Zyklus zu starten.
Sehen wir uns zuerst die Hardware-Verschaltung unseres Stm32PwmController-Versuchaufbaus an:
Der PC besitzt zwei USB-Anschlüsse zum STM32BluePill-Board.
Die eine USB-Schnittstelle benutzt der STLINK-Programmer zum Flashen des STM32-Programms.
Die andere USB-Schnittstelle wird bei Bedarf zusammen mit einem Serial-USB-Converter zur
Seriellen Kommunikation zwischen PC und STM32 benutzt.
Die hier programmierten vier PWM-Ausgänge des STM32 werden direkt mit den Eingängen eines
4-Kanal-Oszilloskops verbunden. Auf dem Oszilloskop erscheinen dann vier unterschiedliche
PWM-Signale entprechend der Programmierung der vier PWM-Kanäle.
Sehen wir uns die für dieses Projekt verwendeten STM32-Pins im STM32-Pinout-Diagramm an:
Die PWM-Ausgabe von bis zu vier PWM-Signalen geschieht über die Pins PB6, PB7, PB8 und PB9,
welche im STM32 dem Timer4 mit den Kanälen Channel1 bis Channel4 (T4C1, T4C2, T4C3, T4C4)
zugeordnet sind.
Die Programmierung erfolgt über die 4 vor Kopf befindlichen Header-Pins:
SWDIO, SWCLK, 3V3-Volt und GND.
Ein möglicher Datenaustausch mit dem PC findet über die Pins PA9 und PA10
entsprechend TX1 und RX1 statt, wird aber in diesen einfachen PWM-Projekten nicht benötigt.
Software
Die Software Stm32PwmController stelle ich hier in drei Versionen vor:
1. Stm32PwmController Version 01V01
zeigt die minimale Erzeugung eines einkanaligen PWM-Signals mit 50Hz und DutyCycle 50%.
2. Stm32PwmController Version 01V02
mit einem einkanaligen PWM-Signal mit 20kHz und variierendem DutyCycle von 0% .. 100%.
3. Stm32PwmController Version 01V03
mit vier PWM-Signalen mit jeweils 20 kHz und unterschiedlich variierender DutyCycles.
Stm32PwmController Version 01V01
Nun zuerst zur Version 01V01, welche ein einkanaliges PWM-Signal mit 50Hz und 50% DutyCycle generiert.
Als einziges Including findet eine Einbindung der Standard-Arduino-Library statt.
Danach folgen Konstanten-Definitionen:
- zuerst die Nummer des PWM-Signal-Ausgang-Pins, über welchem das PWM-Signal abgegriffen wird,
- danach die Definition des Channel 1 (von vier möglichen),
- es folgt die Definition der Frequenz des PWM-Signals: hier mit 50 Hz
- sowie die Definitionen der PWM-DutyCycles 0%, 50% und 100%.
Es folgt die Instanzierung des in diesem Projekt verwendeten Hardware-Timers mit TimerPwm(TIM4).
TIM4 dient dabei als Reference-Counter.
Zum Schluss wird in der Initialisierungs-Funktion setup() TimerPwm auf das korrekte PWM-Signal
mit 50Hz und 50% DutyCycle gesetzt.
Nach Compile & Run sehen wir auf dem Oszilloskop das PWM-Signal mit 50Hz und 50% DutyCycle:
Stm32PwmController Version 01V02
Die Version 01V02 ändert die PWM-Frequenz auf 20kHz am PWM-Pin PB6.
In setup() wird der TimerPwm(von TIM4) mit eben diesem PWM-Signal initialisiert.
In der immer wieder aufgerufenen Hauptschleife loop() incrementiert der PWM-DutyCycle
PWM mit dem TimerPwm.setCaptureCompare-Befehl von PWM_ZERO 0% auf PWM_100PCT 100%
mit Zwischenhalt bei diesen Extremalwerten.
Compile & Run zeigt auf dem Oszilloskop einen quasi linearen PWM-Anstieg auf PWM-Pin PB6:
Stm32PwmController Version 01V03
Die Version 01V03 erweitert den einen PWM-Pin PB6 auf vier PWM-Pins PB6, PB7, PB8 und PB9
mit vier parallelen PWM-Signalen, welche gleichzeitig auf dem Oszilloskop dargestellt werden.
Dabei ist jedem PWM-Pin ein PWM-Kanal zugeordnet.
Die Initialisierung setup() setzt alle vier Kanäle auf PWM-Betrieb von 20kHz.
Die wiederkehrende loop()-Funktion variiert mit der setCaptureCompare-Funktion
alle vier Kanäle mit unterschiedlichen PWM-Signalen.
Compile & Run zeigt das Ergebnis der vier unterschiedlichen PWM-Kanäle des Timers TIM4: