- Grunnleggende om PWM Signal
- Maskinvareoppsett og krav
- Kretsskjema for Nuvoton N76E003 Microcontroller LED Dimming
- PWM-pinner på N76E003 Nuvoton Microcontroller
- PWM-registre og funksjoner i N76E003 Nuvoton Microcontroller
- PWM-driftsmåter i Nuvoton N6E003 mikrokontroller
- Programmering av Nuvoton N76E003 for PWM
- Blinker koden og tester utdataene
Pulse Width Modulation (PWM) er en vanlig teknikk i mikrokontrollere for å produsere et kontinuerlig pulssignal med en definert frekvens og driftssyklus. Kort fortalt handler PWM om å endre bredden på en puls mens frekvensen er konstant.
Et PWM-signal brukes mest til å kontrollere en servomotor eller lysstyrken til en LED. Siden mikrokontrollere bare kan gi Logic 1 (High) eller Logic 0 (Low) på utgangspinnene, kan de ikke gi en varierende analog spenning med mindre en DAC eller Digital til Analog-omformer brukes. I et slikt tilfelle kan mikrokontrolleren programmeres til å sende ut en PWM med en variert driftssyklus som deretter kan konverteres til den varierende analoge spenningen. Vi har tidligere brukt PWM-periferi i mange andre mikrokontrollere også.
- ARM7-LPC2148 PWM Opplæring: Kontrollere lysstyrken på LED
- Pulsbreddemodulering (PWM) ved bruk av MSP430G2: Kontrollere lysstyrken på LED
- Genererer PWM ved hjelp av PIC Microcontroller med MPLAB og XC8
- Pulsbreddemodulering (PWM) i STM32F103C8: Kontrollhastighet på DC-vifte
- Genererer PWM-signaler på GPIO-pinner på PIC Microcontroller
- Raspberry Pi PWM opplæring
- PWM opplæring med ESP32
I denne opplæringen vil vi grensesnitt en LED som vil bli kontrollert ved hjelp av dette PWM-signalet fra N76E003 mikrokontroller-enheten. Vi vil evaluere hva slags maskinvareoppsett vi trenger og hvordan vi skal programmere mikrokontrolleren vår. Før det, la oss forstå noen grunnleggende om et PWM-signal.
Grunnleggende om PWM Signal
På bildet nedenfor vises et konstant PWM-signal.
Ovennevnte bilde er bare en konstant firkantbølge med samme PÅ-tid og samme AV-tid. Anta at den totale perioden for signalet er 1 sekund. Dermed er på-og av-tiden 500 ms. Hvis en LED er koblet over dette signalet, vil LED-en slås på i 500 ms og slukkes i 500 ms. Derfor, i perspektivvisning, vil LED-lampen lyse opp med halvparten av den faktiske lysstyrken hvis den slås på på et direkte 5V-signal uten avbruddstid.
Nå som vist i bildet ovenfor, hvis driftssyklusen endres, vil LED-lampen lyse opp med 25% av den faktiske lysstyrken ved å bruke det samme prinsippet som diskutert tidligere. Hvis du vil vite mer og lære om Pulse Width Modulation (PWM), kan du sjekke ut den koblede artikkelen.
Maskinvareoppsett og krav
Ettersom kravet til dette prosjektet er å kontrollere LED ved bruk av PWM. En LED er nødvendig for å være grensesnittet med N76E003. Siden en LED er tilgjengelig i N76E003 utviklingskort, vil den bli brukt i dette prosjektet. Ingen andre komponenter kreves.
For ikke å nevne, vi trenger det N76E003 mikrokontrollerbaserte utviklingskortet samt Nu-Link Programmer. En ekstra 5V strømforsyningsenhet kan være nødvendig hvis programmereren ikke brukes som strømkilde.
Kretsskjema for Nuvoton N76E003 Microcontroller LED Dimming
Som vi kan se i skjemaet nedenfor, er test-LED-en tilgjengelig inne i utviklingskortet, og den er koblet til port 1.4. Ytterst til venstre vises programmeringsgrensesnittforbindelsen.
PWM-pinner på N76E003 Nuvoton Microcontroller
N76E003 har 20 pinner, hvorav 10 pinner kan brukes som PWM. Bildene nedenfor viser PWM-pinnene uthevet i den røde firkanten.
Som vi kan se, kan de uthevede PWM-pinnene også brukes til andre formål. Dette andre formålet med pinnene vil imidlertid ikke være tilgjengelig når pinnene er konfigurert for PWM-utgang. Pin 1.4 som brukes som en PWM-utgangspinne, den mister den andre funksjonaliteten. Men det er ikke et problem, da det ikke kreves en annen funksjonalitet for dette prosjektet.
Årsaken bak valget av pinne 1.4 som utgangspinne er fordi den innebygde test-LED-en er koblet til den pinnen i utviklingskortet, og derfor trenger vi ikke eksterne lysdioder. Imidlertid, i denne mikrokontrolleren av 20 pinner, kan 10 pinner brukes som en PWM-utgangspinne, og andre PWM-pinner kan brukes til utgangsrelaterte formål.
PWM-registre og funksjoner i N76E003 Nuvoton Microcontroller
N76E003 bruker systemklokke eller Timer 1-overløp delt på en PWM-klokke med Prescaler som kan velges fra 1/1 ~ 1/128. PWM-perioden kan stilles inn ved hjelp av 16- bitersregisteret PWMPH og PWMPL-registeret.
Mikrokontrolleren har seks individuelle PWM-registre som genererer seks PWM-signaler kalt PG0, PG1, PG2, PG3, PG4 og PG5. Perioden er imidlertid den samme for hver PWM-kanal, fordi de deler den samme 16-bits periodetelleren, men driftssyklusen til hver PWM kan være forskjellig fra andre, ettersom hver PWM bruker forskjellige 16-biters driftssyklusregister kalt {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} og {PWM5H, PWM5L}. I N76E003 kan således seks PWM-utganger genereres uavhengig med forskjellige driftssykluser.
I motsetning til andre mikrokontrollere, aktiverer ikke PWM ikke I / O-pinnene automatisk i PWM-utgangen. Dermed må brukeren konfigurere I / O-utgangsmodus.
Så uansett hva som kreves for applikasjonen, er det første trinnet å bestemme eller velge hvilken eller to eller til og med mer enn to I / O-pinner som PWM-utgang. Etter at du har valgt en, må I / O-pinnene settes som Push-Pull-modus eller kvasi toveis for å generere PWM-signalet. Dette kan velges ved hjelp av PxM1 og PxM2-registeret. Disse to registerene setter I / O-modusene der x står for portnummeret (for eksempel Port P1.0 vil registeret være P1M1 og P1M2, for P3.0 vil det være P3M1 og P3M2, etc.)
Konfigurasjonen kan sees i nedenstående bilde-
Deretter er neste trinn å aktivere PWM i den bestemte I / O-pinnen. For å gjøre dette, må brukeren sette PIOCON0- eller PIOCON1-registerene. Registeret er avhengig av pin-kartleggingen da PIOCON0 og PIOCON1 styrer forskjellige pinner avhengig av PWM-signalene. Konfigurasjonen av disse to registerene kan sees i bildet nedenfor -
Som vi kan se, kontrollerer ovennevnte register 6 konfigurasjoner. For resten, bruk PIOCON1-registeret.
Dermed styrer ovennevnte register resten 4 konfigurasjoner.
PWM-driftsmåter i Nuvoton N6E003 mikrokontroller
Neste trinn er å velge PWM-modus. Hver PWM støtter tre operasjonsmodi - Uavhengig, synkron og deaktiveringsmodus.
Uavhengig modus gir løsningen der de seks PWM-signalene kan genereres uavhengig. Dette kreves maksimalt når LED-relaterte operasjoner eller summer må slås på og kontrolleres.
Den synkrone modusen setter PG1 / 3/5 i samme fasevise PWM-utgang, den samme som PG0 / 2/4, der PG0 / 2/4 gir uavhengige PWM-utgangssignaler. Dette er hovedsakelig nødvendig for å kontrollere trefasemotorer.
Den dødtid innføringsmodus er litt komplisert og anvendt i det virkelige motorapplikasjoner, spesielt i industrielle applikasjoner. I slike applikasjoner må en komplementær PWM-utgang være "dead-time" -innføring som forhindrer skade på strømbryterne som GPIB. Konfigurasjonene er satt i denne modusen på en måte som PG0 / 2/4 gir PWM-utgangssignaler på samme måte som uavhengig modus, men PG1 / 3/5 gir "utfase PWM-signaler" -utgang på PG0 / 2/4 tilsvarende og ignorere PG1 / 3/5 Duty register.
Over tre moduser kan velges ved hjelp av nedenstående registerkonfigurasjon-
Den neste konfigurasjonen er valget av PWM-typer ved bruk av PWMCON1-registeret.
Så som vi kan se, er to PWM-typer tilgjengelige som kan velges ved hjelp av registeret ovenfor. I kantjustert bruker 16-bits telleren en-skråning ved å telle opp fra 0000H til den innstilte verdien til {PWMPH, PWMPL}, og deretter starte fra 0000H. Utgangsbølgeformen er justert i venstre kant.
Men i senterjustert modus bruker 16-bits telleren dobbel skråning ved å telle opp fra 0000H til {PWMPH, PWMPL} og deretter igjen fra {PWMPH, PWMPL} til 0000H ved å telle ned. Utgangen er midtjustert, og den er nyttig for å generere ikke-overlappende bølgeformer. Nå endelig PWM-kontrolloperasjoner som kan kontrolleres i registrene nedenfor -
For å stille inn klokkilde, bruk CKCON klokkestyringsregister.
PWM-utgangssignalet kan også maskeres ved hjelp av PMEN-registeret. Ved hjelp av dette registeret kan brukeren maskere utgangssignalet med 0 eller 1.
Neste er PWM Control Register-
Ovennevnte register er nyttig for å kjøre PWM, laste inn ny periode og pliktbelastning, kontrollere PWM-flagget og fjerne PWM-telleren.
De tilhørende bitkonfigurasjonene er vist nedenfor -
For å stille inn klokkedeleren, bruk PWMCON1-registeret for PWM-klokkedeleren. Den femte biten brukes for gruppemodusaktivert gruppert PWM og gir samme driftssyklus for de første tre PWM-parene.
Programmering av Nuvoton N76E003 for PWM
Kodingen er enkel, og den komplette koden som brukes i denne opplæringen, finner du nederst på denne siden. LED-en er koblet til P1.4-pinnen. Dermed er P1.4-pinnen nødvendig for å brukes til PWM-utgang.
I hovedprogrammet gjøres innstillingene i den respektive rekkefølgen. Nedenfor kodelinjer setter PWM og konfigurerer P1.4-pinnen som PWM-utgang.
P14_PushPull_Mode;
Denne brukes til å sette pinnen P1.4 i push-pull-modus. Dette er definert i Function_define.h- biblioteket som-
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
De neste linjene som ble brukt for å aktivere PWM i pin P1.4. Dette er også definert i Function_define.h- biblioteket som-
#definer PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS & = 0xFE; EA = BIT_TM PWM1-utgang aktiverer PWM_IMDEPENDENT_MODE;
Koden nedenfor brukes til å sette PWM i uavhengig modus. I biblioteket Function_define.h er det definert som-
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Så må vi stille inn EDGE-typen PWM-utgang. I biblioteket Function_define.h er det definert som-
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Deretter må vi tømme PWM-tellerverdien som er tilgjengelig i SFR_Macro.h- biblioteket-
#define set_CLRPWM CLRPWM = 1
Deretter blir PWM-klokken valgt som Fsys-klokke, og delingsfaktoren som brukes er 64-divisjonen.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Begge er definert som-
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
Under linjen med kode brukes til å maskere utgangs-PWM-signalet med 0 definert som-
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Da må vi stille inn perioden for PWM-signalet. Denne funksjonen angir perioden i PWMPL og PWMPH register. Siden dette er et 16-biters register, bruker funksjonen en bit shifting-metode for å stille inn PWM-perioden.
ugyldig set_PWM_period (usignert int-verdi) { PWMPL = (verdi & 0x00FF); PWMPH = ((verdi & 0xFF00) >> 8); }
Men bortsett fra 1023- og 8-bitersperioden, kan brukere også bruke andre verdier. Å øke perioden resulterer i jevn nedblending eller falming.
set_PWMRUN;
Dette starter PWM som er definert i SFR_Macro.h- biblioteket som-
#define set_PWMRUN PWMRUN = 1
Deretter, i mens sløyfen , lyser LED-lampen og falmer kontinuerlig.
mens (1) { for (verdi = 0; verdi <1024; verdi + = 10) { set_PWM1 (verdi); Timer1_Delay10ms (3); } for (verdi = 1023; verdi> 0; verdi - = 10) { set_PWM1 (verdi); Timer1_Delay10ms (2); } } }
Driftssyklusen er satt av set_PWM1 (); en funksjon som setter driftssyklusen i PWM1L- og PWM1H-registeret.
ugyldig set_PWM1 (usignert int-verdi) { PWM1L = (verdi & 0x00FF); PWM1H = ((verdi & 0xFF00) >> 8); set_LOAD; }
Blinker koden og tester utdataene
Når koden er klar, er det bare å kompilere den og laste den opp til kontrolleren. Hvis du er ny i miljøet, kan du ta en titt på Nuvoton N76E003-opplæringen for å lære det grunnleggende. Som du kan se fra resultatet nedenfor, returnerte koden 0 advarsel og 0 feil og blinket ved hjelp av standard blinkingsmetode av Keil. Søknaden begynner å virke.
Ombygging startet: Prosjekt: PWM Gjenopprett mål 'Mål 1' som setter sammen STARTUP.A51… kompilerer main.c… kompilerer Delay.c… linking… Programstørrelse: data = 35,1 xdata = 0 kode = 709 oppretter hex-fil fra ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 Feil (er), 0 Advarsel (er). Bygget tid forløpt: 00:00:05
Maskinvaren er koblet til strømkilden, og den fungerte som forventet. Det er lysstyrken på den innebygde LED-en redusert og deretter økt for å indikere endringen PWM-driftssyklus.
Komplett arbeid av denne veiledningen finner du også i videoen som er lenket nedenfor. Håper du likte opplæringen og lærte noe nyttig hvis du har spørsmål, la dem være i kommentarseksjonen, eller du kan bruke forumene våre til andre tekniske spørsmål.