- Was ist PWM (Puls mit Modulation)?
- PWM in STM32
- Erforderliche Komponenten
- Pin Details von STM32
- Schaltplan und Anschlüsse
- Programmierung von STM32
Im vorherigen Artikel haben wir über die ADC-Konvertierung mit STM32 gesehen. In diesem Tutorial lernen wir PWM (Pulse Width Modulation) in STM32 kennen und wie wir die Helligkeit der LED oder die Geschwindigkeit des DC-Lüfters mithilfe der PWM-Technik steuern können.
Wir wissen, dass es zwei Arten von Signalen gibt: Analog und Digital. Analoge Signale haben Spannungen wie (3V, 1V… usw.) und digitale Signale haben (1 'und 0'). Die Sensorausgänge bestehen aus analogen Signalen und diese analogen Signale werden mithilfe von ADC in digitale Signale umgewandelt, da Mikrocontroller nur digital verstehen. Nach der Verarbeitung dieser ADC-Werte muss der Ausgang erneut in eine analoge Form umgewandelt werden, um die analogen Geräte anzusteuern. Dafür verwenden wir bestimmte Methoden wie PWM, Digital-Analog-Wandler (DAC) usw.
Was ist PWM (Puls mit Modulation)?
PWM ist eine Möglichkeit, die analogen Geräte mithilfe digitaler Werte wie der Steuerung der Motordrehzahl, der Helligkeit einer LED usw. zu steuern. Wir wissen, dass Motor und LED mit analogen Signalen arbeiten. Die PWM bietet jedoch keinen reinen Analogausgang. Die PWM sieht aus wie ein analoges Signal, das durch kurze Impulse erzeugt wird und durch das Tastverhältnis bereitgestellt wird.
Arbeitszyklus der PWM
Der Prozentsatz der Zeit, in der das PWM-Signal HIGH (Einschaltzeit) bleibt, wird als Arbeitszyklus bezeichnet. Wenn das Signal immer eingeschaltet ist, befindet es sich in einem Tastverhältnis von 100% und wenn es immer ausgeschaltet ist, ist es ein Tastverhältnis von 0%.
Arbeitszyklus = Einschaltzeit / (Einschaltzeit + Ausschaltzeit)
PWM in STM32
STM32F103C8 verfügt über 15 PWM-Pins und 10 ADC-Pins. Es gibt 7 Timer und jeder PWM-Ausgang wird von einem Kanal bereitgestellt, der mit 4 Timern verbunden ist. Es hat eine 16-Bit-PWM-Auflösung (2 16), dh Zähler und Variablen können bis zu 65535 groß sein. Bei einer Taktrate von 72 MHz kann ein PWM-Ausgang eine maximale Periode von etwa einer Millisekunde haben.
- Der Wert 65535 ergibt also die volle Helligkeit der LED und die volle Geschwindigkeit des Gleichstromlüfters (100% Einschaltdauer).
- Ebenso gibt der Wert von 32767 die HÄLFTE HELLIGKEIT der LED UND DIE HÄLFTE GESCHWINDIGKEIT des Gleichstromlüfters an (50% Einschaltdauer)
- Und der Wert von 13107 ergibt (20%) HELLIGKEIT UND (20%) GESCHWINDIGKEIT (20% Arbeitszyklus)
In diesem Tutorial verwenden wir Potentiometer und STM32, um die Helligkeit der LED und die Geschwindigkeit eines DC-Lüfters mithilfe der PWM-Technik zu variieren. Ein 16x2-LCD wird verwendet, um den ADC-Wert (0-4095) und die modifizierte Variable (PWM-Wert) anzuzeigen, die ausgegeben wird (0-65535).
Hier sind einige PWM-Beispiele mit anderen Mikrocontrollern:
- PWM mit PIC Microcontroller mit MPLAB und XC8 erzeugen
- Servomotorsteuerung mit Raspberry Pi
- Arduino-basierter LED-Dimmer mit PWM
- Pulsweitenmodulation (PWM) mit MSP430G2
Überprüfen Sie hier alle PWM-bezogenen Projekte.
Erforderliche Komponenten
- STM32F103C8
- DC-Lüfter
- ULN2003 Motortreiber-IC
- LED (ROT)
- LCD (16x2)
- Potentiometer
- Steckbrett
- Batterie 9V
- Überbrückungsdrähte
DC- Lüfter : Der hier verwendete DC-Lüfter ist ein BLDC-Lüfter von einem alten PC. Er benötigt eine externe Versorgung, daher verwenden wir eine 9-V-Gleichstrombatterie.
ULN2003 Motortreiber-IC: Dient zum Antreiben des Motors in eine Richtung, da der Motor unidirektional ist und für den Lüfter auch eine externe Stromversorgung erforderlich ist. Erfahren Sie hier mehr über die auf ULN2003 basierende Motortreiberschaltung. Unten ist das Bilddiagramm von ULN2003:
Die Pins (IN1 bis IN7) sind Eingangspins und (OUT 1 bis OUT 7) sind entsprechende Ausgangspins. COM erhält eine positive Quellenspannung, die für Ausgabegeräte erforderlich ist.
LED: Es wird eine ROTE LED verwendet, die ROTES Licht aussendet. Beliebige Farben können verwendet werden.
Potentiometer: Zwei Potentiometer werden verwendet, eines für den Spannungsteiler für den Analogeingang zum ADC und eines für die Steuerung der LED-Helligkeit.
Pin Details von STM32
Wie wir sehen können, sind die PWM-Pins im Wellenformat (~) angegeben, es gibt 15 solcher Pins, ADC-Pins sind in grüner Farbe dargestellt, 10 ADC-Pins sind dort, die für analoge Eingänge verwendet werden.
Schaltplan und Anschlüsse
Die Verbindungen von STM32 mit verschiedenen Komponenten werden nachfolgend erläutert:
STM32 mit Analogeingang (ADC)
Das Potentiometer auf der linken Seite des Stromkreises wird als Spannungsregler verwendet, der die Spannung vom 3,3-V-Pin regelt. Der Ausgang des Potentiometers, dh der mittlere Pin des Potentiometers, ist mit dem ADC-Pin (PA4) des STM32 verbunden.
STM32 mit LED
Der STM32 PWM-Ausgangspin (PA9) ist über einen Vorwiderstand und einen Kondensator mit dem positiven Pin der LED verbunden.
LED mit Widerstand und Kondensator
Ein Widerstand in Reihe und ein Kondensator parallel sind mit einer LED verbunden, um eine korrekte analoge Welle vom PWM-Ausgang zu erzeugen, da der analoge Ausgang nicht rein ist, wenn er direkt vom PWM-Pin erzeugt wird.
STM32 mit ULN2003 & ULN2003 mit Lüfter
Der STM32-PWM-Ausgangspin (PA8) ist mit dem Eingangspin (IN1) des ULN2003-IC verbunden, und der entsprechende Ausgangspin (OUT1) des ULN2003 ist mit dem Minuskabel des DC-FAN verbunden.
Der positive Pin des DC-Lüfters ist mit dem COM-Pin des ULN2003-IC verbunden, und die externe Batterie (9 V DC) ist ebenfalls mit demselben COM-Pin des ULN2003-IC verbunden. Der GND-Pin von ULN2003 ist mit dem GND-Pin von STM32 verbunden, und der Minuspol der Batterie ist mit demselben GND-Pin verbunden.
STM32 mit LCD (16x2)
LCD Pin Nr |
LCD-Pin-Name |
STM32 Pin Name |
1 |
Boden (Gnd) |
Boden (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin von der Mitte des Potentiometers |
4 |
Register Select (RS) |
PB11 |
5 |
Lesen / Schreiben (RW) |
Boden (G) |
6 |
Aktivieren (EN) |
PB10 |
7 |
Datenbit 0 (DB0) |
Keine Verbindung (NC) |
8 |
Datenbit 1 (DB1) |
Keine Verbindung (NC) |
9 |
Datenbit 2 (DB2) |
Keine Verbindung (NC) |
10 |
Datenbit 3 (DB3) |
Keine Verbindung (NC) |
11 |
Datenbit 4 (DB4) |
PB0 |
12 |
Datenbit 5 (DB5) |
PB1 |
13 |
Datenbit 6 (DB6) |
PC13 |
14 |
Datenbit 7 (DB7) |
PC14 |
15 |
LED positiv |
5V |
16 |
LED negativ |
Boden (G) |
Ein Potentiometer auf der rechten Seite steuert den Kontrast des LCD-Displays. Die obige Tabelle zeigt die Verbindung zwischen LCD und STM32.
Programmierung von STM32
Wie im vorherigen Tutorial haben wir den STM32F103C8 mit Arduino IDE über den USB-Anschluss ohne Verwendung des FTDI-Programmiergeräts programmiert. Um mehr über die Programmierung von STM32 mit Arduino IDE zu erfahren, folgen Sie dem Link. Wir können wie in Arduino programmieren. Der vollständige Code wird am Ende angegeben.
In dieser Codierung nehmen wir einen analogen Eingangswert vom ADC-Pin (PA4), der mit dem mittleren Pin des linken Potentiometers verbunden ist, und konvertieren dann den analogen Wert (0-3,3 V) in ein digitales oder ganzzahliges Format (0-4095). Dieser digitale Wert wird ferner als PWM-Ausgang zur Steuerung der LED-Helligkeit und -Drehzahl des DC-Lüfters bereitgestellt. Ein 16x2-LCD zeigt den ADC und den zugeordneten Wert (PWM-Ausgangswert) an.
Zuerst müssen wir die LCD-Header-Datei einschließen, die LCD-Pins deklarieren und sie mit dem folgenden Code initialisieren. Weitere Informationen zur Verbindung von LCD mit STM32 finden Sie hier.
#einschließen
Als nächstes deklarieren und definieren Sie die Pin-Namen mit dem Pin von STM32
const int analoginput = PA4; // Eingabe vom Potentiometer const int led = PA9; // LED-Ausgang const int fan = PA8; // Lüfterausgang
Jetzt müssen wir im Setup () einige Meldungen anzeigen und nach einigen Sekunden löschen und den INPUT-Pin und die PWM-Ausgangspins angeben
lcd.begin (16,2); // LCD fertig machen lcd.clear (); // Löscht LCD lcd.setCursor (0,0); // Setzt den Cursor auf row0 und column0 lcd.print ("CIRCUIT DIGEST"); // Zeigt Circuit Digest an lcd.setCursor (0,1); // Setzt den Cursor auf column0 und row1 lcd.print ("PWM USING STM32"); // Zeigt PWM mit STM32 delay (2000) an; // Verzögerungszeit lcd.clear (); // Löscht den LCD- PinMode (Analogeingang, INPUT); // Pin Mode Analogeingang als INPUT PinMode (LED, PWM) setzen; // Pin-Modus- LED als PWM-Ausgang einstellen pinMode (Lüfter, PWM); // Pin-Modus-Lüfter als PWM-Ausgang einstellen
Der Analogeingangspin (PA4) wird von PinMode (Analogeingang, INPUT) als INPUT , der LED-Pin von PinMode ( LED , PWM) als PWM-Ausgang und der Lüfterstift von PinMode (Lüfter, PWM) als PWM-Ausgang gesetzt . Hier sind die PWM-Ausgangspins mit LED (PA9) und Lüfter (PA8) verbunden.
Als nächstes lesen wir in der Funktion void loop () das analoge Signal vom ADC-Pin (PA4) und speichern es in einer ganzzahligen Variablen, die die analoge Spannung in digitale ganzzahlige Werte (0-4095) umwandelt, indem wir den folgenden Code verwenden: int valueeadc = analogRead (analoger Eingang));
Wichtig hierbei ist, dass PWM-Pins, dh Kanäle von STM32, eine 16-Bit-Auflösung (0-65535) haben. Daher müssen wir diese mit analogen Werten abbilden, indem wir die Abbildungsfunktion wie unten verwenden
int result = map (valueeadc, 0, 4095, 0, 65535).
Wenn kein Mapping verwendet wird, erhalten wir durch Variieren des Potentiometers nicht die volle Lüftergeschwindigkeit oder die volle Helligkeit der LED.
Dann schreiben wir den PWM-Ausgang mit pwmWrite ( LED , Ergebnis) auf die LED und den PWM-Ausgang mit den Funktionen pwmWrite (Lüfter, Ergebnis ) auf den Lüfter.
Schließlich zeigen wir den analogen Eingangswert (ADC-Wert) und die Ausgangswerte (PWM-Werte) auf dem LCD-Display mit den folgenden Befehlen an
lcd.setCursor (0,0); // Setzt den Cursor auf row0 und column0 lcd.print ("ADC value ="); // druckt die Wörter "" lcd.print (valueeadc); // zeigt valueeadc lcd.setCursor (0,1) an; // Setzt den Cursor auf column0 und row1 lcd.print ("Output ="); // druckt die Wörter in "" lcd.print (Ergebnis); // zeigt das Wertergebnis an
Der vollständige Code mit einem Demonstrationsvideo ist unten angegeben.