- Servo moottori
- Servomoottorin ohjaaminen LPC2148 PWM: n ja ADC: n avulla
- ARW7-LPC2148: n PWM- ja ADC-nastat
- Tarvittavat komponentit
- Piirikaavio ja liitännät
- ARM7-LPC2148: n ohjelmointi servomoottorin ohjausta varten
Edellisessä opetusohjelmassa olemme liittäneet askelmoottorin ARM7-LPC2148: n kanssa. Tässä opetusohjelmassa ohjaamme servomoottoria ARM7-LPC2148: lla. Servomoottorilla on pieni virrankulutuksen etu askelmoottoriin verrattuna. Servomoottori lopettaa virrankulutuksensa, kun haluttu asento saavutetaan, mutta askelmoottori kuluttaa jatkuvasti voimaa lukitakseen akselin haluttuun asentoon. Servomoottoreita käytetään enimmäkseen robotiikkaprojekteissa niiden tarkkuuden ja helpon käsittelyn vuoksi.
Tässä opetusohjelmassa opitaan Servomoottorista ja kuinka Servoa voidaan liittää ARM7-LPC2148: n kanssa. Potentiometri on myös liitetty servomoottorin akselin sijainnin vaihtamiseen, ja LCD näyttää kulma-arvon.
Servo moottori
Servomoottori on yhdistelmä tasavirtamoottoria, asennonohjausjärjestelmää ja vaihteita. Servomoottorin pyörimistä ohjataan kohdistamalla siihen PWM-signaali, PWM-signaalin leveys määrää moottorin pyörimiskulman ja suunnan. Täällä käytämme SG90-servomoottoria tässä opetusohjelmassa, se on yksi suosituimmista ja halvimmista. SG90 on 180 asteen servo. Joten tällä servolla voimme sijoittaa akselin 0-180 astetta:
- Käyttöjännite: + 5V
- Vaihteiston tyyppi: Muovi
- Kiertokulma: 0-180 astetta
- Paino: 9gm
- Vääntömomentti: 2,5 kg / cm
Ennen kuin voimme aloittaa servomoottorin ohjelmoinnin, meidän on tiedettävä, minkä tyyppinen signaali lähetetään servomoottorin ohjaamiseksi. Meidän tulisi ohjelmoida MCU lähettämään PWM-signaaleja servomoottorin signaalijohtoon. Servomoottorin sisällä on ohjauspiiri, joka lukee PWM-signaalin toimintajakson ja sijoittaa servomoottorin akselin vastaavaan paikkaan alla olevan kuvan mukaisesti
Servomoottori tarkistaa pulssin 20 millisekunnin välein. Säädä siis signaalin pulssin leveyttä moottorin akselin pyörittämiseksi.
- 1 ms: n (1 millisekunnin) pulssin leveys servon kiertämiseksi 0 asteeseen
- 1,5 ms pulssinleveys 90 asteen kiertämiseen (neutraali asento)
- 2 ms pulssinleveys servon kiertämiseksi 180 asteeseen.
Ennen kuin kytket servon ARM7-LPC2148: een, voit testata servoasi tämän servomoottorin testauspiirin avulla. Tarkista myös, kuinka servomoottori voidaan liittää muihin mikro-ohjaimiin:
- Servomoottorin ohjaus Arduinolla
- Servomoottorin liitäntä 8051-mikrokontrolleriin
- Servomoottorin ohjaus MATLAB: n avulla
- Servomoottorin ohjaus Raspberry Pi: llä
- Servomoottorin ja MSP430G2: n liitäntä
- Servo-moottorin ja STM32F103C8: n liitäntä
Servomoottorin ohjaaminen LPC2148 PWM: n ja ADC: n avulla
Servomoottoria voidaan ohjata LPC2148: lla PWM: n avulla. Tarjoamalla PWM-signaalin SERVOn PWM-nastalle 20 ms jaksolla ja 50 Hz taajuudella voimme sijoittaa servomoottorin akselin noin 180 asteen (-90… + 90) suuntaan.
Potentiometriä käytetään vaihtamaan PWM-signaalin toimintajaksoa ja pyörittämään servomoottorin akselia, tämä menetelmä toteutetaan käyttämällä ADC-moduulia LPC2148: ssa. Joten tarvitsemme sekä PWM- että ADC-konseptit toteutettaviksi tässä opetusohjelmassa. Joten ystävällisesti tutustu aiempiin oppaisiimme oppiaksesi PWM: n ja ADC: n ARM7-LPC2148: ssa.
- Kuinka käyttää PWM: ää ARM7-LPC2148: ssa
- Kuinka käyttää ADC: tä ARM-LPLC2148: ssa
ARW7-LPC2148: n PWM- ja ADC-nastat
Alla olevassa kuvassa näkyvät LPC2148: n PWM- ja ADC-nastat. Keltaiset laatikot osoittavat (6) PWM-nastaa ja musta laatikko (14) ADC-nastaa.
Tarvittavat komponentit
Laitteisto
- ARM7-LPC2148
- LCD (16x2) -näyttömoduuli
- Servomoottori (SG-90)
- 3,3 V: n jännitesäädin
- 10 k: n potentiometri (2 kappaletta)
- Leipälauta
- Johtojen liittäminen
Ohjelmisto
- Keil uVision 5
- Flash Magic -työkalu
Piirikaavio ja liitännät
Alla olevassa taulukossa on esitetty yhteys servomoottorin ja ARM7-LPC2148: n välillä:
SERVO PINS |
ARM7-LPC2148 |
PUNAINEN (+ 5 V) |
+ 5 V |
RUSKEA (GND) |
GND |
ORANSSI (PWM) |
P0.1 |
Tappi P0.1 on LPC2148: n PWM-lähtö.
Seuraavassa taulukossa on esitetty LCD-liitännät ja ARM7-LPC2148.
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 |
Seuraavassa taulukossa on esitetty ARM7 LPC2148: n ja 3,3 V: n jännitesäätimellä varustetun potentiometrin väliset yhteydet.
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 kohdat
1. Tässä käytetään 3,3 V: n jännitesäädintä analogisen tuloarvon tuottamiseksi LPC2148: n ADC-nastalle (P0,28). Kun 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.
3. LPC2148: n tappi P0.1 antaa PWM-lähdön servomoottorille moottorin sijainnin säätämiseksi.
4. Analogiatulon (ADC) arvon mukaan servomoottorin sijainti muuttuu (0 - 180 astetta) PWM-ulostulotapin kautta kohdassa LPC2148 P0.1.
ARM7-LPC2148: n ohjelmointi servomoottorin ohjausta varten
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.
Vaiheet, jotka liittyvät LPC2148: n määritykseen PWM: lle ja ADC: lle servomoottorin ohjaamiseksi
Vaihe 1: - Sisällytä tarvittavat otsikkotiedostot LPC2148: n koodaamiseen
#sisältää
Vaihe 2: - Seuraava 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 3: - Seuraava tehtävä on valita LPC2148: n PWM-nastat ja PWM-toiminto PINSEL-rekisterin avulla. Käytämme PINSEL0: ta, kun käytämme P0.1: tä LPC2148: n PWM-ulostuloon.
PINSEL0 - = 0x00000008; // LPC2148: n tapin P0.1 asettaminen PWM3: ksi
Vaihe 4: - Seuraavaksi meidän on palautettava ajastimet PWMTCR (Timer Control Register) -toiminnolla.
PWMTCR = 0x02; // Palauta ja poista PWM-laskuri käytöstä
Ja sitten aseta seuraavaksi esiasteikon arvo, joka määrittää PWM: n resoluution.
PWMPR = 0x1D; // Prescale Register -arvo
Vaihe 5: - Aseta seuraavaksi PWMMCR (PWM match control register), kun se asettaa toiminnan, kuten nollaus, keskeytykset PWMMR0: lle ja PWMMR3: lle.
PWMMCR = 0x00000203; // Palauta ja keskeytä MR0-ottelussa, keskeytä MR3-ottelussa
Vaihe 6: - PWM-kanavan enimmäisjakso asetetaan PWMMR0: lla ja PWM-käyttöjakson tonni asetetaan aluksi 0,65 ms: iin
PWMMR0 = 20000; // PWM-aallon aikajakso, 20 ms PWMMR3 = 650; // PWM-aallon tonni 0,65 ms
Vaihe 7: - Seuraavaksi meidän on asetettava Latch Enable vastaaviin ottorekistereihin PWMLER: n avulla
PWMLER = 0x09; // Salvan käyttöönotto PWM3: lle ja PWM0: lle
(Käytämme PWMMR0 & PWMMR3) Ota siis vastaava bitti käyttöön asettamalla PWMLER: ssä 1
Vaihe 8: - 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.
PWMPCR = 0x0800; // Ota PWM3 ja PWM 0 käyttöön, yksi reunaohjattu PWM PWMTCR = 0x09; // Ota PWM ja laskuri käyttöön
Vaihe 9: - Nyt meidän on haettava potentiometriarvot PWM: n työ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).
Vaihe 10: - 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 4: llä muuntamaan ne (0: stä 255: een) ja syötetään lopuksi PWM-ulostulona LPC2148: n P0,1-nastassa. Tässä muunnetaan arvot välillä 0-1023 arvoon 0-255 jakamalla se 4: llä, koska LPC2148: n PWM: llä on 8-bittinen tarkkuus (28).
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 11: - 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 nestekidenä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", dutycycle); LCD_DISPLAY (displayadc); // Näytä ADC-arvon (0-1023) kulma = (adcvalue / 5.7); // Kaava muuntaa ADC-arvo kulmaksi (o - 180 astetta) LCD_SEND (0xC0); sprintf (kulma-arvo, "ANGLE =%. 2f deg", kulma); LCD_DISPLAY (anglevalue);
Opetusohjelman täydellinen koodi ja videokuvaus on annettu alla