- PWM (pulssinleveyden modulointi)
- PWM-nastat ARM7-LPC2148: ssa
- PWM-rekisterit ARM7-LPC2148: ssa
- Tarvittavat komponentit
- Piirikaavio ja liitännät
- ARM7-LPC2148: n ohjelmointi PWM: lle
- Vaiheet, jotka liittyvät LPC2148: n ohjelmointiin PWM: lle ja ADC: lle
Kuten tiedämme, mikrokontrollerit ottavat analogisen tulon analogisista antureista ja käyttävät ADC: tä (analoginen digitaalimuunnin) näiden signaalien käsittelemiseen. Mutta entä jos mikro-ohjain haluaa tuottaa analogisen signaalin analogiakäyttöisten laitteiden, kuten servomoottorin, tasavirtamoottorin jne., Ohjaamiseksi? Mikrokontrollerit eivät tuota lähtöjännitettä, kuten 1 V, 5 V, vaan ne käyttävät PWM-tekniikkaa analogisten laitteiden käyttämiseen. Esimerkki PWM: stä on kannettavan tietokoneen jäähdytyspuhallin (DC-moottori), jota on säädettävä nopeudella lämpötilan mukaan, ja sama toteutetaan käyttämällä PWM (Pulse Width Modulation) -tekniikkaa emolevyissä.
Tässä opetusohjelmassa ohjaamme LED-valon kirkkautta PWM: n avulla ARM7-LPC2148-mikrokontrollerissa.
PWM (pulssinleveyden modulointi)
PWM on hyvä tapa ohjata analogisia laitteita digitaalisella arvolla, kuten moottorin nopeuden, ledin kirkkauden jne. Säätäminen. Vaikka PWM ei tarjoa puhdasta analogista lähtöä, mutta se tuottaa kunnollisia analogisia pulsseja analogisten laitteiden ohjaamiseksi. PWM todella moduloi suorakulmaisen pulssi-aallon leveyden saadakseen vaihtelun tuloksena olevan aallon keskiarvossa.
PWM: n toimintajakso
Prosenttiaikaa, jonka aikana PWM-signaali pysyy KORKEAna (ajallaan), kutsutaan työjaksoksi. Jos signaali on aina päällä, se on 100%: n käyttöjaksossa ja jos se on aina pois päältä, se on 0%: n käyttöjakso.
Käyttösykli = Kytke päälle aika / (Kytke päälle aika + Sammuta aika)
PWM-nastat ARM7-LPC2148: ssa
Alla oleva kuva osoittaa ARM7-LPC2148: n PWM-ulostulotapit. PWM: lle on kaikkiaan kuusi nastaa.
PWM-kanava |
LPC2148-portin nastat |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
PWM-rekisterit ARM7-LPC2148: ssa
Ennen projektiin pääsemistä meidän on tiedettävä LPC2148: n PWM-rekistereistä.
Tässä on luettelo LPW2148: ssa PWM: lle käytetyistä rekistereistä
1. PWMPR: PWM Prescale Register
Käyttö: Se on 32-bittinen rekisteri. Se sisältää monta kertaa (miinus 1), jonka PCLK: n on suoritettava jakso ennen PWM-ajastinlaskurin lisäämistä (Se pitää itse asiassa esiasteikon laskurin maksimiarvon).
2. PWMPC: PWM- esiliuskalaskuri
Käyttö: Se on 32-bittinen rekisteri . Se sisältää kasvavan laskurin arvon. Kun tämä arvo on yhtä suuri kuin PR-arvo plus 1, PWM-ajastinlaskuria (TC) lisätään.
3. PWMTCR: PWM- ajastinrekisteri
Käyttö: Se sisältää Counter Enable-, Counter Reset- ja PWM Enable -ohjausbitit. Se on 8-bittinen rekisteri.
7: 4 |
3 |
2 |
1 |
0 |
VARATTU |
PWM PÄÄLLÄ |
VARATTU |
LASKURIN NOLLAUS |
LASKURI KÄYTÖSSÄ |
- PWM Enable: (Bit-3)
0-
PWM ei käytössä 1- PWM käytössä
- Laskurin käyttöönotto: (Bit-0)
0 - Poista laskurit käytöstä
1 - Ota laskuri käyttöön
- Laskurin nollaus: (Bit-1)
0- Älä tee mitään.
1 - Palauttaa PWMTC ja PWMPC PCLK: n positiiviselle reunalle.
4. PWMTC: PWM-ajastimen laskuri
Käyttö: Se on 32-bittinen rekisteri. Se sisältää kasvavan PWM-ajastimen nykyisen arvon. Kun esivalmistelaskuri (PC) saavuttaa esivalmistelurekisterin (PR) arvon plus 1, laskuria lisätään.
5. PWMIR: PWM-keskeytysrekisteri
Käyttö: Se on 16-bittinen rekisteri. Se sisältää keskeytysliput PWM-ottelukanaville 0-6. Keskeytyslippu asetetaan, kun keskeytys tapahtuu tälle kanavalle (MRx-keskeytys), jossa X on kanavan numero (0-6).
6. PWMMR0-PWMMR6: PWM -ottelurekisteri
Käyttö: Se on 32-bittinen rekisteri . Oikeastaan Match Channel -ryhmä sallii 6 yhden reunaohjatun tai 3 kaksireunaohjattua PWM-lähtöä. Voit muokata seitsemää vastaavaa kanavaa konfiguroidaksesi nämä PWM-lähdöt vastaamaan PWMPCR-vaatimuksiasi.
7. PWMMCR: PWM Match Control Register
Käyttö: Se on 32-bittinen rekisteri. Se sisältää keskeytys-, nollaus- ja pysäytysbitit, jotka ohjaavat valittua ottelukanavaa. PWM-ottelurekisterien ja PWM-ajastinlaskurien välillä tapahtuu ottelu.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
VARATTU |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Tässä x on 0-6
- PWMMRxI (bitti-0)
KÄYTÖSSÄ TAI PÄÄLLÄ PWM-keskeytys
0- Poista PWM-ottelun keskeytykset käytöstä.
1- Ota PWM-ottelun keskeytys käyttöön.
- PWMMRxR: (bitti-1)
PALAUTA PWMTC - Ajastimen laskurin arvo aina, kun se vastaa PWMRx
0- Älä tee mitään.
1 - Palauttaa PWMTC: n.
- PWMMRxS: (bitti 2)
PYSÄYTÄ PWMTC & PWMPC, kun PWMTC saavuttaa Ottelurekisterin arvon
0- Poista PWM-pysäytystoiminto käytöstä.
1- Ota PWM Stop -ominaisuus käyttöön.
8. PWMPCR: PWM-ohjausrekisteri
Käyttö: Se on 16-bittinen rekisteri. Se sisältää bitit, jotka mahdollistavat PWM-lähdöt 0-6 ja valitsevat yhden tai kahden reunan ohjauksen jokaiselle lähdölle.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
KÄYTTÖÖN |
PWMENA6-PWMENA1 |
KÄYTTÖÖN |
PWMSEL6-PWMSEL2 |
KÄYTTÖÖN |
- PWMSELx (x: 2-6)
- Single Edge -tila PWMx: lle
- 1- Double Edge -tila PWMx: lle.
- PWMENAx (x: 1-6)
- PWMx Poista käytöstä.
- 1- PWMx käytössä.
9. PWMLER: PWM Latch Enable Register
Käyttö: Se on 8-bittinen rekisteri. Se sisältää Match x Latch -bitit jokaiselle ottelukanavalle.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
KÄYTTÖÖN |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 - 6):
0 - Poista uusien
otteluarvojen lataaminen käytöstä 1 - Lataa uudet vastaavuusarvot (PWMMRx) PWMMatch -rekisteristä, kun ajastin nollataan.
Aloitetaan nyt laitteistokokoonpanon rakentaminen osoittamaan pulssinleveyden modulaatio ARM-mikrokontrollerissa.
Tarvittavat komponentit
Laitteisto
- ARM7-LPC2148-mikrokontrolleri
- 3,3 V: n jännitesäätimen IC
- 10k potentiometri
- LED (mikä tahansa väri)
- LCD (16x2) -näyttömoduuli
- Leipälauta
- Johtojen liittäminen
Ohjelmisto
- Keil uVision 5
- Flash Magic -työkalu
Piirikaavio ja liitännät
LCD- ja ARM7-LPC2148-liitännät
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Rekisteröi valinta) |
P0.6 |
E (Ota käyttöön) |
P0.12 |
D4 (tietotappi 4) |
P0.13 |
D5 (tietotappi 5) |
P0.14 |
D6 (tietotappi 6) |
P0.15 |
D7 (tietotappi 7) |
GND |
VSS, R / W, K |
+ 5 V |
VDD, A |
Liitäntä LEDin ja ARM7-LPC2148: n välillä
LEDien ANODE on kytketty LPC2148: n PWM-lähtöön (P0.0), kun taas LED: n CATHODE-tappi on kytketty LPC2148: n GND-nastaan.
Liitäntä ARM7-LPC2148: n ja 3,3 V: n jännitesäätimellä varustetun potentiometrin välillä
3,3 V: n jännitesäätimen IC |
Pin-toiminto |
ARM-7 LPC2148-tappi |
1. vasen tappi |
- Ve GND: stä |
GND-tappi |
2. keskuksen tappi |
Säädetty + 3,3 V: n lähtö |
Potentiometrin tuloon ja potentiometrin ulostuloon LPC2148: n P0.28: een |
3.Oikea tappi |
+ Ve 5 V: stä TULO |
+ 5 V |
Huomattavat seikat
1. Tässä käytetään 3,3 V: n jännitesäädintä analogisen tuloarvon tuottamiseksi LPC2148: n ADC-nastalle (P0,28), ja koska käytämme 5 V: n tehoa, meidän on säädettävä jännitettä 3,3 V: n jännitesäätimellä.
2. Potentiometriä käytetään vaihtamaan jännitettä (0 V - 3,3 V) analogisen tulon (ADC) tuottamiseksi LPC2148-nastalle P0,28.
ARM7-LPC2148: n ohjelmointi PWM: lle
ARM7-LPC2148: n ohjelmointiin tarvitaan keil uVision & Flash Magic -työkalu. Ohjelmoimme ARM7 Stick USB-kaapelilla mikro-USB-portin kautta. Kirjoitamme koodin Keilillä ja luomme heksatiedoston ja sitten HEX-tiedosto välitetään ARM7-tikkuun Flash Magicilla. Jos haluat tietää enemmän Keil uVisionin ja Flash Magicin asentamisesta ja niiden käytöstä, seuraa linkkiä Aloittaminen ARM7 LPC2148 -mikrokontrollerilla ja ohjelmoi se Keil uVisionin avulla.
Tässä opetusohjelmassa käytämme ADC- ja PWM-tekniikkaa LED-valon kirkkauden säätämiseen. Tässä LPC2148: lle annetaan analoginen tulo (0-3,3 V) ADC-tulotapin P0.28 kautta, sitten tämä analoginen tulo muunnetaan digitaaliseksi arvoksi (0-1023). Sitten tämä arvo on jälleen muunnetaan digitaaliseksi arvoksi (0-255) PWM-lähtö LPC2148 on vain 8-bitin resoluutio (2 8). LED kytketään PWM-nastaan P0.0 ja ledin kirkkautta voidaan säätää potentiometrillä. Saat lisätietoja ADC: stä ARM7-LPC2148: ssa seuraamalla linkkiä.
Vaiheet, jotka liittyvät LPC2148: n ohjelmointiin PWM: lle ja ADC: lle
Vaihe 1: - Aivan ensimmäinen asia on määrittää PLL kellonmuodostusta varten, koska se asettaa LPC2148: n järjestelmän kellon ja oheiskellon ohjelmoijien tarpeiden mukaan. LPC2148: n suurin kellotaajuus on 60 MHz. Seuraavia rivejä käytetään PLL-kellon muodostamisen määrittämiseen.
void initilizePLL (void) // Funktio käyttää PLL: tä kellon muodostamiseen { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; kun (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Vaihe 2: - Seuraava asia on valita LPC2148: n PWM-nastat ja PWM-toiminto PINSEL-rekisterin avulla. Käytämme PINSEL0: ta, kun käytämme P0.0: ta LPC2148: n PWM-ulostuloon.
PINSEL0 = 0x00000002; // Asettaa nasta P0.0 PWM-lähdölle
Vaihe 3: - Seuraavaksi meidän on palautettava ajastimet PWMTCR (Timer Control Register) -toiminnolla.
PWMTCR = (1 <1); // PWM-ajastinrekisterin asettaminen laskurin kuittaukseksi
Aseta sitten esiasteikon arvo, joka päättää PWM: n resoluution. Asetan sen nollaksi
PWMPR = 0X00; // PWM-esiasetusarvon asettaminen
Vaihe 4: - Seuraavaksi meidän on asetettava PWMMCR (PWM match control register), koska se asettaa toiminnan, kuten nollaus, keskeytykset PWMMR0: lle.
PWMMCR = (1 << 0) - (1 << 1); // PWM Match Control -rekisterin asettaminen
Vaihe 5: - PWM-kanavan enimmäisjakso asetetaan PWMMR: llä.
PWMMR0 = PWM-arvo; // Annetaan PWM-arvo Suurin arvo
Meidän tapauksessamme enimmäisarvo on 255 (maksimaalisen kirkkauden saavuttamiseksi)
Vaihe 6: - Seuraavaksi meidän on asetettava Latch Enable vastaaviin ottorekistereihin PWMLER: n avulla
PWMLER = (1 << 0); // Enalbe PWM-salpa
(Käytämme PWMMR0) Ota siis vastaava bitti käyttöön asettamalla PWMLER: ssä 1
Vaihe 7: - PWM-lähdön ottamiseksi käyttöön nastassa meidän on käytettävä PWMTCR: tä PWM-ajastinlaskurien ja PWM-tilojen käyttöönottoon.
PWMTCR = (1 << 0) - (1 << 3); // PWM- ja PWM-laskurin käyttöönotto
Vaihe 8: - Nyt meidän on haettava potentiometriarvot PWM: n käyttöjakson asettamiseksi ADC-nastasta P0.28. Joten käytämme ADC-moduulia LPC2148: ssa muuntamaan potentiometrien analogiatulo (0-3,3 V) ADC-arvoiksi (0-1023).
Tässä on muuntaa arvot 0-1023 ja 0-255 jakamalla se 4 PWM on LPC2148 on 8-bittinen resoluutio (2 8).
Vaihe 9: - Sillä valitaan ADC pin P0.28 vuonna LPC2148, käytämme
PINSEL1 = 0x01000000; // P0.28: n asettaminen ADC INPUT: ksi AD0CR = (((14) << 8) - (1 << 21)); // Kellon ja PDN: n asettaminen A / D-muunnokselle
Seuraavat rivit kaappaavat analogisen tulon (0-3,3 V) ja muuntavat sen digitaaliseksi arvoksi (0-1023). Ja sitten nämä digitaaliset arvot jaetaan neljällä niiden muuntamiseksi (0 - 255) ja lopuksi syötetään PWM-ulostulona LPC2148: n P0.0-nastassa, johon LED on kytketty.
AD0CR - = (1 <1); // Valitse AD0.1-kanava ADC-rekisterin viiveestä (10); AD0CR - = (1 <24); // Aloita A / D-muunnos, kun ((AD0DR1 & (1 << 31)) == 0); // Tarkista DONE-bitti ADC-tietorekisterissä adcvalue = (AD0DR1 >> 6) & 0x3ff; // Hanki TULOS ADC-rekisteristä dutycycle = adcvalue / 4; // kaava dutycycle-arvojen saamiseksi välillä (0 - 255) PWMMR1 = dutycycle; // aseta dutycycle-arvoksi PWM- ottorekisteri PWMLER - = (1 << 1); // Ota PWM-lähtö käyttöön dutycycle-arvolla
Vaihe 10: - Seuraavaksi näytämme nämä arvot LCD (16X2) -näyttömoduulissa. Joten lisäämme seuraavat rivit alustamaan LCD-näyttömoduulin
Void LCD_INITILIZE (void) // Toiminto LCD-näytön valmistelemiseksi { IO0DIR = 0x0000FFF0; // asettaa nastat P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 OUTPUT- viiveajaksi (20); LCD_SEND (0x02); // Alusta LCD 4-bittisessä toimintatilassa LCD_SEND (0x28); // 2 riviä (16X2) LCD_SEND (0x0C); // Näyttö kohdistimen kohdalla pois päältä LCD_SEND (0x06); // Automaattinen lisäyskohdistin LCD_SEND (0x01); // Näytä selkeä LCD_SEND (0x80); // Ensimmäisen rivin ensimmäinen sijainti }
Kun yhdistimme LCD-näytön 4-bittisessä tilassa LPC2148: n kanssa, meidän on lähetettävä arvot, jotka näytetään naposteltuna napauttamalla (ylempi napautus ja alempi napostelu). Joten käytetään seuraavia rivejä.
void LCD_DISPLAY (char * msg) // Toiminto yksitellen lähetettyjen merkkien tulostamiseen { uint8_t i = 0; kun (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Lähettää ylemmän näytteen IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH tulostamaan tietoja IO0CLR = 0x00000020; // RW LOW Kirjoitustilan viive (2); IO0CLR = 0x00000040; // EN = 0, RS ja RW muuttumattomina (ts. RS = 1, RW = 0) viive (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((viesti & 0x0F) << 12)); // Lähettää alemman naposteltavan IO0SET = 0x00000050; // RS & EN KORKEA IO0CLR = 0x00000020; viive (2); IO0CLR = 0x00000040; viive (5); i ++; } }
Näiden ADC- ja PWM-arvojen näyttämiseksi käytämme seuraavia rivejä int main () -toiminnossa.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Näytä ADC-arvo (0-1023) LCD_SEND (0xC0); sprintf (led-lähtö, "PWM OP =%. 2f", kirkkaus); LCD_DISPLAY (ledoutput); // Näytä dutycycle-arvot välillä (0 - 255)
Opetusohjelman täydellinen koodi ja videokuvaus on annettu alla.