- Wat is PWM (Pulse with Modulation)?
- PWM in STM32
- Componenten vereist
- Pin Details van STM32
- Schakelschema en aansluitingen
- Programmering STM32
In het vorige artikel hebben we gezien over ADC-conversie met STM32. In deze tutorial zullen we leren over PWM (Pulse Width Modulation) in STM32 en hoe we de helderheid van de LED of de snelheid van de DC-ventilator kunnen regelen met behulp van PWM-techniek.
We weten dat er twee soorten signalen zijn: analoog en digitaal. Analoge signalen hebben spanningen zoals (3V, 1V… etc) en digitale signalen hebben (1 'en 0'en). Sensorenuitgangen zijn van analoge signalen en deze analoge signalen worden met ADC omgezet in digitaal, omdat microcontrollers alleen digitaal begrijpen. Na het verwerken van die ADC-waarden, moet de uitvoer opnieuw worden omgezet in analoge vorm om de analoge apparaten aan te sturen. Daarvoor gebruiken we bepaalde methoden zoals PWM, Digitaal naar Analoog (DAC) converters etc.
Wat is PWM (Pulse with Modulation)?
PWM is een manier om de analoge apparaten te besturen met behulp van digitale waarden, zoals het regelen van de motorsnelheid, de helderheid van een led enz. We weten dat motor en led werken op een analoog signaal. Maar de PWM biedt geen pure analoge output, PWM ziet eruit als een analoog signaal gemaakt door korte pulsen, die wordt geleverd door de duty-cycle.
Inschakelduur van de PWM
Het percentage van de tijd waarin het PWM-signaal HOOG (op tijd) blijft, wordt de duty-cycle genoemd. Als het signaal altijd AAN is, is het in 100% inschakelduur en als het altijd uit is, is het 0% inschakelduur.
Duty Cycle = Inschakeltijd / (Inschakeltijd + Uitschakeltijd)
PWM in STM32
STM32F103C8 heeft 15 PWM-pinnen en 10 ADC-pinnen. Er zijn 7 timers en elke PWM-uitgang wordt geleverd door een kanaal dat is verbonden met 4 timers. Het heeft een 16-bits PWM-resolutie (2 16), dat wil zeggen tellers en variabelen kunnen zo groot zijn als 65535. Met een kloksnelheid van 72 MHz kan een PWM-uitgang een maximale periode van ongeveer één milliseconde hebben.
- Dus waarde van 65535 geeft VOLLEDIGE HELDERHEID van LED EN VOLLEDIGE SNELHEID van DC-ventilator (100% inschakelduur)
- Dezelfde waarde van 32767 geeft HALVE HELDERHEID van LED EN HALVE SNELHEID van DC-ventilator (50% inschakelduur)
- En de waarde van 13107 geeft (20%) HELDERHEID EN (20%) SNELHEID (20% inschakelduur)
In deze tutorial gebruiken we een potentiometer en STM32 om de helderheid van LED en snelheid van een DC-ventilator te variëren met PWM-techniek. Een 16x2 LCD-scherm wordt gebruikt om de ADC-waarde (0-4095) en de gewijzigde variabele (PWM-waarde) die wordt uitgevoerd (0-65535) weer te geven.
Hier zijn enkele PWM-voorbeelden met andere microcontrollers:
- PWM genereren met behulp van PIC Microcontroller met MPLAB en XC8
- Servomotorbesturing met Raspberry Pi
- Arduino-gebaseerde LED-dimmer met PWM
- Pulsbreedtemodulatie (PWM) met MSP430G2
Bekijk hier alle PWM-gerelateerde projecten.
Componenten vereist
- STM32F103C8
- DC-ventilator
- ULN2003 Motorbesturing IC
- LED (ROOD)
- LCD (16x2)
- Potentiometer
- Breadboard
- Batterij 9V
- Doorverbindingsdraden
DC-ventilator: De DC-ventilator die hier wordt gebruikt, is een BLDC-ventilator van een oude pc. Het vereist een externe voeding, dus we gebruiken een 9V DC-batterij.
ULN2003 Motor Driver IC: het wordt gebruikt om de motor in één richting aan te drijven, aangezien de motor unidirectioneel is en er ook externe voeding nodig is voor de ventilator. Lees hier meer over het op ULN2003 gebaseerde motorstuurcircuit. Hieronder is het pic diagram van ULN2003:
Pinnen (IN1 tot IN7) zijn invoerpinnen en (OUT 1 tot OUT 7) zijn overeenkomstige uitvoerpinnen. COM krijgt een positieve bronspanning die nodig is voor uitvoerapparaten.
LED: Er wordt een RODE gekleurde led gebruikt die ROOD licht uitstraalt. Alle kleuren kunnen worden gebruikt.
Potentiometers: Er worden twee potentiometers gebruikt, een is voor spanningsdeler voor analoge invoer naar ADC en een andere is voor het regelen van de helderheid van de led.
Pin Details van STM32
Zoals we kunnen zien, zijn de PWM-pinnen aangegeven in wave-formaat (~), zijn er 15 van dergelijke pinnen, ADC-pinnen worden weergegeven in een groene kleur, 10 ADC-pinnen zijn er die worden gebruikt voor analoge ingangen.
Schakelschema en aansluitingen
Verbindingen van STM32 met verschillende componenten worden hieronder uitgelegd:
STM32 met analoge ingang (ADC)
De potentiometer aan de linkerkant van het circuit wordt gebruikt als spanningsregelaar die de spanning regelt van de 3.3V-pin. De output van de potentiometer, dwz de middelste pin van de potentiometer, is verbonden met de ADC-pin (PA4) van STM32.
STM32 met LED
De STM32 PWM output pin (PA9) is via een serieweerstand en een condensator verbonden met de positieve pin van LED.
LED met weerstand en condensator
Een weerstand in serie en een condensator in parallel zijn verbonden met LED om de juiste analoge golf van PWM-uitvoer te genereren, aangezien analoge uitvoer niet zuiver is wanneer deze rechtstreeks wordt gegenereerd vanaf de PWM-pin.
STM32 met ULN2003 en ULN2003 met ventilator
STM32 PWM output pin (PA8) is verbonden met de Input pin (IN1) van ULN2003 IC en de corresponderende output pin (OUT1) van ULN2003 is verbonden met negatieve draad van de DC FAN.
Positieve pin van de DC-ventilator is verbonden met de COM-pin van de ULN2003 IC en de externe batterij (9V DC) is ook verbonden met dezelfde COM-pin van de ULN2003 IC. De GND-pin van ULN2003 is verbonden met de GND-pin van STM32 en de negatieve batterij is verbonden met dezelfde GND-pin.
STM32 met LCD (16x2)
LCD Pin Nr |
Naam LCD-pincode |
STM32 Pin-naam |
1 |
Grond (Gnd) |
Aarde (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin van Center of Potentiometer |
4 |
Registreren Select (RS) |
PB11 |
5 |
Lezen / schrijven (RW) |
Aarde (G) |
6 |
Inschakelen (EN) |
PB10 |
7 |
Gegevensbit 0 (DB0) |
Geen verbinding (NC) |
8 |
Gegevensbit 1 (DB1) |
Geen verbinding (NC) |
9 |
Gegevensbit 2 (DB2) |
Geen verbinding (NC) |
10 |
Gegevensbit 3 (DB3) |
Geen verbinding (NC) |
11 |
Gegevensbit 4 (DB4) |
PB0 |
12 |
Gegevensbit 5 (DB5) |
PB1 |
13 |
Gegevensbit 6 (DB6) |
PC13 |
14 |
Gegevensbit 7 (DB7) |
PC14 |
15 |
LED Positief |
5V |
16 |
LED negatief |
Aarde (G) |
Een potentiometer aan de rechterkant wordt gebruikt om het contrast van het LCD-scherm te regelen. De bovenstaande tabel toont de verbinding tussen LCD en STM32.
Programmering STM32
Net als de vorige tutorial hebben we de STM32F103C8 geprogrammeerd met Arduino IDE via USB-poort zonder FTDI-programmeur te gebruiken. Volg de link voor meer informatie over het programmeren van STM32 met Arduino IDE. We kunnen doorgaan met programmeren zoals in Arduino. De volledige code wordt aan het einde gegeven.
In deze codering gaan we een analoge ingangswaarde nemen van de ADC-pin (PA4) die is verbonden met de middelste pin van de linker potentiometer en vervolgens de analoge waarde (0-3,3 V) converteren naar een digitaal of integer-formaat (0-4095). Deze digitale waarde wordt verder geleverd als PWM-uitgang om de LED-helderheid en snelheid van de DC-ventilator te regelen. Een 16x2 LCD-scherm wordt gebruikt om ADC en toegewezen waarde (PWM-uitvoerwaarde) weer te geven.
Eerst moeten we een LCD-headerbestand toevoegen, LCD-pinnen declareren en deze initialiseren met behulp van onderstaande code. Lees hier meer over het koppelen van LCD met STM32.
# omvatten
Declareer en definieer vervolgens de pinnamen met behulp van de pincode van STM32
const int analoginput = PA4; // Input van potentiometer const int led = PA9; // LED-uitgang const int fan = PA8; // ventilatoruitgang
Nu moeten we in de setup () enkele berichten weergeven en deze na een paar seconden wissen en de INPUT-pin en PWM-uitvoerpinnen specificeren
lcd.begin (16,2); // LCD voorbereiden lcd.clear (); // Wist LCD lcd.setCursor (0,0); // Zet de cursor op row0 en column0 lcd.print ("CIRCUIT DIGEST"); // Geeft Circuit Digest lcd.setCursor (0,1) weer; // Stelt Cursor in op column0 en row1 lcd.print ("PWM USING STM32"); // Geeft PWM weer met STM32- vertraging (2000); // Vertragingstijd lcd.clear (); // Wist LCD pinMode (analoge ingang, INPUT); // stel de analoge ingang van de pin-modus in als INPUT pinMode (led, PWM); // set pin mode led als PWM output pinMode (fan, PWM); // stel de pin-modusventilator in als PWM-uitgang
De analoge ingangspen (PA4) is ingesteld als INPUT via pinMode (analoge ingang, INPUT), LED-pin is ingesteld als PWM-uitgang door pinMode (led, PWM) en ventilatorpen is ingesteld als PWM-uitgang door pinMode (ventilator, PWM) . Hier zijn de PWM-uitgangspennen verbonden met LED (PA9) en Fan (PA8).
Vervolgens lezen we in de functie void loop () het analoge signaal van de ADC-pin (PA4) en slaan het op in een integer-variabele die analoog voltage omzet in digitale integer-waarden (0-4095) door onderstaande code te gebruiken int valueadc = analogRead (analoginput);
Belangrijk om hier op te merken zijn PWM-pinnen, dat zijn kanalen van STM32 met een resolutie van 16 bits (0-65535), dus we moeten dat in kaart brengen met analoge waarden met behulp van de kaartfunctie zoals hieronder
int resultaat = kaart (valueadc, 0, 4095, 0, 65535).
Als mapping niet wordt gebruikt, krijgen we niet de volledige snelheid van de ventilator of de volledige helderheid van de LED door de potentiometer te variëren.
Vervolgens schrijven we de PWM-uitvoer naar de LED met behulp van pwmWrite (led, resultaat) en PWM-uitvoer naar ventilator met behulp van pwmWrite (ventilator, resultaat ) -functies.
Ten slotte geven we de analoge ingangswaarde (ADC-waarde) en de uitgangswaarden (PWM-waarden) weer op het LCD-scherm met behulp van de volgende opdrachten
lcd.setCursor (0,0); // Zet de cursor op row0 en column0 lcd.print ("ADC value ="); // drukt de woorden "" lcd.print (valueadc) af; // geeft valueadc lcd.setCursor (0,1) weer; // Stelt Cursor in op column0 en row1 lcd.print ("Output ="); // drukt de woorden af in "" lcd.print (resultaat); // geeft waarderesultaat weer
Volledige code met een demonstratievideo wordt hieronder gegeven.