- PWM (impulso pločio moduliacija)
- PWM kaiščiai ARM7-LPC2148
- PWM registrai ARM7-LPC2148
- Būtini komponentai
- Grandinės schema ir jungtys
- ARM7-LPC2148 programavimas PWM
- Veiksmai, susiję su „LPC2148“ programavimu PWM ir ADC
Kaip žinome, mikrovaldikliai ima analoginę įvestį iš analoginių jutiklių ir naudoja ADC (iš analoginio į skaitmeninį keitiklį) šiems signalams apdoroti. Bet ką daryti, jei mikrovaldiklis nori sukurti analoginį signalą valdyti analoginius valdomus įrenginius, tokius kaip „Servo“ variklis, nuolatinės srovės variklis ir pan.? Mikrokontroleriai negamina išėjimo įtampos, tokios kaip 1V, 5V, vietoj to, kad valdytų analoginius įrenginius, jie naudoja PWM vadinamą metodiką. PWM pavyzdys yra mūsų nešiojamojo kompiuterio aušinimo ventiliatorius (nuolatinės srovės variklis), kurį reikia valdyti greičiu pagal temperatūrą, ir tas pats įgyvendinamas naudojant pagrindinių plokščių pulso pločio moduliacijos (PWM) techniką.
Šioje pamokoje mes valdysime šviesos diodo ryškumą naudodami PWM mikrovaldiklyje ARM7-LPC2148.
PWM (impulso pločio moduliacija)
PWM yra geras būdas valdyti analoginius įrenginius naudojant skaitmeninę vertę, pvz., Variklio greičio, šviesos diodo ryškumo ir pan. Valdymą. Nors PWM neteikia grynos analoginės išvesties, tačiau sukuria tinkamus analoginius impulsus, kad valdytų analoginius įrenginius. PWM iš tikrųjų moduliuoja stačiakampio impulso bangos plotį, kad gautų gautos bangos vidutinės vertės kitimą.
PWM darbo ciklas
Laiko procentas, per kurį PWM signalas lieka AUKŠTAS (laiku), vadinamas darbo ciklu. Jei signalas visada įjungtas, jis yra 100% darbo ciklo, o jei jis visada išjungtas, jis yra 0%.
Darbo ciklas = Įjungti laiką / (Įjungti laiką + Išjungti laiką)
PWM kaiščiai ARM7-LPC2148
Žemiau pateiktame paveikslėlyje rodomi ARM7-LPC2148 PWM išvesties kaiščiai. Iš viso yra šeši PWM kaiščiai.
PWM kanalas |
LPC2148 prievado kaiščiai |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
PWM registrai ARM7-LPC2148
Prieš pradėdami savo projektą turime žinoti apie LPC2148 esančius PWM registrus.
Čia pateikiamas LPW2148 naudojamų PWM registrų sąrašas
1. PWMPR: PWM išankstinio skalės registras
Naudojimas: tai 32 bitų registras. Jame nurodomas kartų skaičius (atėmus 1), kai PCLK turi cikluoti prieš padidindamas PWM laikmačio skaitiklį (jis iš tikrųjų turi didžiausią išankstinio skaičiaus skaitiklio vertę).
2. PWMPC: „ PWM Prescaler Counter“
Naudojimas: tai 32 bitų registras . Joje yra didėjanti skaitiklio vertė. Kai ši vertė lygi PR vertei plius 1, PWM laikmačio skaitiklis (TC) didinamas.
3. PWMTCR: PWM laikmačio valdymo registras
Naudojimas: jame yra „Counter Enable“, „Counter Reset“ ir „PWM Enable“ valdymo bitai. Tai yra 8 bitų registras.
7: 4 |
3 |
2 |
1 |
0 |
REZERVUOTA |
PWM ĮJUNGTI |
REZERVUOTA |
SĄSKAITOS RESET |
ĮJUNGTI Skaitiklį |
- PWM įgalinimas: (3 bitas)
0- PWM išjungta
1- PWM įjungta
- Skaitiklio įgalinimas: (Bit-0)
0- Išjungti skaitiklius
1- Įjungti skaitiklį
- Skaitiklio atstatymas: (1 bitas)
0 - nieko nedaryti.
1 - PWMTC ir PWMPC atstatomas teigiamame PCLK krašte.
4. PWMTC: PWM laikmačio skaitiklis
Naudojimas: tai 32 bitų registras. Joje yra dabartinė didėjančio PWM laikmačio vertė. Kai Prescaler Counter (PC) pasiekia Prescaler Register (PR) reikšmę plius 1, šis skaitiklis yra padidinamas.
5. PWMIR: PWM pertraukimo registras
Naudojimas: tai 16 bitų registras. Jame yra PWM rungtynių kanalų 0–6 pertraukimo žymos. Nutraukimo vėliava nustatoma, kai įvyksta to kanalo pertrauka (MRx pertraukimas), kur X yra kanalo numeris (nuo 0 iki 6).
6. PWMMR0-PWMMR6: PWM atitikmenų registras
Naudojimas: tai 32 bitų registras . Tiesą sakant, „Match Channel“ grupė leidžia nustatyti 6 vieno krašto valdomus arba 3 dvigubais kraštais valdomus PWM išėjimus. Galite modifikuoti septynis atitikties kanalus, kad sukonfigūruotumėte šias PWM išvestis, kad jos atitiktų jūsų reikalavimus PWMPCR.
7. PWMMCR: „PWM Match Control Register“
Naudojimas: tai 32 bitų registras. Jame yra pertraukimo, atstatymo ir sustabdymo bitai, kurie valdo pasirinktą „Match Channel“. Atitinka PWM atitikties registrai ir PWM laikmačio skaitikliai.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
REZERVUOTA |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Čia x yra nuo 0 iki 6
- PWMMRxI („Bit-0“)
Įjungti arba išjungti PWM pertraukia
0- Išjungti „PWM Match“ pertraukimus.
1- Įgalinti „PWM Match“ pertraukimą.
- PWMMRxR: (1 bitas)
RESET PWMTC - laikmačio skaitiklio vertė, kai ji atitinka PWMRx
0- Nieko nedaryk.
1 - atstato PWMTC.
- PWMMRxS: (2 bitai)
SUSTABDYKITE PWMTC ir PWMPC, kai PWMTC pasiekia atitikties registro vertę
0- Išjunkite PWM sustabdymo funkciją.
1- Įjunkite „PWM Stop“ funkciją.
8. PWMPCR: PWM valdymo registras
Naudojimas: tai 16 bitų registras. Jame yra bitai, įgalinantys PWM išėjimus 0–6 ir kiekvienam išėjimui pasirinkti vieno krašto arba dvigubo krašto valdymą.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
NENaudojama |
PWMENA6-PWMENA1 |
NENaudojama |
PWMSEL6-PWMSEL2 |
NENaudojama |
- PWMSELx (x: nuo 2 iki 6)
- „One Edge“ režimas, skirtas „PWMx“
- 1 - „Double Edge“ režimas „PWMx“.
- „PWMENAx“ (x: nuo 1 iki 6)
- PWMx išjungti.
- 1- PWMx įjungta.
9. PWMLER: „ PWM Latch Enable Register“
Naudojimas: tai yra 8 bitų registras. Jame yra „Match x Latch“ bitai kiekvienam „Match Channel“.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
NENaudojama |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: nuo 0 iki 6):
0- Išjungti
naujų atitikties verčių įkėlimą
Dabar galite pradėti kurti aparatūros sąranką, kad pademonstruotumėte pulso pločio moduliaciją ARM mikrovaldiklyje.
Būtini komponentai
Aparatinė įranga
- ARM7-LPC2148 mikrovaldiklis
- 3,3 V įtampos reguliatoriaus IC
- 10k potenciometras
- LED (bet kokios spalvos)
- LCD (16x2) ekrano modulis
- Bandomoji Lenta
- Laidų sujungimas
Programinė įranga
- „Keil uVision“
- „Flash Magic“ įrankis
Grandinės schema ir jungtys
Ryšiai tarp LCD ir ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS („Register Select“) |
P0.6 |
E (įjungti) |
P0.12 |
D4 (4 duomenų kaištis) |
P0.13 |
D5 (5 duomenų kaištis) |
P0.14 |
D6 (6 duomenų kaištis) |
P0.15 |
D7 (7 duomenų kaištis) |
BND |
VSS, R / W, K |
+ 5 V |
VDD, A |
Ryšys tarp LED ir ARM7-LPC2148
LED ANODE yra prijungtas prie LPC2148 PWM išvesties (P0.0), o LED CATHODE kaištis yra prijungtas prie LPC2148 GND kaiščio.
Ryšys tarp ARM7-LPC2148 ir potenciometro su 3,3 V įtampos reguliatoriumi
3,3 V įtampos reguliatoriaus IC |
PIN funkcija |
ARM-7 LPC2148 kaištis |
1. Kairysis kaištis |
- Ve iš GND |
BND kaištis |
2. Centro kaištis |
Reguliuojama + 3,3 V išvestis |
Į potenciometro įvestį ir potenciometro išėjimą į LPC2148 P0.28 |
3. Dešinysis kaištis |
+ Ve nuo 5V ĮVADAS |
+ 5 V |
Reikėtų atkreipti dėmesį į tai
1. Čia naudojamas 3,3 V įtampos reguliatorius, suteikiantis analoginę įvesties vertę LPC2148 ADC kaiščiui (P0,28), ir kadangi mes naudojame 5 V galią, turime įtampą reguliuoti 3,3 V įtampos reguliatoriumi.
2. Potenciometras naudojamas įtampai keisti (nuo 0 V iki 3,3 V), kad būtų užtikrinta analoginė įvestis (ADC) į LPC2148 kontaktą P0.28.
ARM7-LPC2148 programavimas PWM
Norėdami programuoti ARM7-LPC2148, mums reikia „Keil uVision“ ir „Flash Magic“ įrankio. „ARM7 Stick“ programavimui per „micro USB“ prievadą naudojame USB kabelį. Mes rašome kodą naudodami „Keil“ ir sukuriame hex failą, tada HEX failas perduodamas į „ARM7“ lazdelę naudojant „Flash Magic“. Norėdami sužinoti daugiau apie „Keil uVision“ ir „Flash Magic“ diegimą ir kaip juos naudoti, spustelėkite nuorodą „Darbo pradžia su„ ARM7 LPC2148 “mikrovaldikliu ir užprogramuokite naudodami„ Keil uVision “.
Šiame vadovėlyje mes naudosime ADC ir PWM techniką, kad valdytume šviesos diodo ryškumą. Čia LPC2148 suteikiama analoginė įvestis (nuo 0 iki 3,3 V) per ADC įvesties kaištį P0,28, tada ši analoginė įvestis paverčiama skaitmenine verte (nuo 0 iki 1023). Tada ši reikšmė vėl paverčiama skaitmenine reikšme (0–255), nes LPC2148 PWM išvestis turi tik 8 bitų skiriamąją gebą (2 8). Šviesos diodas yra prijungtas prie PWM kaiščio P0.0, o šviesos diodo ryškumą galima valdyti naudojant potenciometrą. Norėdami sužinoti daugiau apie ADC sistemoje ARM7-LPC2148, spustelėkite nuorodą.
Veiksmai, susiję su „LPC2148“ programavimu PWM ir ADC
1 žingsnis: - Pirmas dalykas yra sukonfigūruoti PLL laikrodžio generavimui, nes jis nustato sistemos laikrodį ir periferinį LPC2148 laikrodį, kaip reikia programuotojams. Maksimalus LPC2148 laikrodžio dažnis yra 60 MHz. Šios eilutės naudojamos konfigūruoti PLL laikrodžio generavimą.
void initilizePLL (void) // Funkcija naudoti PLL laikrodžio generavimui { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; o (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
2 žingsnis: - Kitas dalykas yra pasirinkti LPC2148 PWM kaiščius ir PWM funkciją naudojant PINSEL registrą. Mes naudojame PINSEL0, nes mes naudojame P0.0 LPC2148 PWM išėjimui.
PINSEL0 = 0x00000002; // PWM išvesties kaiščio P0.0 nustatymas
3 žingsnis: - Tada turime iš naujo nustatyti laikmačius naudodami PWMTCR (laikmačio valdymo registrą).
PWMTCR = (1 << 1); // PWM laikmačio valdymo registro nustatymas kaip skaitiklio atstatymas
Tada nustatykite išankstinę vertę, kuri nulemia PWM skiriamąją gebą. Aš jį nustatau į nulį
PWMPR = 0X00; // PWM išankstinės vertės nustatymas
4 žingsnis: - Tada turime nustatyti PWMMCR (PWM atitikties valdymo registrą), nes jis nustato tokią operaciją kaip atstatymas, PWMMR0 pertraukimas.
PWMMCR = (1 << 0) - (1 << 1); // PWM atitikties valdymo registro nustatymas
5 žingsnis: - Maksimalus PWM kanalo laikotarpis nustatomas naudojant PWMMR.
PWMMR0 = PWMvalue; // PWM vertės suteikimas Didžiausia vertė
Mūsų atveju didžiausia vertė yra 255 (maksimaliam ryškumui)
6 žingsnis: - Tada mes turime nustatyti „Latch Enable“ į atitinkamus atitikties registrus, naudodami PWMLER
PWMLER = (1 << 0); // Enalbe PWM fiksatorius
(Mes naudojame PWMMR0) Taigi įjunkite atitinkamą bitą, nustatydami 1 PWMLER
7 žingsnis: - Norėdami įjungti PWM išvestį į kaištį, turime naudoti PWMTCR įgalindami PWM laikmačio skaitiklius ir PWM režimus.
PWMTCR = (1 << 0) - (1 << 3); // PWM ir PWM skaitiklio įjungimas
8 žingsnis: - Dabar mes turime gauti potenciometro reikšmes PWM darbo ciklui nustatyti iš ADC kaiščio P0.28. Taigi mes naudojame ADC modulį LPC2148 konvertuodami potenciometrų analoginę įvestį (nuo 0 iki 3,3 V) į ADC reikšmes (nuo 0 iki 1023).
Čia mes konvertuojame vertes nuo 0-1023 į 0-255, padalydami ją iš 4, nes LPC2148 PWM turi 8 bitų skiriamąją gebą (2 8).
9 žingsnis: - Norėdami pasirinkti ADC kaištį P0.28 LPC2148, mes naudojame
PINSEL1 = 0x01000000; // P0.28 nustatymas kaip ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // A / D konvertavimo laikrodžio ir PDN nustatymas
Šiose eilutėse užfiksuotas analoginis įėjimas (nuo 0 iki 3,3 V) ir paverstas skaitmenine reikšme (nuo 0 iki 1023). Tada šios skaitmeninės vertės padalijamos iš 4, kad būtų galima jas konvertuoti į (nuo 0 iki 255) ir galiausiai tiekiamos kaip PWM išvestis LPC2148 P0.0 kontakte, prie kurio prijungtas LED.
AD0CR - = (1 << 1); // ADC registro delsos laikas (10) pasirinkite AD0.1 kanalą ; AD0CR - = (1 << 24); // Pradėkite A / D konversiją, kol ((AD0DR1 & (1 << 31)) == 0); // Patikrinkite DONE bitą ADC duomenų registre adcvalue = (AD0DR1 >> 6) & 0x3ff; // Gaukite REZULTATĄ iš ADC duomenų registro dutycycle = adcvalue / 4; // formulė gauti dutycycle reikšmes nuo (0 iki 255) PWMMR1 = dutycycle; // nustatyti dutycycle reikšmę į PWM atitikmenų registrą PWMLER - = (1 << 1); // Įgalinti PWM išvestį su dutycycle verte
10 žingsnis: - Toliau tas vertes rodysime LCD (16X2) ekrano modulyje. Taigi, norėdami inicializuoti LCD ekraną, pridedame šias eilutes
Negalima LCD_INITILIZE (negaliojanti) // Funkcija norint paruošti skystųjų kristalų ekraną { IO0DIR = 0x0000FFF0; // nustato kaiščius P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 kaip OUTPUT delaytime (20); LCD_SEND (0x02); // Inicijuoti lcd 4 bitų darbo režimu LCD_SEND (0x28); // 2 eilutės (16X2) LCD_SEND (0x0C); // Rodyti žymeklį išjungus LCD_SEND (0x06); // Automatinio prieaugio žymeklis LCD_SEND (0x01); // Rodyti aiškų LCD_SEND (0x80); // Pirmos eilutės pirma pozicija }
Kai prijungėme LCD 4 bitų režimu su LPC2148, turime išsiųsti reikšmes, kurios bus rodomos kaip nibble by Nibble (Upper Nibble & Lower Nibble). Taigi naudojamos šios eilutės.
void LCD_DISPLAY (char * msg) // Funkcija išspausdinti simbolius, atsiųstus po vieną { uint8_t i = 0; o (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Siunčia viršutinį nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH spausdinti duomenis IO0CLR = 0x00000020; // RW LOW rašymo režimo atidėjimo laikas (2); IO0CLR = 0x00000040; // EN = 0, RS ir RW nepakitę (ty RS = 1, RW = 0) vėlavimo laikas (5); IO0PIN = ((IO0PIN ir 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Siunčia apatinį nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; vėlavimo laikas (2); IO0CLR = 0x00000040; vėlavimo laikas (5); i ++; } }
Norėdami rodyti tas ADC ir PWM reikšmes, mes naudojame šias eilutes funkcijoje int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Rodyti ADC vertę (nuo 0 iki 1023) LCD_SEND (0xC0); „sprintf“ („ledoutput“, „PWM OP =%. 2f“, ryškumas); LCD_DISPLAY („ledoutput“); // Rodyti dutycycle reikšmes nuo (0 iki 255)
Pilnas mokymo programos kodas ir vaizdo įrašas pateikiami žemiau.