- Basisprincipes van PWM-signaal
- Hardware-installatie en vereisten
- Schakelschema voor Nuvoton N76E003 Microcontroller LED-dimmen
- PWM-pinnen op N76E003 Nuvoton-microcontroller
- PWM-registers en functies in N76E003 Nuvoton Microcontroller
- PWM-bedrijfsmodi in Nuvoton N6E003-microcontroller
- Nuvoton N76E003 programmeren voor PWM
- De code knipperen en de uitvoer testen
Pulsbreedtemodulatie (PWM) is een veelgebruikte techniek in microcontrollers om een continu pulssignaal te produceren met een gedefinieerde frequentie en duty-cycle. Kort gezegd gaat PWM over het veranderen van de breedte van een puls terwijl de frequentie constant is.
Een PWM-signaal wordt meestal gebruikt bij het regelen van een servomotor of de helderheid van een LED. Aangezien microcontrollers alleen Logic 1 (High) of Logic 0 (Low) op de uitgangspennen kunnen leveren, kan deze geen variërende analoge spanning leveren tenzij een DAC of digitaal-naar-analoog-omzetter wordt gebruikt. In dat geval kan de microcontroller worden geprogrammeerd om een PWM uit te voeren met een gevarieerde duty-cycle, die vervolgens kan worden omgezet in de variërende analoge spanning. We hebben eerder PWM-randapparatuur ook in veel andere microcontrollers gebruikt.
- ARM7-LPC2148 PWM-zelfstudie: helderheid van led regelen
- Pulsbreedtemodulatie (PWM) met MSP430G2: Helderheid van LED regelen
- PWM genereren met behulp van PIC Microcontroller met MPLAB en XC8
- Pulsbreedtemodulatie (PWM) in STM32F103C8: Regelsnelheid van DC-ventilator
- Genereren van PWM-signalen op GPIO-pinnen van PIC Microcontroller
- Raspberry Pi PWM-zelfstudie
- PWM-zelfstudie met ESP32
In deze tutorial zullen we een LED koppelen die wordt aangestuurd met behulp van dit PWM-signaal van de N76E003-microcontrollereenheid. We zullen evalueren wat voor soort hardware-instellingen we nodig hebben en hoe we onze microcontroller moeten programmeren. Laten we eerst wat basisprincipes van een PWM-signaal begrijpen.
Basisprincipes van PWM-signaal
In de onderstaande afbeelding wordt een constant PWM-signaal weergegeven.
De bovenstaande afbeelding is niets anders dan een constante blokgolf met dezelfde AAN-tijd en dezelfde UIT-tijd. Stel dat de totale duur van het signaal 1 seconde is. Dus de tijd aan en uit is 500 ms. Als een LED over dit signaal is aangesloten, gaat de LED 500 ms aan en 500 ms uit. Daarom zal de LED in perspectiefweergave oplichten met de helft van de werkelijke helderheid als deze wordt ingeschakeld op een direct 5V-signaal zonder enige uitschakeltijd.
Zoals weergegeven in de bovenstaande afbeelding, zal als de duty-cycle wordt gewijzigd, de LED oplichten met 25% van de werkelijke helderheid volgens hetzelfde principe als eerder besproken. Als je meer wilt weten over Pulse Width Modulation (PWM), kun je het gelinkte artikel lezen.
Hardware-installatie en vereisten
Omdat de vereiste van dit project is om LED's aan te sturen met PWM. Er is een led nodig om te worden aangesloten op N76E003. Omdat er een LED beschikbaar is in het N76E003-ontwikkelbord, zal deze in dit project worden gebruikt. Er zijn geen andere componenten vereist.
Om nog maar te zwijgen, we hebben zowel het N76E003-microcontroller- gebaseerde ontwikkelbord als de Nu-Link Programmer nodig. Een extra 5V-voedingseenheid kan nodig zijn als de programmer niet als stroombron wordt gebruikt.
Schakelschema voor Nuvoton N76E003 Microcontroller LED-dimmen
Zoals we in het onderstaande schema kunnen zien, is de test-LED beschikbaar in het ontwikkelbord en is deze aangesloten op poort 1.4. Helemaal links wordt de aansluiting van de programmeerinterface weergegeven.
PWM-pinnen op N76E003 Nuvoton-microcontroller
De N76E003 heeft 20 pinnen waarvan 10 pinnen kunnen worden gebruikt als PWM. De onderstaande afbeeldingen tonen de PWM-pinnen die zijn gemarkeerd in het rode vierkante vak.
Zoals we kunnen zien, kunnen de gemarkeerde PWM-pinnen ook voor andere doeleinden worden gebruikt. Dit andere doel van de pinnen is echter niet beschikbaar wanneer de pinnen zijn geconfigureerd voor PWM-uitvoer. Pin 1.4 die wordt gebruikt als een PWM-uitgangspen, verliest de andere functionaliteit. Maar dat is geen probleem aangezien er geen andere functionaliteit nodig is voor dit project.
De reden achter het kiezen van pin 1.4 als uitgangspin is omdat de ingebouwde test-LED op die pin in het ontwikkelbord is aangesloten, dus we hebben geen externe LED's nodig. In deze microcontroller van 20 pinnen kunnen echter 10 pinnen worden gebruikt als een PWM-uitgangspen en alle andere PWM-pinnen kunnen worden gebruikt voor outputgerelateerde doeleinden.
PWM-registers en functies in N76E003 Nuvoton Microcontroller
N76E003 gebruikt systeemklok of timer 1 overloop gedeeld door een PWM-klok met Prescaler selecteerbaar van 1/1 ~ 1/128. De PWM-periode kan worden ingesteld met behulp van het 16-bits perioderegister PWMPH en PWMPL-register.
De microcontroller heeft zes individuele PWM-registers die zes PWM-signalen genereren: PG0, PG1, PG2, PG3, PG4 en PG5. De periode is echter hetzelfde voor elk PWM-kanaal omdat ze dezelfde 16-bits periodeteller delen, maar de duty-cycle van elke PWM kan verschillen van die van andere, aangezien elke PWM een ander 16-bit duty-cycle- register gebruikt met de naam {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} en {PWM5H, PWM5L}. Zo kunnen in N76E003 zes PWM-uitgangen onafhankelijk worden gegenereerd met verschillende werkcycli.
In tegenstelling tot bij andere microcontrollers, worden bij het inschakelen van de PWM de I / O-pinnen niet automatisch in hun PWM-uitgang gezet. De gebruiker moet dus de I / O-uitvoermodus configureren.
Dus, wat er ook nodig is voor de applicatie, de eerste stap is om te bepalen of te selecteren welke een of twee of zelfs meer dan twee I / O-pinnen als PWM-uitvoer. Nadat u er een hebt geselecteerd, moeten de I / O-pinnen worden ingesteld als Push-Pull-modus of Quasi-bidirectioneel voor het genereren van het PWM-signaal. Dit kan worden geselecteerd met behulp van het PxM1- en PxM2-register. Deze twee registers stellen de I / O-modi in waarbij de x staat voor het poortnummer (bijvoorbeeld poort P1.0 is het register P1M1 en P1M2, voor P3.0 is het P3M1 en P3M2, enz.)
De configuratie is te zien in de onderstaande afbeelding-
Vervolgens is de volgende stap om de PWM in die bepaalde I / O-pin (s) in te schakelen. Om dit te doen, moet de gebruiker de registers PIOCON0 of PIOCON1 instellen. Het register is afhankelijk van de pin-mapping aangezien PIOCON0 en PIOCON1 verschillende pins aansturen, afhankelijk van de PWM-signalen. De configuratie van deze twee registers is te zien in de onderstaande afbeelding-
Zoals we kunnen zien, bestuurt het bovenstaande register 6 configuraties. Gebruik voor de rest het PIOCON1-register.
Het bovenstaande register bestuurt dus de overige 4 configuraties.
PWM-bedrijfsmodi in Nuvoton N6E003-microcontroller
De volgende stap is het selecteren van de PWM-bedieningsmodi. Elke PWM ondersteunt drie bedieningsmodi: onafhankelijke, synchrone en dode tijd-inschakelmodus.
De onafhankelijke modus biedt de oplossing waarbij de zes PWM-signalen onafhankelijk kunnen worden gegenereerd. Dit is een maximum aantal keren vereist wanneer LED-gerelateerde bewerkingen of zoemers moeten worden ingeschakeld en bediend.
De synchrone modus stelt de PG1 / 3/5 in op dezelfde in-fase PWM-uitgang, hetzelfde als PG0 / 2/4, waarbij de PG0 / 2/4 onafhankelijke PWM-uitgangssignalen levert. Dit is voornamelijk nodig voor het aansturen van driefasige motoren.
De invoegmodus voor dode tijd is een beetje ingewikkeld en wordt toegepast in echte motortoepassingen, vooral in industriële toepassingen. In dergelijke toepassingen moet een complementaire PWM-uitgang een "dode tijd" -invoer zijn om beschadiging van de stroomschakelaars zoals GPIB's te voorkomen. De configuraties zijn in deze modus ingesteld op een manier dat de PG0 / 2/4 PWM-uitgangssignalen levert op dezelfde manier als de onafhankelijke modus, maar PG1 / 3/5 levert een `` out-phase PWM-signalen '' -uitvoer van PG0 / 2/4 overeenkomstig en negeer PG1 / 3/5 Duty register.
Bovenstaande drie modi kunnen worden geselecteerd met behulp van de onderstaande registerconfiguratie-
De volgende configuratie is de selectie van PWM-typen met behulp van het PWMCON1-register.
Zoals we kunnen zien, zijn er dus twee PWM-typen beschikbaar die kunnen worden geselecteerd met behulp van het bovenstaande register. Bij randuitlijning gebruikt de 16-bits teller een enkele helling door op te tellen van 0000H tot de ingestelde waarde van {PWMPH, PWMPL}, en dan te beginnen vanaf 0000H. De uitgangsgolfvorm is uitgelijnd met de linkerrand.
Maar in de gecentreerde modus gebruikt de 16-bits teller een werking met dubbele hellingshoek door op te tellen van 0000H tot {PWMPH, PWMPL} en vervolgens weer van {PWMPH, PWMPL} naar 0000H door af te tellen. De output is gecentreerd en is handig voor het genereren van niet-overlappende golfvormen. Nu eindelijk de PWM-besturingsbewerkingen die kunnen worden gecontroleerd in de onderstaande registers-
Gebruik het klokcontroleregister van CKCON om de klokbron in te stellen.
Het PWM-uitgangssignaal kan ook worden gemaskeerd met behulp van het PMEN-register. Met behulp van dit register kan de gebruiker het uitgangssignaal met 0 of 1 maskeren.
Het volgende is het PWM-controleregister-
Het bovenstaande register is handig om de PWM uit te voeren, een nieuwe periode en taakbelasting te laden, de PWM-vlag te besturen en de PWM-teller te wissen.
De bijbehorende bitconfiguraties worden hieronder weergegeven:
Om de klokverdeler in te stellen, gebruikt u het PWMCON1-register voor de PWM- klokverdeler. De 5e bit wordt gebruikt voor de groepsmodus ingeschakeld gegroepeerde PWM en biedt dezelfde duty-cycle voor de eerste drie PWM-paren.
Nuvoton N76E003 programmeren voor PWM
De codering is eenvoudig en de volledige code die voor deze tutorial wordt gebruikt, vindt u onderaan deze pagina. De LED is verbonden met de P1.4-pin. Dus de P1.4-pin is nodig om te worden gebruikt voor PWM-uitvoer.
In het hoofdprogramma worden de instellingen in de respectievelijke volgorde gedaan. Onderstaande coderegels stelt de PWM in en configureert de P1.4-pin als PWM-uitvoer.
P14_PushPull_Mode;
Dit wordt gebruikt om de pin P1.4 in push-pull modus te zetten. Dit wordt gedefinieerd in de Function_define.h bibliotheek als-
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
De volgende regels werden gebruikt om de PWM in pin P1.4 in te schakelen. Dit is ook gedefinieerd in de Function_define.h bibliotheek als-
#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_TMP //P1.4 as PWM1-uitvoer inschakelen PWM_IMDEPENDENT_MODE;
De onderstaande code wordt gebruikt om de PWM in onafhankelijke modus in te stellen. In de Function_define.h bibliotheek, is het gedefinieerd als-
# definiëren PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Vervolgens moeten we de PWM-uitgang van het EDGE-type instellen. In de Function_define.h bibliotheek, is het gedefinieerd als-
# definiëren PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Vervolgens moeten we de PWM-tellerwaarde wissen die beschikbaar is in SFR_Macro.h bibliotheek-
# definiëren set_CLRPWM CLRPWM = 1
Daarna wordt de PWM-klok geselecteerd als de Fsys-klok en de gebruikte deelfactor is de 64-deling.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Beide worden gedefinieerd als
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
Onderstaande coderegel wordt gebruikt om het PWM-uitgangssignaal te maskeren met 0 gedefinieerd als-
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Dan moeten we de periodetijd van het PWM-signaal instellen. Deze functie stelt de periode in het PWMPL- en PWMPH-register in. Aangezien dit een 16-bits register is, gebruikt de functie een bitverschuivingsmethode om de PWM-periode in te stellen.
void set_PWM_period (niet-ondertekende int-waarde) { PWMPL = (waarde & 0x00FF); PWMPH = ((waarde & 0xFF00) >> 8); }
Behalve de 1023 en 8-bits periode kunnen gebruikers echter ook andere waarden gebruiken. Het verlengen van de periode resulteert in vloeiend dimmen of vervagen.
set_PWMRUN;
Hiermee wordt de PWM gestart die is gedefinieerd in de SFR_Macro.h- bibliotheek als-
# definiëren set_PWMRUN PWMRUN = 1
Vervolgens wordt in de while-lus de LED continu ingeschakeld en vervaagd.
while (1) { for (waarde = 0; waarde <1024; waarde + = 10) { set_PWM1 (waarde); Timer1_Delay10ms (3); } voor (waarde = 1023; waarde> 0; waarde - = 10) { set_PWM1 (waarde); Timer1_Delay10ms (2); } } }
De duty-cycle wordt ingesteld door de set_PWM1 ();, een functie die de duty-cycle instelt in het PWM1L- en PWM1H-register.
ongeldige set_PWM1 (niet-ondertekende int-waarde) { PWM1L = (waarde & 0x00FF); PWM1H = ((waarde & 0xFF00) >> 8); set_LOAD; }
De code knipperen en de uitvoer testen
Zodra de code klaar is, compileert u deze en uploadt u deze naar de controller. Als u nieuw bent in de omgeving, bekijk dan de handleiding Aan de slag met Nuvoton N76E003 om de basisprincipes te leren. Zoals u kunt zien aan de hand van het onderstaande resultaat, retourneerde de code 0 waarschuwing en 0 fouten en flitste met behulp van de standaard knippermethode van de Keil. De applicatie begint te werken.
Heropbouw gestart: Project: PWM Herbouw doel 'Doel 1' assembleren STARTUP.A51… compileren main.c… compileren Delay.c… koppelen… Programmagrootte: data = 35.1 xdata = 0 code = 709 aanmaken hex-bestand van ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 Fout (en), 0 Waarschuwing (en). Verstreken bouwtijd: 00:00:05
De hardware is aangesloten op de stroombron en werkte zoals verwacht. Dat is de helderheid van de ingebouwde LED verminderd en vervolgens verhoogd om de verandering van de PWM-duty-cycle aan te geven.
De volledige werking van deze tutorial is ook te vinden in de onderstaande video. Ik hoop dat je de tutorial leuk vond en iets nuttigs hebt geleerd als je vragen hebt, laat ze achter in het commentaargedeelte of je kunt onze forums gebruiken voor andere technische vragen.