- Bazele semnalului PWM
- Configurare și cerințe hardware
- Diagrama circuitului pentru diminuarea cu LED a microcontrolerului Nuvoton N76E003
- Pinii PWM pe microcontrolerul N76E003 Nuvoton
- Înregistrări și funcții PWM în microcontrolerul N76E003 Nuvoton
- Moduri de operare PWM în microcontrolerul Nuvoton N6E003
- Programare Nuvoton N76E003 pentru PWM
- Intermitentul codului și testarea ieșirii
Modularea lățimii pulsului (PWM) este o tehnică frecvent utilizată în microcontrolere pentru a produce un semnal de impuls continuu cu o frecvență și un ciclu de funcționare definite. Pe scurt, PWM este despre schimbarea lățimii unui impuls în timp ce frecvența este constantă.
Un semnal PWM este utilizat în principal în controlul unui servomotor sau al luminozității unui LED. De asemenea, deoarece microcontrolerele pot furniza Logic 1 (High) sau Logic 0 (Low) pe pinii de ieșire, nu poate oferi o tensiune analogică variabilă decât dacă se folosește un convertor DAC sau digital la analog. Într-un astfel de caz, microcontrolerul poate fi programat să emită un PWM cu un ciclu de funcționare variat care poate fi apoi convertit la tensiunea analogică variabilă. Am folosit anterior periferice PWM și în multe alte microcontrolere.
- Tutorial ARM7-LPC2148 PWM: Controlul luminozității LED-urilor
- Modulația lățimii impulsurilor (PWM) utilizând MSP430G2: Controlul luminozității LED-urilor
- Generarea PWM utilizând microcontrolerul PIC cu MPLAB și XC8
- Modulația lățimii impulsurilor (PWM) în STM32F103C8: Viteza de control a ventilatorului de curent continuu
- Generarea semnalelor PWM pe pinii GPIO ai microcontrolerului PIC
- Tutorial Raspberry Pi PWM
- Tutorial PWM cu ESP32
În acest tutorial, vom interfața un LED care va fi controlat folosind acest semnal PWM de la unitatea de microcontroler N76E003. Vom evalua ce fel de configurare hardware avem nevoie și cum ar trebui să ne programăm microcontrolerul. Înainte de asta, să înțelegem câteva elemente de bază ale unui semnal PWM.
Bazele semnalului PWM
În imaginea de mai jos este afișat un semnal PWM constant.
Imaginea de mai sus nu este altceva decât un val pătrat constant, cu același timp de pornire și același timp de OPRIRE. Să presupunem că perioada totală a semnalului este de 1 secundă. Astfel, timpul de pornire și oprire este de 500 ms. Dacă un LED este conectat la acest semnal, LED-ul se va aprinde timp de 500ms și se va stinge timp de 500ms. Prin urmare, în perspectivă, LED-ul se va aprinde cu jumătate din luminozitatea reală dacă este pornit pe un semnal direct de 5V fără timp de oprire.
Acum, așa cum se arată în imaginea de mai sus, dacă ciclul de funcționare este modificat, LED-ul se va aprinde cu 25% din luminozitatea reală folosind același principiu așa cum s-a discutat anterior. Dacă doriți să aflați mai multe și să aflați despre modularea lățimii pulsului (PWM), puteți consulta articolul legat.
Configurare și cerințe hardware
Deoarece cerința acestui proiect este de a controla LED-ul folosind PWM. Este necesar un LED pentru a fi interfațat cu N76E003. Deoarece un LED este disponibil în placa de dezvoltare N76E003, acesta va fi utilizat în acest proiect. Nu sunt necesare alte componente.
Ca să nu mai vorbim, avem nevoie de placa de dezvoltare bazată pe microcontroler N76E003, precum și de programatorul Nu-Link. O unitate de alimentare suplimentară de 5V poate fi necesară dacă programatorul nu este utilizat ca sursă de alimentare.
Diagrama circuitului pentru diminuarea cu LED a microcontrolerului Nuvoton N76E003
După cum putem vedea în schema de mai jos, LED-ul de testare este disponibil în interiorul plăcii de dezvoltare și este conectat la portul 1.4. În extrema stângă, este afișată conexiunea interfeței de programare.
Pinii PWM pe microcontrolerul N76E003 Nuvoton
N76E003 are 20 de pini, dintre care 10 pini pot fi folosiți ca PWM. Imaginile de mai jos prezintă pinii PWM evidențiați în caseta pătrată roșie.
După cum putem vedea, pinii PWM evidențiați pot fi folosiți și în alte scopuri. Cu toate acestea, acest alt scop al pinilor nu va fi disponibil atunci când pinii sunt configurați pentru ieșirea PWM. Pinul 1.4 care este utilizat ca pin de ieșire PWM, va pierde celelalte funcționalități. Dar aceasta nu este o problemă, deoarece nu este necesară o altă funcționalitate pentru acest proiect.
Motivul din spatele alegerii pinului 1.4 ca pin de ieșire se datorează faptului că LED-ul de test incorporat este conectat pe acel pin din placa de dezvoltare, deci nu avem nevoie de LED-uri externe. Cu toate acestea, în acest microcontroler din 20 de pini, 10 pini pot fi folosiți ca pin de ieșire PWM și orice alți pini PWM pot fi utilizați în scopuri legate de ieșire.
Înregistrări și funcții PWM în microcontrolerul N76E003 Nuvoton
N76E003 folosește ceasul de sistem sau Timer 1 overflow împărțit la un ceas PWM cu Prescaler selectabil de la 1/1 ~ 1/128. Perioada PWM poate fi setată utilizând registrul de perioadă pe 16 biți PWMPH și registrul PWMPL.
Microcontrolerul are șase registre PWM individuale care generează șase semnale PWM numite PG0, PG1, PG2, PG3, PG4 și PG5. Cu toate acestea, perioada este aceeași pentru fiecare canal PWM, deoarece acestea împărtășesc același contor de perioadă pe 16 biți, dar ciclul de funcționare al fiecărui PWM poate fi diferit de celelalte, deoarece fiecare PWM utilizează un registru de ciclu de funcționare pe 16 biți diferit numit {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} și {PWM5H, PWM5L}. Astfel, în N76E003, șase ieșiri PWM pot fi generate independent cu diferite cicluri de funcționare.
Spre deosebire de alte microcontrolere, activarea PWM nu setează pinii I / O în ieșirea lor PWM în mod automat. Astfel, utilizatorul trebuie să configureze modul de ieșire I / O.
Deci, orice este necesar pentru aplicație, primul pas este să determinați sau să selectați care unul sau doi sau chiar mai mult de doi pini I / O ca ieșire PWM. După selectarea unuia, pinii I / O trebuie să fie setați ca mod Push-Pull sau Quasi-bidirecțional pentru generarea semnalului PWM. Aceasta poate fi selectată utilizând registrul PxM1 și PxM2. Aceste două registre stabilesc modurile I / O în care x reprezintă numărul portului (de exemplu, portul P1.0 registrul va fi P1M1 și P1M2, pentru P3.0 va fi P3M1 și P3M2 etc.)
Configurația poate fi văzută în imaginea de mai jos
Apoi, următorul pas este să activați PWM în acele pini I / O anume. Pentru a face acest lucru, utilizatorul trebuie să seteze registrele PIOCON0 sau PIOCON1. Registrul depinde de maparea pinilor, deoarece PIOCON0 și PIOCON1 controlează diferiți pini în funcție de semnalele PWM. Configurația acestor două registre poate fi văzută în imaginea de mai jos
După cum putem vedea, registrul de mai sus controlează 6 configurații. În rest, utilizați registrul PIOCON1.
Astfel, registrul de mai sus controlează restul de 4 configurații.
Moduri de operare PWM în microcontrolerul Nuvoton N6E003
Următorul pas este selectarea modurilor de operare PWM. Fiecare PWM acceptă trei moduri de operare - modul de activare Independent, Sincron și Dead-Time.
Modul independent oferă soluția în care cele șase semnale PWM pot fi generate independent. Acest lucru este necesar de maxim ori atunci când operațiile legate de LED-uri sau sonerii trebuie să fie pornite și controlate.
Modul sincron setează PG1 / 3/5 în aceeași ieșire PWM în fază, la fel ca PG0 / 2/4, unde PG0 / 2/4 furnizează semnale de ieșire PWM independente. Acest lucru este necesar în principal pentru controlul motoarelor trifazate.
Modul de inserare Dead-Time este puțin complex și se aplică în aplicații cu motoare reale, în special în aplicații industriale. În astfel de aplicații, o ieșire PWM complementară trebuie să fie inserarea „în timp mort” care previne deteriorarea dispozitivelor de comutare a puterii, cum ar fi GPIB-urile. Configurațiile sunt setate în acest mod într-un mod în care PG0 / 2/4 furnizează semnale de ieșire PWM în același mod ca și modul independent, dar PG1 / 3/5 oferă ieșiri „semnale PWM în fază de ieșire” corespunzătoare și ignorați registrul de taxe PG1 / 3/5.
Peste trei moduri pot fi selectate folosind configurarea registrului de mai jos-
Următoarea configurație este selectarea tipurilor de PWM utilizând registrul PWMCON1.
Deci, după cum putem vedea, sunt disponibile două tipuri de PWM care pot fi selectate folosind registrul de mai sus. În linie de margine, contorul de 16 biți folosește operația cu o singură pantă numărând de la 0000H la valoarea setată de {PWMPH, PWMPL} și apoi începând de la 0000H. Forma de undă de ieșire este aliniată la marginea stângă.
Dar, în modul aliniat central, contorul pe 16 biți folosește operațiunea cu înclinare dublă, numărând de la 0000H la {PWMPH, PWMPL} și apoi trece din nou de la {PWMPH, PWMPL} la 0000H, numărând înapoi. Ieșirea este aliniată central și este utilă pentru generarea de forme de undă care nu se suprapun. Acum, în cele din urmă, operațiunile de control PWM care pot fi verificate în registrele de mai jos-
Pentru a seta sursa ceasului, utilizați registrul de control al ceasului CKCON.
Semnalul de ieșire PWM poate fi, de asemenea, mascat folosind registrul PMEN. Folosind acest registru, utilizatorul poate masca semnalul de ieșire cu 0 sau 1.
Următorul este Registrul de control PWM-
Registrul de mai sus este util pentru a rula PWM, pentru a încărca o nouă perioadă și încărcare, pentru a controla semnalizatorul PWM și pentru a șterge Contorul PWM.
Configurațiile de biți asociate sunt prezentate mai jos-
Pentru a seta divizorul de ceas, utilizați registrul PWMCON1 pentru divizorul de ceas PWM. Cel de-al 5-lea bit este utilizat pentru PWM grupat activat în modul Grup și oferă același ciclu de funcționare pentru primele trei perechi PWM.
Programare Nuvoton N76E003 pentru PWM
Codificarea este simplă, iar codul complet utilizat în acest tutorial poate fi găsit în partea de jos a acestei pagini. LED-ul este conectat la pinul P1.4. Astfel pinul P1.4 este necesar pentru a fi utilizat pentru ieșirea PWM.
În programul principal, setările se fac în ordinea respectivă. Mai jos, liniile de coduri setează PWM și configurează pinul P1.4 ca ieșire PWM.
P14_PushPull_Mode;
Acesta este utilizat pentru a seta pinul P1.4 în modul push-pull. Acest lucru este definit în biblioteca Function_define.h ca-
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
Următoarele linii utilizate pentru a activa PWM în pinul P1.4. Acest lucru este definit și în biblioteca Function_define.h ca-
#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 Ieșirea PWM1 activează PWM_IMDEPENDENT_MODE;
Codul de mai jos este utilizat pentru a seta PWM în modul independent. În biblioteca Function_define.h , este definit ca-
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Apoi trebuie să setăm ieșirea PWM de tip EDGE. În biblioteca Function_define.h , este definit ca-
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Apoi, trebuie să ștergem valoarea contorului PWM care este disponibilă în biblioteca SFR_Macro.h-
#define set_CLRPWM CLRPWM = 1
După aceea, ceasul PWM este selectat ca ceas Fsys și factorul de divizare utilizat este diviziunea 64.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Ambele sunt definite ca-
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
Sub linia de cod se utilizează pentru a masca semnalul PWM de ieșire cu 0 definit ca-
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Apoi, trebuie să setăm timpul perioadei semnalului PWM. Această funcție setează perioada în registrul PWMPL și PWMPH. Deoarece acesta este un registru pe 16 biți, funcția folosește o metodă de schimbare a biților pentru a seta Perioada PWM.
void set_PWM_period (valoare int nesemnată) { PWMPL = (valoare & 0x00FF); PWMPH = ((valoare & 0xFF00) >> 8); }
Cu toate acestea, în afara perioadei de 1023 și 8 biți, utilizatorii pot folosi și alte valori. Creșterea perioadei are ca rezultat o estompare sau o estompare netedă.
set_PWMRUN;
Aceasta va porni PWM care este definit în biblioteca SFR_Macro.h ca-
#define set_PWMRUN PWMRUN = 1
Apoi, în bucla while , LED-ul este aprins și estompat continuu.
while (1) { for (valoare = 0; valoare <1024; valoare + = 10) { set_PWM1 (valoare); Timer1_Delay10ms (3); } pentru (valoare = 1023; valoare> 0; valoare - = 10) { set_PWM1 (valoare); Timer1_Delay10ms (2); } } }
Ciclul de funcționare este setat de set_PWM1 ();, o funcție care setează ciclul de funcționare în registrul PWM1L și PWM1H.
void set_PWM1 (valoare int nesemnată) { PWM1L = (valoare & 0x00FF); PWM1H = ((valoare & 0xFF00) >> 8); set_LOAD; }
Intermitentul codului și testarea ieșirii
Odată ce codul este gata, compilați-l și încărcați-l în controler. Dacă sunteți nou în mediul înconjurător, verificați noțiunile de bază cu tutorialul Nuvoton N76E003 pentru a afla elementele de bază. După cum puteți vedea din rezultatul de mai jos, codul a returnat 0 avertisment și 0 erori și a clipit folosind metoda intermitentă implicită de Keil. Aplicația începe să funcționeze.
Reconstruirea a început: Proiect: PWM Reconstruirea țintei „Ținta 1” asamblarea STARTUP.A51… compilarea main.c… compilarea Delay.c… legarea… Dimensiunea programului: date = 35,1 xdata = 0 cod = 709 crearea fișier hexagonal din ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 Eroare, 0 Avertisment (e). Timp de construire scurs: 00:00:05
Hardware-ul este conectat la sursa de alimentare și funcționa așa cum era de așteptat. Aceasta este luminozitatea LED-ului de la bord redusă și apoi crescută pentru a indica schimbarea ciclului de funcționare PWM.
Funcționarea completă a acestui tutorial poate fi găsită și în videoclipul legat mai jos. Sper că ți-a plăcut tutorialul și ai învățat ceva util dacă ai întrebări, lasă-le în secțiunea de comentarii sau poți folosi forumurile noastre pentru alte întrebări tehnice.