- Hvad er et PWM-signal?
- PWM ved hjælp af PIC16F877A:
- Programmering af PIC til generering af PWM-signaler:
- Skemaer og test:
- Arbejde med hardware:
Dette er vores 10. tutorial om PIC-mikrocontrollere, der lærer MPLAB og XC8. Indtil nu har vi dækket mange grundlæggende tutorials som LED blinker med PIC, Timere i PIC, interface LCD, interface 7-segment, ADC ved hjælp af PIC osv. Hvis du er en absolut nybegynder, så besøg den komplette liste over PIC-tutorials her og begynde at lære.
I denne vejledning lærer vi, hvordan man genererer PWM-signaler ved hjælp af PIC PIC16F877A. Vores PIC MCU har et specielt modul kaldet Compare Capture module (CCP), som kan bruges til at generere PWM-signaler. Her genererer vi en PWM på 5 kHz med en variabel arbejdscyklus fra 0% til 100%. For at variere driftscyklussen bruger vi et potentiometer, derfor anbefales det at lære ADC-tutorial, inden du starter med PWM. PWM-modulet bruger også timere til at indstille frekvensen, og lær derfor at bruge timere på forhånd her. Desuden bruger vi i denne vejledning et RC-kredsløb og en LED til at konvertere PWM-værdierne til analog spænding og bruge den til dæmpning af LED-lyset.
Hvad er et PWM-signal?
Pulse Width Modulation (PWM) er et digitalt signal, der oftest bruges i kontrolkredsløb. Dette signal er indstillet højt (5v) og lavt (0v) i en foruddefineret tid og hastighed. Den tid, hvorunder signalet forbliver højt, kaldes "til tiden" og den tid, hvor signalet forbliver lavt, kaldes "slukketid". Der er to vigtige parametre for en PWM som beskrevet nedenfor:
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)
Frekvens af en PWM:
Frekvensen af et PWM-signal bestemmer, hvor hurtigt en PWM gennemfører en periode. En periode er fuldstændig TIL og FRA for et PWM-signal som vist i ovenstående figur. I vores vejledning indstiller vi en frekvens på 5KHz.
PWM ved hjælp af PIC16F877A:
PWM-signaler kan genereres i vores PIC Microcontroller ved hjælp af CCP- modulet (Compare Capture PWM). Opløsningen af vores PWM-signal er 10-bit, det vil sige for en værdi på 0 vil der være en driftscyklus på 0% og for en værdi på 1024 (2 ^ 10) er der en driftscyklus på 100%. Der er to CCP-moduler i vores PIC MCU (CCP1 og CCP2), det betyder, at vi kan generere to PWM-signaler på to forskellige ben (pin 17 og 16) samtidigt, i vores tutorial bruger vi CCP1 til at generere PWM-signaler på pin 17.
Følgende registre bruges til at generere PWM-signaler ved hjælp af vores PIC MCU:
- CCP1CON (CCP1 kontrolregister)
- T2CON (Timer 2 Control Register)
- PR2 (Timer 2-moduler Perioderegister)
- CCPR1L (CCP Register 1 Low)
Programmering af PIC til generering af PWM-signaler:
I vores program læser vi en analog spænding på 0-5v fra et potentiometer og kortlægger den til 0-1024 ved hjælp af vores ADC-modul. Derefter genererer vi et PWM-signal med frekvens 5000Hz og varierer dets driftscyklus baseret på den indgående analoge spænding. Det vil sige 0-1024 vil blive konverteret til 0% -100% Duty cycle. Denne tutorial antager, at du allerede har lært at bruge ADC i PIC, hvis ikke, læs den herfra, fordi vi springer detaljer over det over i denne tutorial.
Så når konfigurationsbitene er indstillet og programmet er skrevet for at læse en analog værdi, kan vi fortsætte med PWM.
Følgende trin skal tages, når CCP-modulet konfigureres til PWM-drift:
- Indstil PWM-perioden ved at skrive til PR2-registeret.
- Indstil PWM-driftscyklus ved at skrive til CCPR1L-registeret og CCP1CON <5: 4> bits.
- Lav CCP1-pin til en output ved at rydde TRISC <2> bit.
- Indstil TMR2-forudskalningsværdien, og aktiver Timer2 ved at skrive til T2CON.
- Konfigurer CCP1-modulet til PWM-drift.
Der er to vigtige funktioner i dette program til at generere PWM-signaler. Den ene er PWM_Initialize () -funktionen, der initialiserer de registre, der kræves til opsætning af PWM-modul, og derefter indstiller den frekvens, hvormed PWM skal fungere, den anden funktion er PWM_Duty () -funktionen, der indstiller PWM-signalets driftscyklus i de krævede registre.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Indstilling af PR2-formler ved hjælp af datablad // Får PWM til at fungere i 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfigurer CCP1-modulet T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfigurer timermodulet TRISC2 = 0; // lav portnål på C som output}
Ovenstående funktion er PWM-initialiseringsfunktionen, i denne funktion CCP1-modulet er indstillet til at bruge PWM ved at gøre bit CCP1M3 og CCP1M2 så høj.
Timermodulets prescaler indstilles ved at gøre bit T2CKPS0 så høj og T2CKPS1 så lav bit TMR2ON er indstillet til at starte timeren.
Nu skal vi indstille frekvensen for PWM-signalet. Værdien af frekvensen skal skrives til PR2-registeret. Den ønskede frekvens kan indstilles ved hjælp af nedenstående formler
PWM-periode = * 4 * TOSC * (TMR2 Prescale Value)
Omarrangering af disse formler for at få PR2 vil give
PR2 = (Periode / (4 * Tosc * TMR2 Prescale)) - 1
Vi ved, at periode = (1 / PWM_freq) og Tosc = (1 / _XTAL_FREQ). Derfor…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Når frekvensen er indstillet, behøver denne funktion ikke at blive kaldt igen, medmindre og indtil vi har brug for at ændre frekvensen igen. I vores tutorial har jeg tildelt PWM_freq = 5000; så vi kan få en 5 KHz driftsfrekvens for vores PWM-signal.
Lad os nu indstille PWM's driftscyklus ved hjælp af nedenstående funktion
PWM_Duty (usigneret int-told) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Om reduktion // told = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = pligt & 1; // Gem 1. bit CCP1Y = duty & 2; // Gem den 0. Bit CCPR1L = pligt >> 2; // Gem den påmindende 8 bit}}
Vores PWM-signal har 10-bit opløsning, derfor kan denne værdi ikke lagres i et enkelt register, da vores PIC kun har 8-bit datalinjer. Så vi har brugt andre to bits CCP1CON <5: 4> (CCP1X og CCP1Y) til at gemme de to sidste LSB og derefter gemme de resterende 8 bits i CCPR1L-registeret.
PWM-driftscyklustiden kan beregnes ved hjælp af nedenstående formler:
PWM Duty Cycle = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
Omarrangering af disse formler for at få værdi af CCPR1L og CCP1CON vil give:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
Værdien af vores ADC vil være 0-1024, vi skal have den i 0% -100%, derfor er PWM Duty Cycle = duty / 1023. Yderligere for at konvertere denne driftscyklus til en tidsperiode skal vi multiplicere den med perioden (1 / PWM_freq)
Vi ved også, at Tosc = (1 / PWM_freq), dermed..
Duty = ((((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Løsning af ovenstående ligning giver os:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Du kan tjekke det komplette program i afsnittet Kode nedenfor sammen med den detaljerede video.
Skemaer og test:
Lad os som sædvanligt kontrollere output ved hjælp af Proteus-simulering. Den kredsløbsdiagram er vist nedenfor.
Slut et potentiometer til 7 th pin til foder i en spænding på 0-5. CCP1-modulet er med pin 17 (RC2), her genereres PWM, som kan verificeres ved hjælp af det digitale oscilloskop. Yderligere for at konvertere dette til en variabel spænding har vi brugt et RC-filter og en LED til at verificere output uden et omfang.
Hvad er et RC-filter?
Et RC-filter eller et lavpasfilter er et simpelt kredsløb med to passive elementer, nemlig modstanden og kondensatoren. Disse to komponenter bruges til at filtrere frekvensen af vores PWM-signal og gøre det til en variabel DC-spænding.
Hvis vi undersøger kredsløbet, når en variabel spænding påføres input af R, begynder kondensatoren C at oplade. Baseret på værdien af kondensatoren, tager kondensatoren tid til at blive fuldt opladet, når den er opladet, blokerer den jævnstrømmen (Husk kondensatorer blokerer DC, men tillader AC), og derfor vises DC-spændingen på tværs af output. Højfrekvent PWM (AC-signal) jordes gennem kondensatoren. Således opnås en ren DC på tværs af kondensatoren. En værdi på 1000Ohm og 1uf viste sig at være passende til dette projekt. Beregning af værdierne for R og C involverer kredsløbsanalyse ved hjælp af overføringsfunktion, som er uden for omfanget af denne vejledning.
Programmets output kan verificeres ved hjælp af det digitale oscilloskop som vist nedenfor, varier Potentiometeret og PWM's driftscyklus skal ændres. Vi kan også bemærke udgangsspændingen fra RC-kredsløbet ved hjælp af Voltmeter. Hvis alt fungerer som forventet, kan vi fortsætte med vores hardware. Se yderligere videoen i slutningen for fuld proces.
Arbejde med hardware:
Hardwareopsætningen af projektet er meget enkel, vi vil bare genbruge vores PIC Perf-kort vist nedenfor.
Vi har også brug for et potentiometer til at føde den analoge spænding, jeg har knyttet nogle kvindelige endeledninger til min gryde (vist nedenfor), så vi direkte kan forbinde dem til PIC Perf-kortet.
Endelig for at kontrollere output, har vi brug for et RC-kredsløb og en LED for at se, hvordan PWM-signalet fungerer, jeg har simpelthen brugt et lille perf-kort og loddet RC-kredsløbet og LED'en (for at kontrollere lysstyrke) på det som vist nedenfor
Vi kan bruge enkle kvindelige til kvindelige forbindelsesledninger og forbinde dem i henhold til skemaerne vist ovenfor. Når forbindelsen er færdig, skal du uploade programmet til PIC ved hjælp af vores pickit3, og du skal være i stand til at få en variabel spænding baseret på input af dit potentiometer. Den variable output bruges til at kontrollere lysstyrken på LED'en her.
Jeg brugte mit multimeter til at måle de variable udgange, vi kan også bemærke lysstyrken på LED'en bliver ændret til forskellige spændingsniveauer.
Det er det, vi har programmeret til at læse den analoge spænding fra POT og konvertere til PWM-signaler, som igen er konverteret til variabel spænding ved hjælp af RC-filter, og resultatet bekræftes ved hjælp af vores hardware. Hvis du er i tvivl eller sidder fast et eller andet sted, så brug venligst kommentarsektionen nedenfor, vi hjælper dig gerne. Det komplette arbejde arbejder i videoen.
Tjek også vores andre PWM-selvstudier på andre mikrocontrollere:
- Raspberry Pi PWM-vejledning
- PWM med Arduino Due
- Arduino-baseret LED-dæmper ved hjælp af PWM
- Power LED-dæmper ved hjælp af ATmega32 Microcontroller