- Grunderna i PWM Signal
- Hårdvaruinstallation och krav
- Kretsschema för Nuvoton N76E003 Microcontroller LED-dimning
- PWM-stift på N76E003 Nuvoton Microcontroller
- PWM-register och funktioner i N76E003 Nuvoton Microcontroller
- PWM-driftlägen i Nuvoton N6E003 Microcontroller
- Programmering av Nuvoton N76E003 för PWM
- Blinkar koden och testar utdata
Pulsbreddsmodulering (PWM) är en vanligt förekommande teknik i mikrokontroller för att producera en kontinuerlig pulssignal med en definierad frekvens och arbetscykel. Kort sagt handlar PWM om att ändra bredden på en puls medan frekvensen är konstant.
En PWM-signal används mest för att styra en servomotor eller en lysdiods ljusstyrka. Eftersom mikrokontroller endast kan tillhandahålla Logic 1 (High) eller Logic 0 (Low) på dess utgångar, kan de inte tillhandahålla en varierande analog spänning om inte en DAC eller Digital-till-analog-omvandlare används. I ett sådant fall kan mikrokontrollen programmeras att mata ut en PWM med en varierad arbetscykel som sedan kan omvandlas till den varierande analoga spänningen. Vi har tidigare använt PWM-kringutrustning i många andra mikrokontroller också.
- ARM7-LPC2148 PWM Handledning: Kontrollera ljusstyrka hos LED
- Pulsbreddsmodulering (PWM) med MSP430G2: Kontroll av ljusstyrka hos LED
- Generera PWM med PIC Microcontroller med MPLAB och XC8
- Pulsbreddsmodulering (PWM) i STM32F103C8: Styrhastighet för DC-fläkt
- Generera PWM-signaler på GPIO-stift på PIC Microcontroller
- Raspberry Pi PWM-handledning
- PWM-handledning med ESP32
I den här självstudien kommer vi att ansluta en lysdiod som kommer att styras med hjälp av denna PWM-signal från N76E003-mikrokontrollenheten. Vi kommer att utvärdera vilken typ av hårdvaruinstallation vi behöver och hur vi ska programmera vår mikrokontroller. Innan det, låt oss förstå några grunder för en PWM-signal.
Grunderna i PWM Signal
I bilden nedan visas en konstant PWM-signal.
Ovanstående bild är inget annat än en konstant fyrkantvåg med samma PÅ-tid och samma AV-tid. Antag att signalens totala period är 1 sekund. Således är tid och avstängning 500 ms. Om en LED är ansluten över denna signal tänds lysdioden i 500 ms och släcks i 500 ms. I perspektivvy tänds därför lysdioden med hälften av den faktiska ljusstyrkan om den slås på en direkt 5V-signal utan avstängningstid.
Nu som visas i bilden ovan, om arbetscykeln ändras, tänds lysdioden med 25% av den faktiska ljusstyrkan enligt samma princip som diskuterats tidigare. Om du vill veta mer och lära dig mer om Pulse Width Modulation (PWM) kan du kolla in den länkade artikeln.
Hårdvaruinstallation och krav
Eftersom kravet i detta projekt är att styra LED med PWM. En LED krävs för att vara gränssnitt med N76E003. Eftersom en LED finns i N76E003-utvecklingskortet kommer den att användas i detta projekt. Inga andra komponenter krävs.
För att inte nämna, vi behöver det N76E003 mikrokontrollerbaserade utvecklingskortet samt Nu-Link Programmeraren. Ytterligare en 5V strömförsörjningsenhet kan behövas om programmeraren inte används som strömkälla.
Kretsschema för Nuvoton N76E003 Microcontroller LED-dimning
Som vi kan se i schemat nedan är Test-LED-lampan tillgänglig inuti utvecklingskortet och den är ansluten på port 1.4. Längst till vänster visas programmeringsgränssnittsanslutningen.
PWM-stift på N76E003 Nuvoton Microcontroller
N76E003 har 20 stift varav 10 stift kan användas som PWM. Nedanstående bilder visar PWM-stiften markerade i den röda rutan.
Som vi kan se kan de markerade PWM-stiften också användas för andra ändamål. Detta andra syfte med stiften kommer dock inte att vara tillgängligt när stiften är konfigurerade för PWM-utgång. Stift 1.4 som används som en PWM-utgångsstift, förlorar den andra funktionaliteten. Men det är inte ett problem eftersom det inte krävs någon annan funktionalitet för detta projekt.
Anledningen till att välja stift 1.4 som utgångsstift är att den inbyggda test-lysdioden är ansluten till den stiften i utvecklingskortet, så vi behöver inga externa lysdioder. Men i denna mikrokontroller av 20 stift kan 10 stift användas som en PWM-utgångsstift och alla andra PWM-stift kan användas för utgångsrelaterade ändamål.
PWM-register och funktioner i N76E003 Nuvoton Microcontroller
N76E003 använder systemklocka eller Timer 1-flöde dividerat med en PWM-klocka med Prescaler som kan väljas från 1/1 ~ 1/128. PWM-perioden kan ställas in med 16-bitars periodregistret PWMPH och PWMPL-registret.
Mikrokontrollern har sex individuella PWM-register som genererar sex PWM-signaler som kallas PG0, PG1, PG2, PG3, PG4 och PG5. Men perioden är densamma för varje PWM-kanal eftersom de delar samma 16-bitars periodräknare men arbetscykeln för varje PWM kan skilja sig från andra eftersom varje PWM använder olika 16-bitars arbetscykelregister med namnet {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} och {PWM5H, PWM5L}. I N76E003 kan sålunda sex PWM-utgångar genereras oberoende med olika arbetscykler.
Till skillnad från andra mikrokontroller, aktiverar PWM inte I / O-stiften i deras PWM-utgång automatiskt. Således måste användaren konfigurera I / O-utgångsläget.
Så vad som än krävs för applikationen är det första steget att bestämma eller välja vilken eller två eller till och med mer än två I / O-stift som PWM-utgång. Efter att ha valt en måste I / O-stiften ställas in som Push-Pull-läge eller kvasi dubbelriktad för att generera PWM-signalen. Detta kan väljas med hjälp av PxM1- och PxM2-registret. Dessa två register ställer in I / O-lägen där x står för portnumret (till exempel Port P1.0 kommer registret att vara P1M1 och P1M2, för P3.0 blir det P3M1 och P3M2, etc.)
Konfigurationen kan ses i nedanstående bild-
Därefter är nästa steg att aktivera PWM i den specifika I / O-stift. För att göra detta måste användaren ställa in PIOCON0- eller PIOCON1-registren. Registret är beroende av stiftmappningen eftersom PIOCON0 och PIOCON1 styr olika stift beroende på PWM-signalerna. Konfigurationen av dessa två register kan ses i bilden nedan-
Som vi kan se kontrollerar ovanstående register 6 konfigurationer. För resten använder du PIOCON1-registret.
Således styr ovanstående register de övriga 4 konfigurationerna.
PWM-driftlägen i Nuvoton N6E003 Microcontroller
Nästa steg är att välja PWM-driftlägen. Varje PWM stöder tre driftslägen - Oberoende, synkron och dödtid aktiveringsläge.
Oberoende läge ger lösningen där de sex PWM-signalerna kan genereras oberoende. Detta krävs maximalt gånger när LED-relaterade funktioner eller ljudsignaler måste slås på och kontrolleras.
Det synkrona läget ställer in PG1 / 3/5 i samma fas-PWM-utgång, samma som PG0 / 2/4, där PG0 / 2/4 tillhandahåller oberoende PWM-utgångssignaler. Detta krävs främst för styrning av trefasmotorer.
Den insättningsläget Dead-Time är lite komplicerat och tillämpas i verkliga motortillämpningar, speciellt i industriella applikationer. I sådana applikationer måste en kompletterande PWM-utgång vara "dead-time" -insättning som förhindrar skada på strömbrytare som GPIB. Konfigurationerna är inställda i detta läge på ett sätt som PG0 / 2/4 ger PWM-utgångssignaler på samma sätt som oberoende läge men PG1 / 3/5 ger "utfas PWM-signaler" -utgång på PG0 / 2/4 motsvarande och ignorera PG1 / 3/5 Duty register.
Ovanför tre lägen kan väljas med hjälp av nedanstående registerkonfiguration-
Nästa konfiguration är valet av PWM-typer som använder PWMCON1-registret.
Så som vi kan se finns två PWM-typer tillgängliga som kan väljas med hjälp av registret ovan. I kantjusterat använder 16-bitarsräknaren enstegsoperation genom att räkna upp från 0000H till det inställda värdet på {PWMPH, PWMPL} och sedan börja från 0000H. Utgångsvågformen är inriktad till vänster.
Men i mittjusterat läge använder 16-bitarsräknaren dubbellutning genom att räkna upp från 0000H till {PWMPH, PWMPL} och går sedan igen från {PWMPH, PWMPL} till 0000H genom att räkna ner. Utgången är mittjusterad och den är användbar för att generera icke-överlappande vågformer. Nu äntligen PWM-kontrollåtgärder som kan kontrolleras i nedanstående register -
För att ställa in klockkällan, använd CKCON-klockregistret.
PWM-utsignalen kan också maskeras med hjälp av PMEN-registret. Med detta register kan användaren maskera utsignalen med 0 eller 1.
Nästa är PWM Control Register-
Ovanstående register är användbart för att köra PWM, ladda ny period och arbetsbelastning, styra PWM-flaggan och rensa PWM-räknaren.
De tillhörande bitkonfigurationerna visas nedan-
För att ställa in klockavdelaren, använd PWMCON1-registret för PWM-klockavdelaren. Den 5: e biten används för gruppläge aktiverad grupperad PWM och ger samma arbetscykel för de första tre PWM-paren.
Programmering av Nuvoton N76E003 för PWM
Kodningen är enkel och den fullständiga koden som används i denna handledning finns längst ner på denna sida. Lysdioden är ansluten till P1.4-stiftet. Således behövs P1.4-stiftet för att användas för PWM-utgång.
I huvudprogrammet görs inställningarna i respektive ordning. Nedanför rader med koder anger PWM och konfigurerar P1.4-stiftet som PWM-utgång.
P14_PushPull_Mode;
Detta används för att ställa in stift P1.4 i push-pull-läge. Detta definieras i Function_define.h- biblioteket som-
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
Nästa rader som används för att aktivera PWM i stift P1.4. Detta definieras också i biblioteket Function_define.h-
#define 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-utgång aktiverar PWM_IMDEPENDENT_MODE;
Koden nedan används för att ställa in PWM i oberoende läge. I biblioteket Function_define.h definieras det som-
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Då måste vi ställa in PWM-utgången av EDGE-typ. I biblioteket Function_define.h definieras det som-
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Därefter måste vi rensa PWM-räknarvärdet som är tillgängligt i SFR_Macro.h- biblioteket-
#define set_CLRPWM CLRPWM = 1
Därefter väljs PWM-klockan som Fsys-klocka och divisionsfaktorn som används är 64-divisionen.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Båda definieras som-
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
Under raden kod används för att maskera utgången PWM-signal med 0 definierad som-
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Då måste vi ställa in tid för PWM-signalen. Denna funktion ställer in perioden i PWMPL- och PWMPH-registret. Eftersom detta är ett 16-bitarsregister använder funktionen en bitförskjutningsmetod för att ställa in PWM-perioden.
ogiltig set_PWM_period (osignerat int-värde) { PWMPL = (värde & 0x00FF); PWMPH = ((värde & 0xFF00) >> 8); }
Men förutom 1023- och 8-bitarsperioden kan användare också använda andra värden. Att öka perioden resulterar i mjuk avbländning eller blekning.
set_PWMRUN;
Detta startar PWM som definieras i SFR_Macro.h- biblioteket som-
#define set_PWMRUN PWMRUN = 1
Därefter tänds LED-lampan och släcks kontinuerligt under stundslingan.
medan (1) { för (värde = 0; värde <1024; värde + = 10) { set_PWM1 (värde); Timer1_Delay10ms (3); } för (värde = 1023; värde> 0; värde - = 10) { set_PWM1 (värde); Timer1_Delay10ms (2); } } }
Arbetscykeln ställs in av set_PWM1 (); en funktion som ställer in arbetscykeln i PWM1L- och PWM1H-registret.
ogiltig set_PWM1 (osignerat int-värde) { PWM1L = (värde & 0x00FF); PWM1H = ((värde & 0xFF00) >> 8); set_LOAD; }
Blinkar koden och testar utdata
När koden är klar är det bara att kompilera den och ladda upp den till styrenheten. Om du är ny i miljön, kolla in att komma igång med Nuvoton N76E003 handledning för att lära dig grunderna. Som du kan se från resultatet nedan returnerade koden 0 varning och 0 fel och blinkade med hjälp av standardblinkningsmetoden av Keil. Applikationen börjar fungera.
Ombyggnad startade: Projekt: PWM Ombyggnadsmål 'Mål 1' monterar STARTUP.A51… kompilerar main.c… kompilerar Delay.c… länkar… Programstorlek: data = 35,1 xdata = 0 kod = 709 skapar hexfil från ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 Fel, 0 Varning (ar). Byggtid förflutit: 00:00:05
Maskinvaran är ansluten till strömkällan och den fungerade som förväntat. Det är ljusstyrkan på den inbyggda lysdioden reducerad och sedan ökad för att indikera PWM-arbetscykelns förändring.
Hela arbetet med denna handledning finns också i videon som länkas nedan. Hoppas att du gillade handledningen och lärde dig något användbart om du har några frågor, lämna dem i kommentarsektionen eller så kan du använda våra forum för andra tekniska frågor.