- Hvad er PWM (puls med modulering)?
- PWM i STM32
- Komponenter, der kræves
- Pin detaljer for STM32
- Kredsløbsdiagram og forbindelser
- Programmering STM32
I forrige artikel har vi set om ADC-konvertering ved hjælp af STM32. I denne vejledning lærer vi om PWM (Pulse Width Modulation) i STM32, og hvordan kan vi styre lysstyrken på LED eller DC-blæserens hastighed ved hjælp af PWM-teknik.
Vi ved, at der er to typer signaler: Analog og Digital. Analoge signaler har spændinger som (3V, 1V… osv.), Og digitale signaler har (1 'og 0'er). Sensorudgange er af analoge signaler, og disse analoge signaler konverteres til digital ved hjælp af ADC, fordi mikrocontrollere kun forstår digital. Efter behandling af disse ADC-værdier skal output igen konverteres til analog form for at drive de analoge enheder. Til det bruger vi visse metoder som PWM, Digital til Analog (DAC) konvertere osv.
Hvad er PWM (puls med modulering)?
PWM er en måde at styre de analoge enheder ved hjælp af digital værdi som at kontrollere motorens hastighed, lysstyrke på en led osv. Vi ved, at motor og led fungerer på analogt signal. Men PWM giver ikke ren analog udgang, PWM ligner analogt signal lavet af korte impulser, som leveres af driftscyklus.
PWM's driftscyklus
Den procentdel af tid, hvor PWM-signalet forbliver HØJ (til tiden) kaldes som driftscyklus. Hvis signalet altid er TIL, er det i 100% driftscyklus, og hvis det altid er slukket, er det 0% driftscyklus.
Arbejdscyklus = Tænd tid / (Tænd tid + Sluk tid)
PWM i STM32
STM32F103C8 har 15 PWM-ben og 10 ADC-ben. Der er 7 timere, og hver PWM-udgang leveres af en kanal, der er forbundet til 4 timere. Den har 16-bit PWM-opløsning (2 16), dvs. tællere, og variabler kan være så store som 65535. Med en 72MHz urfrekvens kan en PWM-udgang have en maksimal periode på ca. en millisekund.
- Så værdi på 65535 giver FULD LYSSTYRKE af LED OG FULD HASTIGHED af jævnstrømsventilator (100% driftscyklus)
- Ligeledes værdi af 32767 giver HALF LYSSTYRKE af LED OG HALVE HASTIGHED af DC-blæser (50% driftscyklus)
- Og værdien 13107 giver (20%) LYSSTYRKE OG (20%) HASTIGHED (20% driftscyklus)
I denne vejledning bruger vi potentiometer og STM32 til at variere lysstyrken på LED og hastigheden på en jævnstrømsventilator ved hjælp af PWM-teknik. En 16x2 LCD bruges til at vise ADC-værdi (0-4095) og den modificerede variabel (PWM-værdi), der sendes (0-65535).
Her er få PWM-eksempler med anden Microcontroller:
- Generering af PWM ved hjælp af PIC Microcontroller med MPLAB og XC8
- Servomotorstyring med Raspberry Pi
- Arduino-baseret LED-dæmper ved hjælp af PWM
- Pulsbreddemodulation (PWM) ved hjælp af MSP430G2
Tjek alle PWM-relaterede projekter her.
Komponenter, der kræves
- STM32F103C8
- DC-blæser
- ULN2003 Motor Driver IC
- LED (RØD)
- LCD (16x2)
- Potentiometer
- Brødbræt
- Batteri 9V
- Jumper Wires
DC-ventilator: DC-ventilatoren, der bruges her, er BLDC-ventilator fra en gammel pc. Det kræver en ekstern forsyning, så vi bruger et 9V DC-batteri.
ULN2003 Motor Driver IC: Det bruges til at køre motoren i en retning, da motoren er ensrettet, og ekstern strøm kræves også til blæseren. Lær mere om ULN2003-baseret motor driver kredsløb her. Nedenfor er billeddiagrammet for ULN2003:
Pins (IN1 til IN7) er input pins og (OUT 1 til OUT 7) er tilsvarende output pins. COM gives Positiv kildespænding krævet til outputenheder.
LED: RØD farvet led bruges, der udsender RØDt lys. Alle farver kan bruges.
Potentiometre: Der anvendes to potentiometre, den ene er til spændingsdeler til analog indgang til ADC, og en anden til styring af lysstyrken på LED.
Pin detaljer for STM32
Som vi kan se, er PWM-stifter angivet i bølgeformat (~), der er 15 sådanne stifter, ADC-stifter er repræsenteret i grøn farve, 10 ADC-stifter er der, der bruges til analoge indgange.
Kredsløbsdiagram og forbindelser
Forbindelser af STM32 med forskellige komponenter forklares som nedenfor:
STM32 med analog indgang (ADC)
Potentiometeret til stede i venstre side af kredsløbet bruges som spændingsregulator, der regulerer spænding fra 3,3 V-stiften. Outputtet fra potentiometeret, dvs. centrumstiften på potentiometeret, er forbundet til ADC-stiften (PA4) på STM32.
STM32 med LED
STM32 PWM-udgangsstiften (PA9) er forbundet til den positive stift af LED gennem en seriemodstand og en kondensator.
LED med modstand og kondensator
En seriemodstand og en kondensator parallelt er forbundet med LED for at generere korrekt analog bølge fra PWM-udgang, da analog udgang ikke er ren, når den genereres direkte fra PWM-pin.
STM32 med ULN2003 & ULN2003 med blæser
STM32 PWM-udgangsstift (PA8) er forbundet til indgangsstiften (IN1) på ULN2003 IC, og den tilsvarende udgangsstift (OUT1) på ULN2003 er forbundet til negativ ledning på DC FAN.
Positiv stift på jævnstrømsventilatoren er tilsluttet COM-stiften på ULN2003 IC, og det eksterne batteri (9V DC) er også tilsluttet den samme COM-stift på ULN2003 IC. GND-stift på ULN2003 er forbundet til GND-stift på STM32, og batterinegativet er forbundet til samme GND-stift.
STM32 med LCD (16x2)
LCD-stift nr |
LCD-pin-navn |
STM32 Pin-navn |
1 |
Jord (GND) |
Jord (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin fra Center of Potentiometer |
4 |
Registrer Vælg (RS) |
PB11 |
5 |
Læs / skriv (RW) |
Jord (G) |
6 |
Aktivér (EN) |
PB10 |
7 |
Databit 0 (DB0) |
Ingen forbindelse (NC) |
8 |
Databit 1 (DB1) |
Ingen forbindelse (NC) |
9 |
Databit 2 (DB2) |
Ingen forbindelse (NC) |
10 |
Databit 3 (DB3) |
Ingen forbindelse (NC) |
11 |
Data Bit 4 (DB4) |
PB0 |
12 |
Databit 5 (DB5) |
PB1 |
13 |
Databit 6 (DB6) |
PC13 |
14 |
Databit 7 (DB7) |
PC14 |
15 |
LED Positiv |
5V |
16 |
LED negativ |
Jord (G) |
Et potentiometer på højre side bruges til at kontrollere LCD-displayets kontrast. Ovenstående tabel viser forbindelsen mellem LCD og STM32.
Programmering STM32
Som den foregående tutorial programmerede vi STM32F103C8 med Arduino IDE gennem USB-port uden at bruge FTDI-programmerer. For at lære om programmering af STM32 med Arduino IDE, følg linket. Vi kan fortsætte programmeringen som i Arduino. Komplet kode gives i slutningen.
I denne kodning skal vi tage en indgangsanalogværdi fra ADC-pin (PA4), der er forbundet til midterstiften på venstre potentiometer og derefter konvertere den analoge værdi (0-3.3V) til digitalt eller heltal format (0-4095). Denne digitale værdi leveres yderligere som PWM-udgang til styring af lysstyrke og hastighed for jævnstrømsventilator. Et 16x2 LCD bruges til at vise ADC og kortlagt værdi (PWM output værdi).
Først skal vi medtage LCD-header-fil, erklære LCD-ben og initialisere dem ved hjælp af nedenstående kode. Lær mere om grænseflade mellem LCD og STM32 her.
#omfatte
Dernæst erklær og definer pinnavne ved hjælp af STM32-stiften
const int analoginput = PA4; // Indgang fra potentiometerkonst int led = PA9; // LED-udgang const int fan = PA8; // fan output
Nu inde i opsætningen () skal vi vise nogle meddelelser og rydde dem efter få sekunder og angive INPUT-pin- og PWM-output-pins
lcd.begin (16,2); // Gør LCD klar LCD.clear (); // Rydder LCD lcd.setCursor (0,0); // Indstiller markør ved række0 og kolonne0 lcd.print ("CIRCUIT DIGEST"); // Viser Circuit Digest lcd.setCursor (0,1); // Indstiller markør ved kolonne0 og række1 lcd.print ("PWM BRUGER STM32"); // Viser PWM ved hjælp af STM32 forsinkelse (2000); // Forsinkelsestid lcd.clear (); // Rydder LCD pinMode (analogindgang, INPUT); // indstil pin mode analoginput som INPUT pinMode (led, PWM); // indstil pin-tilstand ført som PWM-udgang pinMode (ventilator, PWM); // indstil pin-mode-blæser som PWM-udgang
Den analoge indgangsstift (PA4) er indstillet som INPUT af pinMode (analoginput, INPUT), LED-pin er indstillet som PWM-output ved pinMode (led, PWM), og ventilatorstift er indstillet som PWM-output ved pinMode (ventilator, PWM) . Her er PWM-udgangsstifter tilsluttet LED (PA9) og blæser (PA8).
Næste i ugyldig sløjfe () -funktion læser vi det analoge signal fra ADC-stiften (PA4) og gemmer det i et heltalsvariabel, der konverterer analog spænding til digitale heltalværdier (0-4095) ved hjælp af nedenstående kode int valueadc = analogRead (analoginput);
Vigtig ting at bemærke her er PWM-ben, der er kanaler i STM32 med 16-bit opløsning (0-65535), så vi skal kortlægge det med analoge værdier ved hjælp af kortfunktion som nedenfor
int-resultat = kort (valueadc, 0, 4095, 0, 65535).
Hvis kortlægning ikke bruges, får vi ikke fuld blæserhastighed eller fuld lysstyrke på LED ved at variere potentiometeret.
Derefter skriver vi PWM-output til LED'en ved hjælp af pwmWrite (led, resultat) og PWM-output til ventilator ved hjælp af pwmWrite (ventilator, resultat ) -funktioner.
Endelig viser vi den analoge inputværdi (ADC-værdi) og outputværdierne (PWM-værdier) på LCD-skærmen ved hjælp af følgende kommandoer
lcd.setCursor (0,0); // Indstiller markør ved række0 og kolonne0 lcd.print ("ADC værdi ="); // udskriver ordene “” lcd.print (valueadc); // viser valueadc lcd.setCursor (0,1); // Indstiller markør ved kolonne0 og række1 lcd.print ("Output ="); // udskriver ordene i "" lcd.print (resultat); // viser værdiresultat
Komplet kode med en demonstrationsvideo er angivet nedenfor.