- Vad är PWM (puls med modulering)?
- PWM i STM32
- Komponenter krävs
- Stiftdetaljer för STM32
- Kretsschema och anslutningar
- Programmering STM32
I tidigare artikel har vi sett om ADC-konvertering med STM32. I denna handledning lär vi oss om PWM (Pulse Width Modulation) i STM32 och hur kan vi kontrollera ljusstyrkan på LED eller hastigheten på DC-fläkten med hjälp av PWM-teknik.
Vi vet att det finns två typer av signaler: Analog och Digital. Analoga signaler har spänningar som (3V, 1V… etc) och digitala signaler har (1 'och 0's). Sensors utgångar är av analoga signaler och dessa analoga signaler omvandlas till digitala med ADC, eftersom mikrokontroller bara förstår digital. Efter bearbetning av dessa ADC-värden måste utgången omvandlas till analog form för att driva de analoga enheterna. För det använder vi vissa metoder som PWM, Digital till Analog (DAC) omvandlare etc.
Vad är PWM (puls med modulering)?
PWM är ett sätt att styra de analoga enheterna med hjälp av digitala värden som att styra motorns hastighet, ljusstyrka hos en lysdiod etc. Vi vet att motor och led fungerar på analog signal. Men PWM tillhandahåller inte ren analog utgång, PWM ser ut som analog signal gjord av korta pulser, som tillhandahålls av arbetscykel.
PWM: s arbetscykel
Procentandelen tid under vilken PWM-signalen förblir HÖG (i tid) kallas som arbetscykel. Om signalen alltid är PÅ är den i 100% arbetscykel och om den alltid är av är den 0% arbetscykel.
Driftscykel = Slå PÅ-tid / (Slå PÅ-tid + Stäng av tid)
PWM i STM32
STM32F103C8 har 15 PWM-stift och 10 ADC-stift. Det finns 7 timers och varje PWM-utgång tillhandahålls av en kanal ansluten till 4 timers. Den har 16-bitars PWM-upplösning (2 16), det vill säga räknare och variabler kan vara så stora som 65535. Med en 72MHz klockfrekvens kan en PWM-utgång ha en maximal period på cirka en millisekund.
- Så värdet på 65535 ger FULL BRIGHTNESS av LED OCH FULL HASTIGHET av DC-fläkt (100% Duty Cycle)
- Likaså värdet 32767 ger HALF LJUSSTYRKA av LED OCH HALVHASTIGHET för DC-fläkt (50% arbetscykel)
- Och värdet 13107 ger (20%) LJUSSTYRKA OCH (20%) HASTIGHET (20% arbetscykel)
I denna handledning använder vi potentiometer och STM32 för att variera ljusstyrkan på LED och hastighet för en DC-fläkt med PWM-teknik. En 16x2 LCD används för att visa ADC-värde (0-4095) och den modifierade variabeln (PWM-värde) som matas ut (0-65535).
Här är några PWM-exempel med andra Microcontroller:
- Generera PWM med PIC Microcontroller med MPLAB och XC8
- Servomotorstyrning med Raspberry Pi
- Arduino-baserad LED-dimmer med PWM
- Pulsbreddsmodulering (PWM) med MSP430G2
Kontrollera alla PWM-relaterade projekt här.
Komponenter krävs
- STM32F103C8
- DC-fläkt
- ULN2003 Motor Driver IC
- LED (RÖD)
- LCD (16x2)
- Potentiometer
- Bakbord
- Batteri 9V
- Bygeltrådar
DC-fläkt: DC-fläkten som används här är BLDC-fläkt från en gammal PC. Det kräver en extern matning så vi använder ett 9V DC-batteri.
ULN2003 Motor Driver IC: Den används för att driva motorn i en riktning eftersom motorn är enkelriktad och även extern ström krävs för fläkten. Lär dig mer om ULN2003-baserad motorförarkrets här. Nedan är bilddiagrammet för ULN2003:
Pins (IN1 till IN7) är ingångsstift och (OUT 1 till OUT 7) är motsvarande utgångsstift. COM ges positiv källspänning som krävs för utgångsenheter.
LED: RÖD färgad led används som avger RÖDT ljus. Alla färger kan användas.
Potentiometrar: Två potentiometrar används, en är för spänningsdelare för analog ingång till ADC och en annan för styrning av lysdioden.
Stiftdetaljer för STM32
Som vi kan se är PWM-stiften indikerade i vågformat (~), det finns 15 sådana stift, ADC-stift representeras i grön färg, 10 ADC-stift finns där som används för analoga ingångar.
Kretsschema och anslutningar
Anslutningar av STM32 med olika komponenter förklaras enligt nedan:
STM32 med analog ingång (ADC)
Potentiometern som finns på vänster sida av kretsen används som spänningsregulator som reglerar spänningen från 3,3 V-stiftet. Utgången från potentiometern, dvs mittstiftet på potentiometern är ansluten till ADC-stiftet (PA4) på STM32.
STM32 med LED
STM32 PWM-utgångsstiftet (PA9) är anslutet till den positiva stiftet på LED genom ett seriemotstånd och en kondensator.
LED med motstånd och kondensator
Ett motstånd i serie och en kondensator parallellt är anslutna med LED för att generera korrekt analogvåg från PWM-utgång eftersom analog utgång inte är ren från när den genereras direkt från PWM-stift.
STM32 med ULN2003 & ULN2003 med fläkt
STM32 PWM-utgångsstift (PA8) är ansluten till ingångsstiftet (IN1) på ULN2003 IC och motsvarande utgångsstift (OUT1) på ULN2003 är ansluten till minusledningen till DC FAN.
Positiv stift på DC-fläkten är ansluten till COM-stiftet på ULN2003 IC och det externa batteriet (9V DC) är också anslutet till samma COM-stift på ULN2003 IC. GND-stift på ULN2003 är anslutet till GND-stift på STM32 och batterinegativt är anslutet till samma GND-stift.
STM32 med LCD (16x2)
LCD-stift nr |
LCD-stiftnamn |
STM32 Pin-namn |
1 |
Mark (GND) |
Mark (G) |
2 |
VCC |
5V |
3 |
VEE |
Stift från Center of Potentiometer |
4 |
Registrera Välj (RS) |
PB11 |
5 |
Läs / skriv (RW) |
Mark (G) |
6 |
Aktivera (EN) |
PB10 |
7 |
Databit 0 (DB0) |
Ingen anslutning (NC) |
8 |
Databit 1 (DB1) |
Ingen anslutning (NC) |
9 |
Databit 2 (DB2) |
Ingen anslutning (NC) |
10 |
Databit 3 (DB3) |
Ingen anslutning (NC) |
11 |
Databit 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 |
Mark (G) |
En potentiometer på höger sida används för att styra LCD-displayens kontrast. Ovanstående tabell visar anslutningen mellan LCD och STM32.
Programmering STM32
Liksom föregående handledning programmerade vi STM32F103C8 med Arduino IDE via USB-port utan att använda FTDI-programmerare. För att lära dig mer om programmering av STM32 med Arduino IDE, följ länken. Vi kan fortsätta programmera som i Arduino. Komplett kod ges i slutet.
I den här kodningen ska vi ta ett ingångsanalogt värde från ADC-stift (PA4) som är anslutet till mittstiftet till vänster potentiometer och sedan konvertera det analoga värdet (0-3,3V) till digitalt eller heltalformat (0-4095). Detta digitala värde tillhandahålls vidare som PWM-utgång för att styra LED-ljusstyrka och DC-fläktens hastighet. En 16x2 LCD används för att visa ADC och mappat värde (PWM-utgångsvärde).
Först måste vi inkludera LCD-rubrikfilen, deklarera LCD-stift och initialisera dem med hjälp av nedanstående kod. Läs mer om gränssnitt mellan LCD och STM32 här.
#omfatta
Därefter deklarera och definiera stiftnamnen med STM32-stiftet
const int analoginput = PA4; // Ingång från potentiometer const int led = PA9; // LED-utgång const int-fläkt = PA8; // fläktutgång
Nu i installationen () måste vi visa några meddelanden och rensa dem efter några sekunder och ange INPUT-stift och PWM-utgångsstift
lcd.begin (16,2); // Förbereda LCD-skärmen lcd.clear (); // Rensar LCD lcd.setCursor (0,0); // Ställer in markören vid rad 0 och kolumn 0 lcd.print ("CIRCUIT DIGEST"); // Visar Circuit Digest lcd.setCursor (0,1); // Ställer in markören vid kolumn 0 och rad1 lcd.print ("PWM ANVÄNDER STM32"); // Visar PWM med STM32- fördröjning (2000); // Fördröjningstid lcd.clear (); // Rensar LCD pinMode (analog ingång, INPUT); // ställa in pin-läge analoginmatning som INPUT pinMode (led, PWM); // ställa in pin-läge som PWM-utgång pinMode (fläkt, PWM); // ställ in fläkt för stiftläge som PWM-utgång
Den analoga ingångsstiftet (PA4) är inställt som INPUT av pinMode (analog ingång, INPUT), LED-stift är inställt som PWM-utgång av pinMode (led, PWM) och fläktstiftet är inställt som PWM-utgång av pinMode (fläkt, PWM) . Här är PWM-utgångarna anslutna till LED (PA9) och fläkt (PA8).
Nästa i void loop () -funktionen läser vi den analoga signalen från ADC-stiftet (PA4) och lagrar den i en heltalvariabel som omvandlar analog spänning till digitala heltalsvärden (0-4095) med hjälp av nedanstående kod int valueadc = analogRead (analoginput);
Viktigt att notera här är PWM-stift som är kanaler i STM32 har 16-bitars upplösning (0-65535) så vi måste kartlägga det med analoga värden med hjälp av kartfunktion som nedan
int-resultat = karta (valueadc, 0, 4095, 0, 65535).
Om kartläggning inte används kommer vi inte att få full fläkt eller full ljusstyrka på LED genom att variera potentiometern.
Sedan skriver vi PWM-utgången till lysdioden med hjälp av pwmWrite (led, resultat) och PWM-utgång till fläkt med hjälp av pwmWrite (fläkt, resultat ) -funktioner.
Slutligen visar vi det analoga ingångsvärdet (ADC-värdet) och utgångsvärdena (PWM-värden) på LCD-skärmen med följande kommandon
lcd.setCursor (0,0); // Ställer in markören vid rad 0 och kolumn 0 lcd.print ("ADC value ="); // skriver ut orden ”” lcd.print (valueadc); // visar valueadc lcd.setCursor (0,1); // Ställer in markören vid kolumn 0 och rad1 lcd.print ("Output ="); // skriver ut orden i "" lcd.print (resultat); // visar värderesultat
Komplett kod med en demonstrationsvideo ges nedan.