- Hva er PWM (Pulse with Modulation)?
- PWM i STM32
- Komponenter kreves
- Pinnedetaljer for STM32
- Kretsdiagram og tilkoblinger
- Programmering STM32
I forrige artikkel har vi sett om ADC-konvertering ved hjelp av STM32. I denne veiledningen vil vi lære om PWM (Pulse Width Modulation) i STM32, og hvordan kan vi kontrollere lysstyrken på LED eller hastigheten på DC-viften ved hjelp av PWM-teknikk.
Vi vet at det er to typer signaler: Analog og Digital. Analoge signaler har spenninger som (3V, 1V… etc) og digitale signaler har (1 'og 0's). Sensorutgangene er av analoge signaler, og disse analoge signalene konverteres til digitale ved hjelp av ADC, fordi mikrokontrollere bare forstår digital. Etter å ha behandlet disse ADC-verdiene, må utgangen igjen konverteres til analog form for å drive de analoge enhetene. For det bruker vi visse metoder som PWM, Digital to Analog (DAC) omformere etc.
Hva er PWM (Pulse with Modulation)?
PWM er en måte å kontrollere de analoge enhetene ved å bruke digital verdi som å kontrollere motorens hastighet, lysstyrken til en ledd osv. Vi vet at motor og led fungerer på analogt signal. Men PWM gir ikke ren analog utgang, PWM ser ut som analogt signal laget av korte pulser, som leveres av driftssyklus.
Driftssyklus for PWM
Prosentandelen av tid PWM-signalet forblir HØY (i tide) kalles som driftssyklus. Hvis signalet alltid er PÅ, er det i 100% driftssyklus, og hvis det alltid er av, er det 0% driftssyklus.
Driftssyklus = Slå på tid / (Slå på tid + slå av tid)
PWM i STM32
STM32F103C8 har 15 PWM-pinner og 10 ADC-pinner. Det er 7 tidtakere, og hver PWM-utgang leveres av en kanal som er koblet til fire tidtakere. Den har 16-biters PWM-oppløsning (2 16), det vil si tellere og variabler kan være så store som 65535. Med en 72MHz klokkefrekvens kan en PWM-utgang ha en maksimumsperiode på omtrent ett millisekund.
- Så verdien av 65535 gir FULL BRIGHTNESS av LED OG FULL HASTIGHET av DC Fan (100% Duty Cycle)
- Likeledes gir verdien 32767 HALV LYSSTYRKE på LED OG HALV HASTIGHET på DC-vifte (50% driftssyklus)
- Og verdien 13107 gir (20%) LYSSTYRKE OG (20%) HASTIGHET (20% driftssyklus)
I denne opplæringen bruker vi potensiometer og STM32 for å variere lysstyrken på LED og hastigheten til en DC-vifte ved PWM-teknikk. En 16x2 LCD brukes til å vise ADC-verdi (0-4095) og den modifiserte variabelen (PWM-verdi) som sendes ut (0-65535).
Her er noen PWM-eksempler med annen Microcontroller:
- Genererer PWM ved hjelp av PIC Microcontroller med MPLAB og XC8
- Servomotorstyring med Raspberry Pi
- Arduino-basert LED-dimmer ved bruk av PWM
- Pulsbreddemodulering (PWM) ved bruk av MSP430G2
Sjekk alle PWM-relaterte prosjekter her.
Komponenter kreves
- STM32F103C8
- DC vifte
- ULN2003 Motor Driver IC
- LED (RØD)
- LCD (16x2)
- Potensiometer
- Brettbrett
- Batteri 9V
- Jumper Wires
DC-vifte: DC-viften som brukes her er BLDC-vifte fra en gammel PC. Det krever en ekstern forsyning, så vi bruker et 9V DC-batteri.
ULN2003 Motor Driver IC: Den brukes til å kjøre motoren i en retning ettersom motoren er ensrettet og det kreves også ekstern strøm for viften. Lær mer om ULN2003-basert motorførerkrets her. Nedenfor er bildediagrammet til ULN2003:
Pins (IN1 til IN7) er inngangspinner og (OUT 1 til OUT 7) er tilsvarende utgangspinner. COM er gitt Positiv kildespenning som kreves for utgangsenheter.
LED: RØD farget LED brukes som avgir RØDT lys. Alle farger kan brukes.
Potensiometre: To potensiometre brukes, det ene er for spenningsdeler for analog inngang til ADC, og et annet er for å kontrollere lysstyrken på LED.
Pinnedetaljer for STM32
Som vi kan se, er PWM-pinnene indikert i bølgeformat (~), det er 15 slike pinner, ADC-pinner er representert i grønn farge, 10 ADC-pinner er der som brukes til analoge innganger.
Kretsdiagram og tilkoblinger
Tilkoblinger av STM32 med forskjellige komponenter forklares som nedenfor:
STM32 med analog inngang (ADC)
Potensiometeret til stede på venstre side av kretsen brukes som spenningsregulator som regulerer spenningen fra 3,3 V-pinnen. Utgangen fra potensiometeret, dvs. senterpinnen til potensiometeret, er koblet til ADC-pinnen (PA4) på STM32.
STM32 med LED
STM32 PWM-utgangspinnen (PA9) er koblet til den positive pinnen til LED gjennom en seriemotstand og en kondensator.
LED med motstand og kondensator
En motstand i serie og en kondensator parallelt er koblet til LED for å generere riktig Analog bølge fra PWM-utgang, ettersom analog utgang ikke er ren fra når den genereres direkte fra PWM-pin.
STM32 med ULN2003 & ULN2003 med vifte
STM32 PWM-utgangspinne (PA8) er koblet til inngangspinnen (IN1) på ULN2003 IC, og den tilsvarende utgangspinnen (OUT1) til ULN2003 er koblet til negativ ledning på DC FAN.
Positiv pinne på DC-viften er koblet til COM-pinnen på ULN2003 IC, og det eksterne batteriet (9V DC) er også koblet til den samme COM-pinnen på ULN2003 IC. GND-pin på ULN2003 er koblet til GND-pin på STM32, og batterinegativ er koblet til samme GND-pin.
STM32 med LCD (16x2)
LCD-pinne nr |
LCD-pinnens navn |
STM32 Pin-navn |
1 |
Bakken (GND) |
Bakken (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin fra senter for potensiometer |
4 |
Registrer Velg (RS) |
PB11 |
5 |
Les / skriv (RW) |
Bakken (G) |
6 |
Aktiver (EN) |
PB10 |
7 |
Databit 0 (DB0) |
Ingen tilkobling (NC) |
8 |
Databit 1 (DB1) |
Ingen tilkobling (NC) |
9 |
Databit 2 (DB2) |
Ingen tilkobling (NC) |
10 |
Databit 3 (DB3) |
Ingen tilkobling (NC) |
11 |
Data Bit 4 (DB4) |
PB0 |
12 |
Databit 5 (DB5) |
PB1 |
1. 3 |
Databit 6 (DB6) |
PC13 |
14 |
Databit 7 (DB7) |
PC14 |
15 |
LED-positiv |
5V |
16 |
LED negativ |
Bakken (G) |
Et potensiometer på høyre side brukes til å kontrollere kontrasten på LCD-skjermen. Tabellen ovenfor viser forbindelsen mellom LCD og STM32.
Programmering STM32
Som den forrige veiledningen programmerte vi STM32F103C8 med Arduino IDE gjennom USB-port uten å bruke FTDI-programmerer. For å lære om programmering av STM32 med Arduino IDE, følg lenken. Vi kan fortsette programmeringen som i Arduino. Komplett kode er gitt på slutten.
I denne kodingen skal vi ta en inngangsanalogverdi fra ADC-pinnen (PA4) som er koblet til midtpinnen til venstre potensiometer og deretter konvertere den analoge verdien (0-3.3V) til digitalt eller heltallformat (0-4095). Denne digitale verdien er videre gitt som PWM-utgang for å kontrollere lysstyrken og hastigheten til DC-viften. En 16x2 LCD brukes til å vise ADC og tilordnet verdi (PWM-utgangsverdi).
Først må vi inkludere LCD-header-fil, erklære LCD-pinner og initialisere dem ved hjelp av koden nedenfor. Lær mer om grensesnitt LCD med STM32 her.
#inkludere
Neste erklær og definer pinnavn ved hjelp av pinnen til STM32
const int analoginngang = PA4; // Inngang fra potensiometer const int led = PA9; // LED-utgang const int fan = PA8; // vifteutgang
Nå inne i oppsettet () , må vi vise noen meldinger og fjerne dem etter få sekunder og spesifisere INPUT-pin og PWM-utgangspinn
lcd.begin (16,2); // Gjør LCD klar LCD.clear (); // Fjerner LCD lcd.setCursor (0,0); // Setter markør ved rad 0 og kolonne 0 lcd.print ("KRETSDIGEST"); // Viser Circuit Digest lcd.setCursor (0,1); // Setter markør ved kolonne0 og rad1 lcd.print ("PWM USING STM32"); // Viser PWM ved bruk av STM32 forsinkelse (2000); // Forsinkelsestid lcd.clear (); // Tømmer LCD pinMode (analoginngang, INPUT); // angi pin-modus analoginngang som INPUT pinMode (led, PWM); // sett pin-modus ledet som PWM-utgang pinMode (vifte, PWM); // still pin-modusvifte som PWM-utgang
Den analoge inngangspinnen (PA4) er angitt som INPUT av pinMode (analoginngang, INPUT), LED-pinnen er angitt som PWM-utgang av pinMode (ledet, PWM) og viftepinnen er satt som PWM-utgang av pinMode (fan, PWM) . Her er PWM-utgangspinnene koblet til LED (PA9) og Vifte (PA8).
Neste i void loop () -funksjonen, leser vi det analoge signalet fra ADC-pinnen (PA4) og lagrer det i et heltallvariabel som konverterer analog spenning til digitale heltallverdier (0-4095) ved å bruke koden nedenfor int valueadc = analogRead (analoginngang));
Viktig ting å merke seg her er PWM-pinner som er kanaler til STM32 har 16-biters oppløsning (0-65535), så vi må kartlegge det med analoge verdier ved hjelp av kartfunksjon som nedenfor
int resultat = kart (valueadc, 0, 4095, 0, 65535).
Hvis kartlegging ikke brukes, får vi ikke full hastighet på viften eller full lysstyrke på LED ved å variere potensiometeret.
Deretter skriver vi PWM-utgangen til LED-en ved å bruke pwmWrite (led, resultat) og PWM-utgang til vifte ved å bruke pwmWrite (fan, result ) -funksjoner.
Til slutt viser vi den analoge inngangsverdien (ADC-verdien) og utgangsverdiene (PWM-verdiene) på LCD-skjermen ved å bruke følgende kommandoer
lcd.setCursor (0,0); // Setter markør på rad 0 og kolonne 0 lcd.print ("ADC value ="); // skriver ordene “” lcd.print (valueadc); // viser valueadc lcd.setCursor (0,1); // Setter markør ved kolonne0 og rad1 lcd.print ("Output ="); // skriver ordene i "" lcd.print (resultat); // viser verdiresultat
Komplett kode med en demonstrasjonsvideo er gitt nedenfor.