- PWM (impulsa platuma modulācija)
- PWM tapas ARM7-LPC2148
- PWM reģistrs ARM7-LPC2148
- Nepieciešamās sastāvdaļas
- Shēmas shēma un savienojumi
- ARM7-LPC2148 programmēšana PWM
- Darbības, kas saistītas ar LPC2148 programmēšanu PWM un ADC
Kā mēs zinām, mikrokontrolleri ņem analogo ieeju no analogajiem sensoriem un izmanto ADC (Analog to Digital Converter), lai apstrādātu šos signālus. Bet ko tad, ja mikrokontrolleris vēlas radīt analogo signālu, lai kontrolētu analogās ierīces, piemēram, Servo motoru, līdzstrāvas motoru utt. Mikrokontrolleri nerada izejas spriegumu, piemēram, 1V, 5V, tā vietā analogo ierīču darbināšanai viņi izmanto tehniku, ko sauc par PWM. PWM piemērs ir mūsu klēpjdatora dzesēšanas ventilators (līdzstrāvas motors), kura ātrums jākontrolē atbilstoši temperatūrai, un tas pats tiek ieviests, mātesplatēs izmantojot Pulse Width Modulation (PWM) tehniku.
Šajā apmācībā mēs kontrolēsim LED spilgtumu, izmantojot PWM mikrokontrollerī ARM7-LPC2148.
PWM (impulsa platuma modulācija)
PWM ir labs veids, kā kontrolēt analogās ierīces, izmantojot digitālo vērtību, piemēram, kontrolējot motora ātrumu, gaismas spilgtumu utt. Lai gan PWM nenodrošina tīru analogo izeju, bet tas ģenerē pienācīgus analogos impulsus, lai kontrolētu analogās ierīces. PWM faktiski modulē taisnstūra impulsa viļņa platumu, lai iegūtu mainīgo iegūtā viļņa vidējo vērtību.
PWM darba cikls
Laika procentuālo daļu, kurā PWM signāls paliek AUGSTS (laikā), sauc par darba ciklu. Ja signāls vienmēr ir ieslēgts, tas ir 100% darba ciklā un, ja tas vienmēr ir izslēgts, tas ir 0% darba cikls.
Darba cikls = Ieslēgšanas laiks / (Ieslēgšanas laiks + Izslēgšanas laiks)
PWM tapas ARM7-LPC2148
Zemāk redzamajā attēlā ir norādītas ARM7-LPC2148 PWM izejas tapas. PWM ir kopā sešas tapas.
PWM kanāls |
LPC2148 Ostas tapas |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
PWM reģistrs ARM7-LPC2148
Pirms iekļaušanās mūsu projektā mums jāzina par PWM reģistriem LPC2148.
Šeit ir saraksts ar PWM LPC2148 izmantotajiem reģistriem
1. PWMPR: PWM Prescale reģistrs
Lietošana: tas ir 32 bitu reģistrs. Tas satur reižu skaitu (mīnus 1), pirms PWM taimera skaitītāja palielināšanas PCLK ir jāveic cikls (tam faktiski ir maksimālā pirmsskalas skaitītāja vērtība).
2. PWMPC: PWM Prescaler skaitītājs
Lietošana: Tas ir 32 bitu reģistrs . Tas satur pieaugošo skaitītāja vērtību. Kad šī vērtība ir vienāda ar PR vērtību plus 1, tiek palielināts PWM taimera skaitītājs (TC).
3. PWMTCR: PWM taimera vadības reģistrs
Lietošana: Tas satur Counter Enable, Counter Reset un PWM Enable vadības bitus. Tas ir 8 bitu reģistrs.
7: 4 |
3 |
2 |
1 |
0 |
REZERVĒTS |
PWM ENABLE |
REZERVĒTS |
Skaitītāja atiestatīšana |
PĀRDEVĒJS IESPĒJ |
- PWM iespējošana: (Bit-3)
0- PWM atspējots
1- PWM iespējots
- Skaitītāja iespējošana: (Bit-0)
0- Atspējot skaitītājus
1- Iespējot skaitītāju
- Skaitītāja atiestatīšana: (1. bits)
0 - nedarīt neko.
1 - atiestata PWMTC un PWMPC uz pozitīvās PCLK malas.
4. PWMTC: PWM taimera skaitītājs
Lietošana: tas ir 32 bitu reģistrs. Tas satur pieaugošā PWM taimera pašreizējo vērtību. Kad Prescaler Counter (PC) sasniedz Prescaler Register (PR) vērtību plus 1, šis skaitītājs tiek palielināts.
5. PWMIR: PWM pārtraukumu reģistrs
Lietošana: tas ir 16 bitu reģistrs. Tas satur pārtraukuma karodziņus PWM spēles kanāliem 0-6. Pārtraukuma karodziņš tiek iestatīts, kad šim kanālam rodas pārtraukums (MRx Interrupt), kur X ir kanāla numurs (0 līdz 6).
6. PWMMR0-PWMMR6: PWM spēļu reģistrs
Lietošana: tas ir 32 bitu reģistrs . Faktiski Match Channel grupa ļauj iestatīt 6 PWM izejas ar vienu malu vai 3 ar divām malām. Jūs varat modificēt septiņus spēles kanālus, lai konfigurētu šīs PWM izejas atbilstoši jūsu prasībām PWMPCR.
7. PWMMCR: PWM atbilstības kontroles reģistrs
Lietošana: tas ir 32 bitu reģistrs. Tajā ir biti Interrupt, Reset un Stop, kas kontrolē izvēlēto spēles kanālu. Notiek atbilstība starp PWM spēļu reģistriem un PWM taimera skaitītājiem.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
REZERVĒTS |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Šeit x ir no 0 līdz 6
- PWMMRxI (Bit-0)
IESPĒJOT VAI atspējot PWM pārtrauc
0- Atspējot PWM spēles pārtraukumus.
1- Iespējot PWM spēles pārtraukumu.
- PWMMRxR: (Bit-1)
ATIESTATĪT PWMTC - Taimera skaitītāja vērtība ikreiz, kad tā atbilst PWMRx
0- Neko nedarīt.
1 - atiestata PWMTC.
- PWMMRxS: (2. bits)
Apturiet PWMTC un PWMPC, kad PWMTC sasniedz atbilstības reģistra vērtību
0- atspējojiet PWM apturēšanas funkciju.
1 - iespējojiet funkciju PWM Stop.
8. PWMPCR: PWM vadības reģistrs
Lietošana: tas ir 16 bitu reģistrs. Tas satur bitus, kas ļauj PWM izvadēm 0-6 un katrai izejai atlasa vienas malas vai divmalu vadību.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
NELIETOTS |
PWMENA6-PWMENA1 |
NELIETOTS |
PWMSEL6-PWMSEL2 |
NELIETOTS |
- PWMSELx (x: no 2 līdz 6)
- Viena malas režīms PWMx
- 1 - Double Edge režīms PWMx.
- PWMENAx (x: no 1 līdz 6)
- PWMx Atspējot.
- 1 - PWMx iespējots.
9. PWMLER: PWM Latch Enable Register
Lietošana: tas ir 8 bitu reģistrs. Tas satur Match x Latch bitus katram spēles kanālam.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
NELIETOTS |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 līdz 6):
0 - atspējojiet jaunu atbilstības vērtību ielādi
1 - ielādējiet jaunās atbilstības vērtības no (PWMMRx) PWMMatch reģistra, kad taimeris tiek atiestatīts.
Tagad ļauj sākt veidot aparatūras iestatījumus, lai parādītu pulsa platuma modulāciju ARM mikrokontrollerī.
Nepieciešamās sastāvdaļas
Aparatūra
- ARM7-LPC2148 mikrokontrolleris
- 3.3V sprieguma regulatora IC
- 10k potenciometrs
- LED (jebkura krāsa)
- LCD (16x2) displeja modulis
- Maizes dēlis
- Vadu savienošana
Programmatūra
- Keil uVision5
- Flash burvju rīks
Shēmas shēma un savienojumi
Savienojumi starp LCD un ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Reģistrēties Atlasīt) |
P0.6 |
E (iespējot) |
P0.12 |
D4 (4. datu tapa) |
P0.13 |
D5 (5. datu tapa) |
P0.14 |
D6 (6. datu tapa) |
P0.15 |
D7 (7. datu tapa) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Savienojums starp LED un ARM7-LPC2148
Gaismas diodes ANODE ir pievienots LPC2148 PWM izejai (P0.0), savukārt LED CATHODE tapa ir savienota ar LPC2148 GND tapu.
Savienojums starp ARM7-LPC2148 un potenciometru ar 3,3 V sprieguma regulatoru
3.3V sprieguma regulatora IC |
Pin funkcija |
ARM-7 LPC2148 tapa |
1. Kreisā tapa |
- Ve no GND |
GND tapa |
2. Centra tapa |
Regulēta + 3,3 V izeja |
Potenciometra ieejai un potenciometra izejai uz LPC2148 P0.28 |
3. Labais tapa |
+ Ve no 5V IEVADE |
+ 5V |
Jāatzīmē punkti
1. Šeit tiek izmantots 3,3 V sprieguma regulators, lai nodrošinātu analogo ieejas vērtību LPC2148 ADC tapai (P0,28), un tāpēc, ka mēs izmantojam 5 V jaudu, mums jāregulē spriegums ar 3,3 V sprieguma regulatoru.
2. Potenciometru izmanto, lai mainītu spriegumu starp (0–3,3 V), lai nodrošinātu analogo ieeju (ADC) uz LPC2148 kontaktu P0.28.
ARM7-LPC2148 programmēšana PWM
Lai ieprogrammētu ARM7-LPC2148, mums ir nepieciešams Keil uVision un Flash Magic rīks. Mēs izmantojam USB kabeli, lai programmētu ARM7 Stick, izmantojot mikro USB portu. Mēs rakstām kodu, izmantojot Keil, un izveidojam hex failu, un pēc tam HEX fails tiek flashed uz ARM7 stick, izmantojot Flash Magic. Lai uzzinātu vairāk par keil uVision un Flash Magic instalēšanu un to izmantošanu, sekojiet saitei Darba sākšana ar ARM7 LPC2148 mikrokontrolleru un ieprogrammējiet to, izmantojot Keil uVision.
Šajā apmācībā mēs izmantosim ADC un PWM tehniku, lai kontrolētu LED spilgtumu. Šeit LPC2148 tiek piešķirta analogā ieeja (no 0 līdz 3,3 V) caur ADC ieejas tapu P0,28, pēc tam šī analogā ieeja tiek pārveidota par digitālo vērtību (no 0 līdz 1023). Tad šī vērtība atkal tiek pārvērsta ciparu vērtībā (0 - 255), jo LPC2148 PWM izejai ir tikai 8 bitu izšķirtspēja (2 8). LED ir pievienots PWM tapai P0.0, un LED spilgtumu var kontrolēt, izmantojot potenciometru. Lai uzzinātu vairāk par ADC ARM7-LPC2148, sekojiet saitei.
Darbības, kas saistītas ar LPC2148 programmēšanu PWM un ADC
1. solis: - Pats pirmais ir konfigurēt PLL pulksteņa ģenerēšanai, jo tas nosaka sistēmas pulksteni un LPC2148 perifēro pulksteni, kā nepieciešams programmētājiem. Maksimālā pulksteņa frekvence LPC2148 ir 60 MHz. Lai konfigurētu PLL pulksteņa ģenerēšanu, tiek izmantotas šādas rindas.
void initilizePLL (void) // Funkcija, lai PLL izmantotu pulksteņa ģenerēšanai { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; kamēr (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
2. solis: - Nākamā lieta ir izvēlēties LPC2148 PWM tapas un PWM funkciju, izmantojot PINSEL reģistru. Mēs izmantojam PINSEL0, tāpat kā P0.0, lai LPC2148 izvadītu PWM.
PINSEL0 = 0x00000002; // PWM izejas P0.0 tapas iestatīšana
3. solis: - Tālāk mums ir jāatjauno taimeri, izmantojot PWMTCR (taimera vadības reģistru).
PWMTCR = (1 << 1); // PWM taimera vadības reģistra iestatīšana kā skaitītāja atiestatīšana
Pēc tam iestatiet pirmsskolas vērtību, kas izlemj PWM izšķirtspēju. Es to iestatu uz nulli
PWMPR = 0X00; // PWM pirmsskolas vērtības iestatīšana
4. solis: - Tālāk mums jāiestata PWMMCR (PWM spēles kontroles reģistrs), jo tas nosaka darbību, piemēram, atiestatīšanu, PWMMR0 pārtraukumus.
PWMMCR = (1 << 0) - (1 << 1); // PWM atbilstības kontroles reģistra iestatīšana
5. solis: - PWM kanāla maksimālais periods tiek iestatīts, izmantojot PWMMR.
PWMMR0 = PWMvalue; // PWM vērtības piešķiršana Maksimālā vērtība
Mūsu gadījumā maksimālā vērtība ir 255 (maksimālam spilgtumam)
6. solis: - Pēc tam, izmantojot PWMLER, mums jāiestata fiksatora iespējošana attiecīgajiem atbilstības reģistriem
PWMLER = (1 << 0); // Enalbe PWM fiksators
(Mēs izmantojam PWMMR0) Tātad iespējojiet atbilstošo bitu, PWMLER iestatot 1
7. solis: - Lai iespējotu PWM izvadi uz tapu, mums ir jāizmanto PWMTCR, lai iespējotu PWM taimera skaitītājus un PWM režīmus.
PWMTCR = (1 << 0) - (1 << 3); // PWM un PWM skaitītāja iespējošana
8. solis: - Tagad mums ir jāiegūst potenciometra vērtības PWM darba cikla iestatīšanai no ADC tapas P0.28. Tāpēc mēs izmantojam ADC moduli LPC2148, lai potenciometru analogo ieeju (no 0 līdz 3,3 V) pārveidotu par ADC vērtībām (no 0 līdz 1023).
Šeit mēs konvertējam vērtības no 0-1023 uz 0-255, dalot to ar 4, jo LPC2148 PWM ir 8 bitu izšķirtspēja (2 8).
9. solis: - lai atlasītu ADC tapu P0.28 LPC2148, mēs izmantojam
PINSEL1 = 0x01000000; // P0.28 iestatīšana kā ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Pulksteņa un PDN iestatīšana A / D pārveidošanai
Šīs rindas uztver analogo ieeju (no 0 līdz 3,3 V) un pārveido to ciparu vērtībā (no 0 līdz 1023). Un pēc tam šīs digitālās vērtības tiek sadalītas ar 4, lai tās pārveidotu par (0 līdz 255), un galu galā tiek barotas kā PWM izeja LPC2148 P0.0 tapā, uz kuras ir pievienota LED.
AD0CR - = (1 << 1); // ADC reģistra aizkave (10) atlasiet AD0.1 kanālu ; AD0CR - = (1 << 24); // Sāciet A / D pārveidošanu, kamēr ((AD0DR1 & (1 << 31)) == 0); // Pārbaudiet DONE bitu ADC datu reģistrā adcvalue = (AD0DR1 >> 6) & 0x3ff; // Iegūt REZULTĀTU no ADC datu reģistra dutycycle = adcvalue / 4; // formula, lai iegūtu dutycycle vērtības no (0 līdz 255) PWMMR1 = dutycycle; // iestatiet dutycycle vērtību uz PWM atbilstības reģistru PWMLER - = (1 << 1); // Iespējot PWM izvadi ar dutycycle vērtību
10. solis: - Tālāk šīs vērtības tiek parādītas LCD (16X2) displeja modulī. Tātad, lai inicializētu LCD displeja moduli, mēs pievienojam šādas rindas
Liekas par LCD_INITILIZE (anulēts) // Funkcija, lai sagatavotos LCD { IO0DIR = 0x0000FFF0; // iestata tapu P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 kā OUTPUT aiztures laiku (20); LCD_SEND (0x02); // Inicializēt LCD 4 bitu darbības režīmā LCD_SEND (0x28); // 2 rindas (16X2) LCD_SEND (0x0C); // Rādīt kursorā ārpus LCD_SEND (0x06); // Automātiskā pieauguma kursors LCD_SEND (0x01); // Parādīt skaidru LCD_SEND (0x80); // Pirmās rindas pirmā pozīcija }
Kad mēs savienojām LCD 4 bitu režīmā ar LPC2148, mums ir jānosūta vērtības, kas tiek parādītas kā nibble by nibble (Augšējā Nibble un Lower Nibble). Tātad tiek izmantotas šādas rindas.
void LCD_DISPLAY (char * msg) // Funkcija, lai drukātu pa vienam sūtītās rakstzīmes { uint8_t i = 0; kamēr (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Nosūta augšējo nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH, lai drukātu datus IO0CLR = 0x00000020; // RW LOW rakstīšanas režīma aizkaves laiks (2); IO0CLR = 0x00000040; // EN = 0, RS un RW nemainās (ti, RS = 1, RW = 0) kavēšanās laiks (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Nosūta apakšējo nibble IO0SET = 0x00000050; // RS & EN AUGSTS IO0CLR = 0x00000020; kavēšanās laiks (2); IO0CLR = 0x00000040; kavēšanās laiks (5); i ++; } }
Lai parādītu šīs ADC un PWM vērtības, mēs int main () funkcijā izmantojam šādas rindas.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Parādīt ADC vērtību (no 0 līdz 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", spilgtums); LCD_DISPLAY (ledoutput); // Parādīt dutycycle vērtības no (0 līdz 255)
Pilns apmācības kods un video apraksts ir sniegts zemāk.