- PWM (Modulation Width Width)
- Pinii PWM din ARM7-LPC2148
- Înregistrări PWM în ARM7-LPC2148
- Componente necesare
- Diagrama circuitului și conexiunile
- Programare ARM7-LPC2148 pentru PWM
- Pași implicați în programarea LPC2148 pentru PWM și ADC
După cum știm, microcontrolerele preiau intrări analogice de la senzorii analogici și folosesc ADC (convertor analogic digital) pentru a procesa aceste semnale. Dar ce se întâmplă dacă un microcontroler dorește să producă un semnal analogic pentru a controla dispozitivele acționate analog, cum ar fi un servomotor, un motor DC etc.? Microcontrolerele nu produc tensiune de ieșire precum 1V, 5V, ci folosesc o tehnică numită PWM pentru operarea dispozitivelor analogice. Un exemplu de PWM este ventilatorul de răcire (motor DC) al laptopului nostru, care trebuie să fie controlat de viteză în funcție de temperatură, și același lucru este implementat prin utilizarea tehnicii de modulare a lățimii pulsului (PWM) în plăcile de bază.
În acest tutorial vom controla luminozitatea unui LED folosind PWM în microcontrolerul ARM7-LPC2148.
PWM (Modulation Width Width)
PWM este o modalitate bună de a controla dispozitivele analogice folosind valoare digitală, cum ar fi controlul vitezei motorului, luminozitatea unui led etc. Deși PWM nu oferă ieșire analogică pură, dar generează impulsuri analogice decente pentru a controla dispozitivele analogice. PWM modulează de fapt lățimea unei unde de impuls dreptunghiulare pentru a obține o variație a valorii medii a undei rezultate.
Ciclul de funcționare al PWM
Procentul de timp în care semnalul PWM rămâne HIGH (la timp) este numit ciclu de funcționare. Dacă semnalul este întotdeauna PORNIT, este în ciclu de funcționare 100% și dacă este întotdeauna oprit, este ciclu de funcționare de 0%.
Ciclul de funcționare = Timp de pornire / (Timp de pornire + Timp de oprire)
Pinii PWM din ARM7-LPC2148
Imaginea de mai jos indică pinii de ieșire PWM ai ARM7-LPC2148. Există șase pini în total pentru PWM.
Canal PWM |
Pinii portului LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Înregistrări PWM în ARM7-LPC2148
Înainte de a intra în proiectul nostru, trebuie să știm despre registrele PWM din LPC2148.
Iată lista registrelor utilizate în LPC2148 pentru PWM
1. PWMPR: PWM Prescale Register
Utilizare: Este un registru pe 32 de biți. Acesta conține numărul de ori (minus 1) PCLK trebuie să cicleze înainte de a incrementa PWM Timer Counter (De fapt, deține valoarea maximă a contorului de prescalare).
2. PWMPC: PWM Prescaler Counter
Utilizare: Este un registru pe 32 de biți . Conține valoarea contorului incremental. Când această valoare este egală cu valoarea PR plus 1, PWM Timer Counter (TC) este incrementat.
3. PWMTCR: Registrul de control al temporizatorului PWM
Utilizare: Conține biți de control Counter Enable, Counter Reset și PWM Enable. Este un registru pe 8 biți.
7: 4 |
3 |
2 |
1 |
0 |
REZERVAT |
PWM ENABLE |
REZERVAT |
RESETARE CONTOR |
CONTORUL ACTIVAT |
- Activare PWM: (Bit-3)
0- PWM dezactivat
1- PWM activat
- Activare contor: (Bit-0)
0- Dezactivare contoare
1- Activare contor
- Resetare contor: (Bit-1)
0- Nu face nimic.
1- Resetează PWMTC și PWMPC pe marginea pozitivă a PCLK.
4. PWMTC: PWM Timer Counter
Utilizare: Este un registru pe 32 de biți. Acesta conține valoarea curentă a cronometrului PWM incremental. Când Contorul Prescaler (PC) atinge valoarea Prescaler Register (PR) plus 1, acest contor este incrementat.
5. PWMIR: Registrul de întrerupere PWM
Utilizare: este un registru pe 16 biți. Conține semnalizatoarele de întrerupere pentru canalele de potrivire PWM 0-6. Un semnalizator de întrerupere este setat atunci când are loc o întrerupere pentru acel canal (MRx Interrupt) unde X este numărul canalului (0 la 6).
6. PWMMR0-PWMMR6: PWM Match Register
Utilizare: Este un registru pe 32 de biți . De fapt, grupul Match Channel permite setarea a 6 ieșiri PWM controlate cu o singură margine sau 3 ieșiri controlate cu o margine dublă. Puteți modifica cele șapte canale de potrivire pentru a configura aceste ieșiri PWM pentru a se potrivi cerințelor dvs. din PWMPCR.
7. PWMMCR: Registrul de control al potrivirii PWM
Utilizare: Este un registru pe 32 de biți. Acesta conține biții de întrerupere, resetare și oprire care controlează canalul de potrivire selectat. O potrivire are loc între registrele de potrivire PWM și contoare PWM Timer.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
REZERVAT |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Aici x este de la 0 la 6
- PWMMRxI (Bit-0)
ACTIVAȚI SAU DEZACTIVAȚI întreruperile PWM
0- Dezactivează întreruperile PWM Match.
1- Activați întreruperea PWM Match.
- PWMMRxR: (Bit-1)
RESET PWMTC - Valoarea contorului temporizatorului ori de câte ori se potrivește cu PWMRx
0- Nu face nimic.
1- Resetează PWMTC.
- PWMMRxS: (Bit 2)
STOP PWMTC & PWMPC atunci când PWMTC atinge valoarea registrului Match
0- Dezactivați caracteristica de oprire PWM.
1- Activați funcția PWM Stop.
8. PWMPCR: Registrul de control PWM
Utilizare: Este un registru pe 16 biți. Conține biții care permit ieșirile PWM 0-6 și selectează controlul cu o singură margine sau cu o margine dublă pentru fiecare ieșire.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
NEUTILIZAT |
PWMENA6-PWMENA1 |
NEUTILIZAT |
PWMSEL6-PWMSEL2 |
NEUTILIZAT |
- PWMSELx (x: 2 până la 6)
- Mod Single Edge pentru PWMx
- 1- Modul Double Edge pentru PWMx.
- PWMENAx (x: 1 până la 6)
- PWMx Dezactivare.
- 1- PWMx activat.
9. PWMLER: Registrul de activare a blocării PWM
Utilizare: Este un registru pe 8 biți. Conține biții Match x Latch pentru fiecare canal de meci.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
NEUTILIZAT |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 la 6):
0- Dezactivați încărcarea noilor valori de potrivire
1- Încărcați noile valori de potrivire din (PWMMRx) Înregistrare PWMMatch când temporizatorul este resetat.
Acum să începem să construim setările hardware pentru a demonstra modularea lățimii pulsului în microcontrolerul ARM.
Componente necesare
Hardware
- Microcontroler ARM7-LPC2148
- CI regulator de tensiune 3.3V
- Potențiometru 10k
- LED (orice culoare)
- Modul de afișare LCD (16x2)
- Breadboard
- Conectarea firelor
Software
- Keil uVision5
- Instrument Flash Magic
Diagrama circuitului și conexiunile
Conexiuni între LCD și ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Selectare înregistrare) |
P0.6 |
E (Activare) |
P0.12 |
D4 (pinul de date 4) |
P0.13 |
D5 (pinul de date 5) |
P0.14 |
D6 (pinul 6) |
P0.15 |
D7 (pinul de date 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Conexiune între LED și ARM7-LPC2148
ANODUL LED-ului este conectat la ieșirea PWM (P0.0) a LPC2148, în timp ce pinul CATHODE al LED-ului este conectat la pinul GND al LPC2148.
Conexiune între ARM7-LPC2148 și potențiometru cu regulator de tensiune de 3,3V
CI regulator de tensiune 3.3V |
Funcția Pin |
ARM-7 LPC2148 Pin |
1. Pin stânga |
- Am venit de la GND |
Pinul GND |
2. Centrul Pin |
Ieșire reglementată + 3.3V |
Pentru intrarea potențiometrului și ieșirea potențiometrului la P0.28 din LPC2148 |
3. Pinul drept |
+ Ve de la 5V INTRARE |
+ 5V |
Puncte de remarcat
1. Un regulator de tensiune de 3,3V este utilizat aici pentru a furniza valoarea de intrare analogică a pinului ADC (P0.28) al LPC2148 și, deoarece folosim puterea de 5V, trebuie să reglăm tensiunea cu regulatorul de tensiune de 3,3V.
2. Un potențiometru este utilizat pentru a varia tensiunea între (0V până la 3,3V) pentru a furniza intrare analogică (ADC) la pinul LPC2148 P0.28
Programare ARM7-LPC2148 pentru PWM
Pentru a programa ARM7-LPC2148 avem nevoie de instrumentul keil uVision și Flash Magic. Folosim cablul USB pentru a programa Stick ARM7 prin port micro USB. Scriem cod folosind Keil și creăm un fișier hexagonal și apoi fișierul HEX este afișat pe stick-ul ARM7 folosind Flash Magic. Pentru a afla mai multe despre instalarea keil uVision și Flash Magic și despre modul de utilizare, urmați linkul Noțiuni introductive despre microcontrolerul ARM7 LPC2148 și programați-l folosind Keil uVision.
În acest tutorial vom folosi tehnica ADC și PWM pentru a controla luminozitatea LED-ului. Aici LPC2148 primește intrare analogică (0 până la 3,3 V) prin pinul de intrare ADC P0.28, apoi această intrare analogică este convertită în valoare digitală (0 până la 1023). Apoi, această valoare este din nou convertită în valoare digitală (0 - 255) deoarece ieșirea PWM a LPC2148 are doar o rezoluție de 8 biți (2 8). LED-ul este conectat la pinul PWM P0.0, iar luminozitatea LED-ului poate fi controlată folosind potențiometrul. Pentru a afla mai multe despre ADC în ARM7-LPC2148, urmați linkul.
Pași implicați în programarea LPC2148 pentru PWM și ADC
Pasul 1: - Primul lucru este să configurați PLL-ul pentru generarea ceasului, deoarece setează ceasul sistemului și ceasul periferic al LPC2148, conform programatorilor. Frecvența maximă a ceasului pentru LPC2148 este de 60Mhz. Următoarele linii sunt utilizate pentru a configura generarea ceasului PLL.
void initilizePLL (void) // Funcția de a utiliza PLL pentru generarea ceasului { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Pasul 2: - Următorul lucru este să selectați pinii PWM și funcția PWM a LPC2148 utilizând registrul PINSEL. Folosim PINSEL0 deoarece folosim P0.0 pentru ieșirea PWM a LPC2148.
PINSEL0 = 0x00000002; // Setarea pinului P0.0 pentru ieșirea PWM
Pasul 3: - În continuare trebuie să RESETăm cronometrele folosind PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Setarea PWM Timer Control Register ca resetare contor
Și apoi, setați valoarea prescalei care decide rezoluția PWM. Îl setez la zero
PWMPR = 0X00; // Setarea valorii prescalei PWM
Pasul 4: - Apoi, trebuie să setăm PWMMCR (registrul de control al potrivirii PWM), deoarece setează operațiunea, cum ar fi resetarea, întreruperile pentru PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Setarea PWM Match Control Register
Pasul 5: - Perioada maximă a canalului PWM este setată utilizând PWMMR.
PWMMR0 = PWMvalue; // Oferind valoare PWM Valoare maximă
În cazul nostru, valoarea maximă este 255 (pentru luminozitate maximă)
Pasul 6: - Apoi trebuie să setăm Latch Enable la registrele de potrivire corespunzătoare utilizând PWMLER
PWMLER = (1 << 0); // Zăvor Enalbe PWM
(Folosim PWMMR0) Deci, activați bitul corespunzător setând 1 în PWMLER
Pasul 7: - Pentru a activa ieșirea PWM la pin, trebuie să folosim PWMTCR pentru activarea contoarelor PWM Timer și a modurilor PWM.
PWMTCR = (1 << 0) - (1 << 3); // Activarea contorului PWM și PWM
Pasul 8: - Acum trebuie să obținem valorile potențiometrului pentru setarea ciclului de funcționare al PWM de la pinul ADC P0.28. Deci, folosim modulul ADC în LPC2148 pentru conversia intrării analogice a potențiometrelor (0 la 3,3 V) la valorile ADC (0 la 1023).
Aici convertim valorile de la 0-1023 la 0-255 împărțind-o cu 4 deoarece PWM din LPC2148 are o rezoluție de 8 biți (2 8).
Pasul 9: - Pentru selectarea pinului ADC P0.28 în LPC2148, folosim
PINSEL1 = 0x01000000; // Setarea P0.28 ca ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Setarea ceasului și a PDN pentru conversia A / D
Următoarele linii captează intrarea analogică (0 la 3,3 V) și o convertesc în valoare digitală (0 la 1023). Și apoi aceste valori digitale sunt împărțite la 4 pentru a le converti în (0 la 255) și în cele din urmă alimentate ca ieșire PWM în pinul P0.0 al LPC2148 pe care este conectat LED-ul.
AD0CR - = (1 << 1); // Selectați canalul AD0.1 în timpul de întârziere al registrului ADC (10); AD0CR - = (1 << 24); // Începeți conversia A / D în timp ce ((AD0DR1 & (1 << 31)) == 0); // Verificați bitul DONE în registrul de date ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Obțineți REZULTATUL din registrul de date ADC dutycycle = adcvalue / 4; // formula pentru a obține valorile dutycycle de la (0 la 255) PWMMR1 = dutycycle; // setați valoarea ciclului dutycycle la registrul de potrivire PWM PWMLER - = (1 << 1); // Activați ieșirea PWM cu valoarea ciclului de lucru
Pasul 10: - Apoi afișăm acele valori în modulul de afișare LCD (16X2). Așadar, adăugăm următoarele linii pentru a inițializa modulul de afișare LCD
Void LCD_INITILIZE (void) // Funcție pentru a pregăti ecranul LCD { IO0DIR = 0x0000FFF0; // Setează pinul P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 ca întârziere OUTPUT (20); LCD_SEND (0x02); // Inițializați lcd în modul de operare pe 4 biți LCD_SEND (0x28); // 2 linii (16X2) LCD_SEND (0x0C); // Afișare pe cursor dezactivat LCD_SEND (0x06); // Cursor auto increment LCD_SEND (0x01); // Afișează LCD_SEND clar (0x80); // Prima linie prima poziție }
Pe măsură ce conectăm ecranul LCD în modul 4 biți cu LPC2148, trebuie să trimitem valori pentru a fi afișate ca nibble by nibble (Upper Nibble & Lower Nibble). Deci se folosesc următoarele rânduri.
void LCD_DISPLAY (char * msg) // Funcția de imprimare a caracterelor trimise unul câte unul { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Trimite nibble superior IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH pentru a imprima date IO0CLR = 0x00000020; // RW LOW Timp de întârziere în scriere (2); IO0CLR = 0x00000040; // EN = 0, RS și RW neschimbate (adică RS = 1, RW = 0) întârziere (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Trimite nibble inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; întârziere (2); IO0CLR = 0x00000040; întârziere (5); i ++; } }
Pentru a afișa acele valori ADC și PWM folosim următoarele linii în funcția int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Afișați valoarea ADC ( 0-1023 ) LCD_SEND (0xC0); sprintf (ieșire led, "PWM OP =%. 2f", luminozitate); LCD_DISPLAY (ieșire led); // Afișați valorile ciclului de lucru de la (0 la 255)
Codul complet și descrierea video a tutorialului sunt prezentate mai jos.