- Hva er et PWM-signal?
- PWM ved bruk av PIC16F877A:
- Programmering av PIC for å generere PWM-signaler:
- Skjemaer og testing:
- Arbeider med maskinvare:
Dette er vår 10. opplæring om å lære PIC-mikrokontrollere ved hjelp av MPLAB og XC8. Til nå har vi dekket mange grunnleggende opplæringsprogrammer som LED blinker med PIC, Timere i PIC, grensesnitt LCD, grensesnitt 7-segment, ADC ved hjelp av PIC etc. Hvis du er en absolutt nybegynner, kan du gå til den komplette listen over PIC-veiledninger her og begynn å lære.
I denne opplæringen vil vi lære å generere PWM-signaler ved hjelp av PIC PIC16F877A. PIC MCU har en spesiell modul kalt Compare Capture module (CCP) som kan brukes til å generere PWM-signaler. Her vil vi generere en PWM på 5 kHz med en variabel driftssyklus fra 0% til 100%. For å variere driftssyklusen bruker vi et potensiometer, derfor anbefales det å lære ADC-opplæringen før du starter med PWM. PWM-modulen bruker også tidtakere for å stille frekvensen, og lær deg hvordan du bruker tidtakere på forhånd her. Videre vil vi i denne opplæringen bruke en RC-krets og en LED for å konvertere PWM-verdiene til analog spenning og bruke den til å dempe LED-lyset.
Hva er et PWM-signal?
Pulse Width Modulation (PWM) er et digitalt signal som oftest brukes i kontrollkretser. Dette signalet er satt høyt (5v) og lavt (0v) i en forhåndsdefinert tid og hastighet. Tiden der signalet holder seg høyt kalles "på tid" og tiden som signalet holder seg lavt kalles "av-tid". Det er to viktige parametere for en PWM som diskutert nedenfor:
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)
Frekvens av en PWM:
Frekvensen til et PWM-signal bestemmer hvor raskt en PWM fullfører en periode. Én periode er fullstendig PÅ og AV for et PWM-signal som vist i figuren ovenfor. I vår opplæring vil vi sette en frekvens på 5KHz.
PWM ved bruk av PIC16F877A:
PWM-signaler kan genereres i vår PIC-mikrokontroller ved hjelp av CCP- modulen (Compare Capture PWM). Oppløsningen til vårt PWM-signal er 10-bit, det vil si for en verdi på 0 vil det være en driftssyklus på 0% og for en verdi på 1024 (2 ^ 10) vil det være en driftssyklus på 100%. Det er to CCP-moduler i vår PIC MCU (CCP1 og CCP2), dette betyr at vi kan generere to PWM-signaler på to forskjellige pinner (pin 17 og 16) samtidig, i vår opplæring bruker vi CCP1 til å generere PWM-signaler på pin 17.
Følgende registre brukes til å generere PWM-signaler ved hjelp av vår PIC MCU:
- CCP1CON (CCP1 kontrollregister)
- T2CON (Timer 2 Control Register)
- PR2 (Timer 2-moduler Perioderegister)
- CCPR1L (CCP Register 1 Low)
Programmering av PIC for å generere PWM-signaler:
I vårt program vil vi lese en analog spenning på 0-5v fra et potensiometer og kartlegge den til 0-1024 ved hjelp av ADC-modulen. Deretter genererer vi et PWM-signal med frekvens 5000Hz og varierer driftssyklusen basert på inngangen Analog spenning. Det vil si 0-1024 vil bli konvertert til 0% -100% Driftssyklus. Denne opplæringen forutsetter at du allerede har lært å bruke ADC i PIC hvis ikke, les den herfra, fordi vi hopper over detaljer om det i denne opplæringen.
Så når konfigurasjonsbitene er satt og programmet er skrevet for å lese en analog verdi, kan vi fortsette med PWM.
Følgende trinn bør tas når du konfigurerer CCP-modulen for PWM-drift:
- Still inn PWM-perioden ved å skrive til PR2-registeret.
- Sett PWM-driftssyklusen ved å skrive til CCPR1L-registeret og CCP1CON <5: 4> -biter.
- Gjør CCP1-pinnen til en utgang ved å fjerne TRISC <2> -biten.
- Still inn TMR2-forhåndsskalaverdien og aktiver Timer2 ved å skrive til T2CON.
- Konfigurer CCP1-modulen for PWM-drift.
Det er to viktige funksjoner i dette programmet for å generere PWM-signaler. Den ene er PWM_Initialize () -funksjonen som initialiserer registrene som kreves for å sette opp PWM-modulen og deretter stiller inn frekvensen som PWM skal fungere med, den andre funksjonen er PWM_Duty () -funksjonen som vil sette driftssyklusen til PWM-signalet i de nødvendige registrene.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Innstilling av PR2-formler ved bruk av datablad // Gjør PWM til å fungere i 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfigurer CCP1-modulen T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfigurer timermodulen TRISC2 = 0; // lag portpinne på C som utgang}
Ovennevnte funksjon er PWM-initialiseringsfunksjonen, i denne funksjonen CCP1-modulen er satt til å bruke PWM ved å gjøre bit CCP1M3 og CCP1M2 så høy.
Timermodulens prescaler stilles inn ved å gjøre biten T2CKPS0 så høy og T2CKPS1 så lav biten TMR2ON er satt til å starte timeren.
Nå må vi stille inn frekvensen til PWM-signalet. Verdien av frekvensen må skrives til PR2-registeret. Den ønskede frekvensen kan stilles inn ved å bruke formlene nedenfor
PWM-periode = * 4 * TOSC * (TMR2 forhåndsskalaverdi)
Omorganisering av disse formlene for å få PR2 vil gi
PR2 = (Periode / (4 * Tosc * TMR2 Prescale)) - 1
Vi vet at Periode = (1 / PWM_freq) og Tosc = (1 / _XTAL_FREQ). Derfor…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Når frekvensen er innstilt, trenger ikke denne funksjonen å ringes opp igjen med mindre og til vi trenger å endre frekvensen igjen. I opplæringen vår har jeg tildelt PWM_freq = 5000; slik at vi kan få en 5 KHz driftsfrekvens for vårt PWM-signal.
La oss nå angi driftssyklusen til PWM ved å bruke funksjonen nedenfor
PWM_Duty (usignert int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Ved redusering av // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = plikt & 1; // Lagre 1. bit CCP1Y = duty & 2; // Lagre 0-bit CCPR1L = plikt >> 2; // Lagre den påminnende 8 bit}}
PWM-signalet vårt har 10-biters oppløsning, og denne verdien kan derfor ikke lagres i et enkelt register, siden vår PIC bare har 8-biters datalinjer. Så vi har brukt to andre biter av CCP1CON <5: 4> (CCP1X og CCP1Y) for å lagre de to siste LSB og deretter lagre de resterende 8 bitene i CCPR1L-registeret.
PWM-driftssyklustiden kan beregnes ved å bruke formlene nedenfor:
PWM driftssyklus = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
Omorganisering av disse formlene for å få verdien av CCPR1L og CCP1CON vil gi:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
Verdien av ADC vil være 0-1024, vi trenger at den er i 0% -100%, derfor er PWM Duty Cycle = duty / 1023. Videre for å konvertere denne driftssyklusen til en periode må vi multiplisere den med perioden (1 / PWM_freq)
Vi vet også at Tosc = (1 / PWM_freq), derav..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Å løse ovenstående ligning vil gi oss:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Du kan sjekke det komplette programmet i Code-delen nedenfor sammen med den detaljerte videoen.
Skjemaer og testing:
Som vanlig, la oss verifisere utdataene ved hjelp av Proteus-simulering. Den Circuit Diagram er vist nedenfor.
Koble et potensiometer til syvende stift for å mate inn en spenning på 0-5. CCP1-modulen er med pin 17 (RC2), her vil PWM bli generert som kan verifiseres ved hjelp av det digitale oscilloskopet. Videre for å konvertere dette til en variabel spenning har vi brukt et RC-filter og en LED for å verifisere utgangen uten et omfang.
Hva er et RC-filter?
Et RC-filter eller et lavpassfilter er en enkel krets med to passive elementer, nemlig motstanden og kondensatoren. Disse to komponentene brukes til å filtrere frekvensen til PWM-signalet vårt og gjøre det til en variabel DC-spenning.
Hvis vi undersøker kretsen, når en variabel spenning påføres inngangen til R, vil kondensatoren C begynne å lade. Basert på verdien av kondensatoren, vil kondensatoren ta litt tid å bli fulladet, når den er ladet vil den blokkere likestrømmen (Husk kondensatorene blokkerer likestrøm, men tillater vekselstrøm), og derfor vil inngangsstrømmen vises over utgangen. Høyfrekvent PWM (AC-signal) blir jordet gjennom kondensatoren. Dermed oppnås en ren DC på tvers av kondensatoren. En verdi på 1000Ohm og 1uf ble funnet å være passende for dette prosjektet. Beregning av verdiene til R og C innebærer kretsanalyse ved hjelp av overføringsfunksjon, som er utenfor omfanget av denne opplæringen.
Programmets utgang kan verifiseres ved hjelp av det digitale oscilloskopet som vist nedenfor, variere potensiometeret og Duty-syklusen til PWM skal endres. Vi kan også legge merke til utgangsspenningen til RC-kretsen ved hjelp av Voltmeter. Hvis alt fungerer som forventet, kan vi fortsette med maskinvaren. Se videoen på slutten for full prosess.
Arbeider med maskinvare:
Maskinvareoppsettet til prosjektet er veldig enkelt, vi skal bare bruke PIC Perf-kortet vårt vist nedenfor.
Vi trenger også et potensiometer for å mate inn den analoge spenningen. Jeg har festet noen kvinnelige endeledninger til gryten min (vist nedenfor) slik at vi kan koble dem direkte til PIC Perf-kortet.
Til slutt for å verifisere utgangen, trenger vi en RC-krets og en LED for å se hvordan PWM-signalet fungerer, jeg har ganske enkelt brukt et lite perf-kort og loddet RC-kretsen og LED-en (for å kontrollere lysstyrken) på den som vist nedenfor
Vi kan bruke enkle kvinnelige til kvinnelige tilkoblingsledninger og koble dem i henhold til skjemaene vist ovenfor. Når tilkoblingen er ferdig, laster du opp programmet til PIC ved hjelp av vår pickit3, og du bør kunne få en variabel spenning basert på inngangen til potensiometeret ditt. Den variable utgangen brukes til å kontrollere lysstyrken på LED-en her.
Jeg brukte multimeteret mitt for å måle de variable utgangene, vi kan også legge merke til at lysstyrken på LED-en blir endret for forskjellige spenningsnivåer.
Det er det vi har programmert til å lese den analoge spenningen fra POT og konvertere til PWM-signaler som igjen er blitt konvertert til variabel spenning ved hjelp av RC-filter, og resultatet blir bekreftet ved hjelp av maskinvaren vår. Hvis du er i tvil eller sitter fast et sted, vennligst bruk kommentarseksjonen nedenfor, vi hjelper deg gjerne. Hele arbeidet fungerer i videoen.
Sjekk også de andre PWM-opplæringene våre på andre mikrokontrollere:
- Raspberry Pi PWM opplæring
- PWM med Arduino Due
- Arduino-basert LED-dimmer ved bruk av PWM
- Strøm LED-dimmer med ATmega32 mikrokontroller