- Servo motor
- Krmiljenje servo motorja s pomočjo LPC2148 PWM & ADC
- Zatiči PWM in ADC v ARM7-LPC2148
- Potrebne komponente
- Shema vezja in povezave
- Programiranje ARM7-LPC2148 za upravljanje servo motorja
V prejšnji vadnici smo povezali koračni motor z ARM7-LPC2148. V tej vadnici bomo nadzirali servo motor z ARM7-LPC2148. Servo motor ima prednost pred nizko porabo energije pred koračnim motorjem. Servo motor ustavi svojo porabo energije, ko je dosežen želeni položaj, vendar koračni motor neprekinjeno porablja moč, da zaklene gred v želenem položaju. Servo motorji se večinoma uporabljajo v projektih robotike zaradi svoje natančnosti in enostavnega upravljanja.
V tej vadnici bomo izvedeli več o servo motorju in kako povezati servo z ARM7-LPC2148. Potenciometer je povezan tudi za spreminjanje položaja gredi servo motorja in LCD za prikaz vrednosti kota.
Servo motor
Servo motor je kombinacija enosmernega motorja, sistema za nadzor položaja in zobnikov. Vrtenje servo motorja se nadzoruje tako, da se nanj nanese signal PWM, širina signala PWM pa določa kot vrtenja in smer motorja. Tu bomo v tej vadnici uporabili servo motor SG90, ki je eden izmed najbolj priljubljenih in najcenejših. SG90 je 180-stopinjski servo. Tako lahko s tem servo osi postavimo os od 0-180 stopinj:
- Delovna napetost: + 5V
- Vrsta orodja: umetna masa
- Kot vrtenja: 0 do 180 °
- Teža: 9gm
- Navor: 2,5 kg / cm
Preden začnemo programirati servo motor, moramo vedeti, kateri tip signala je treba poslati za upravljanje servo motorja. MCU bi morali programirati za pošiljanje PWM signalov na signalno žico servo motorja. V servo motorju je krmilno vezje, ki bere delovni cikel signala PWM in postavi gred servo motorjev na ustrezno mesto, kot je prikazano na spodnji sliki
Vsakih 20 milisekund servo motor preveri impulz. Torej prilagodite širino impulza signala, da zavrtite gred motorja.
- Širina impulza 1 ms (1 milisekunda) za vrtenje servo motorja do 0 stopinj
- Širina impulza 1,5 ms za vrtenje do 90 stopinj (nevtralni položaj)
- Širina impulza 2 ms za vrtenje servo sistema za 180 stopinj.
Preden povežete servo z ARM7-LPC2148, lahko svoj servo preizkusite s pomočjo tega vezja servo motorja. Preverite tudi, kako je servo motor mogoče povezati z drugimi mikrokrmilniki:
- Krmiljenje servo motorja z uporabo Arduina
- Vmesnik servo motorja z mikrokrmilnikom 8051
- Krmiljenje servo motorja z uporabo MATLAB-a
- Krmiljenje servo motorja z Raspberry Pi
- Povezava servo motorja z MSP430G2
- Povezava servo motorja s STM32F103C8
Krmiljenje servo motorja s pomočjo LPC2148 PWM & ADC
Servo motor lahko nadzoruje LPC2148 s pomočjo PWM. Z zagotavljanjem PWM signala na SERVO-jev PWM pin z obdobjem 20 ms in frekvenco 50 Hz lahko nastavimo gred servo motorja okoli 180 stopinj (-90 do +90).
Potenciometer se uporablja za spreminjanje delovnega cikla signala PWM in vrtenje gredi servo motorja, ta metoda se izvaja z uporabo modula ADC v LPC2148. V tej vadnici moramo torej uporabiti koncepte PWM in ADC. Zato vas prosimo, da si ogledate naše prejšnje vaje za učenje PWM in ADC v ARM7-LPC2148.
- Kako uporabljati PWM v ARM7-LPC2148
- Kako uporabljati ADC v ARM-LPLC2148
Zatiči PWM in ADC v ARM7-LPC2148
Spodnja slika prikazuje zatiča PWM in ADC v LPC2148. Rumena polja označujejo (6) zatiči PWM, črna polja pa (14) zatiči ADC.
Potrebne komponente
Strojna oprema
- ARM7-LPC2148
- Zaslonski modul LCD (16x2)
- Servo motor (SG-90)
- 3.3V napetostni regulator
- 10k potenciometer (2 št.)
- Breadboard
- Povezovanje žic
Programska oprema
- Keil uVision5
- Flash Magic Tool
Shema vezja in povezave
Spodnja tabela prikazuje povezavo med servo motorjem in ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
RDEČA (+ 5V) |
+ 5V |
RJAVA (GND) |
GND |
ORANŽNA (PWM) |
P0.1 |
Zatič P0.1 je izhod PWM LPC2148.
Spodnja tabela prikazuje povezave vezij med LCD in ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (izbira registra) |
P0.6 |
E (Omogoči) |
P0.12 |
D4 (podatkovni zatič 4) |
P0.13 |
D5 (podatkovni zatič 5) |
P0.14 |
D6 (podatkovni zatič 6) |
P0.15 |
D7 (podatkovni zatič 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Spodnja tabela prikazuje povezave med ARM7 LPC2148 & potenciometer z regulatorjem 3.3V napetosti.
3.3V napetostni regulator IC |
Funkcija zatiča |
Pin ARM-7 LPC2148 |
1. Levi zatič |
- Ve iz GND |
Zatič GND |
2. Center Pin |
Reguliran + 3.3V izhod |
Na potenciometer Vhod in izhod potenciometra na P0,28 LPC2148 |
3. Desni zatič |
+ Ve od 5V VHOD |
+ 5V |
Točke, ki jih je treba upoštevati
1. Za zagotavljanje analogne vhodne vrednosti na ADC zatič (P0.28) LPC2148 se tukaj uporablja napetostni regulator 3,3 V Ker uporabljamo 5V moč, moramo napetost uravnavati z napetostnim regulatorjem 3,3V.
2. Potenciometer se uporablja za spreminjanje napetosti med (0V do 3,3V) za zagotovitev analognega vhoda (ADC) na LPC2148 pin P0.28
3. Zatič P0.1 LPC2148 zagotavlja izhod PWM na servo motor za nadzor položaja motorja.
4. Glede na vrednost analognega vhoda (ADC) se položaj servo motorja spremeni od (0 do 180 stopinj) skozi izhodni zatič PWM pri P0,1 LPC2148.
Programiranje ARM7-LPC2148 za upravljanje servo motorja
Za programiranje ARM7-LPC2148 potrebujemo orodje keil uVision & Flash Magic. Za programiranje ARM7 Stick preko mikro USB vrat uporabljamo kabel USB. Kodo napišemo s pomočjo Keila in ustvarimo šestnajstiško datoteko, nato pa datoteko HEX z Flash Magic utripnemo na ARM7. Če želite izvedeti več o namestitvi keil uVision in Flash Magic ter kako jih uporabljati, sledite povezavi Uvod v mikrokrmilnik ARM7 LPC2148 in ga programirajte s pomočjo Keil uVision.
Koraki pri konfiguraciji LPC2148 za PWM in ADC za nadzor servo motorja
1. korak: - vključite potrebne datoteke glave za kodiranje LPC2148
#include
2. korak: - Naslednja stvar je, da konfigurirate PLL za generiranje ure, saj nastavi sistemsko uro in zunanjo uro LPC2148, kot to potrebujejo programerji. Največja taktna frekvenca za LPC2148 je 60 MHz. Naslednje vrstice se uporabljajo za konfiguriranje generacije ure PLL.
void InitilizePLL (void) // Funkcija za uporabo PLL za generiranje ure { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; medtem ko (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
3. korak: - Naslednja stvar je, da s pomočjo registra PINSEL izberete zatiče PWM in funkcijo PWM LPC2148. PINSEL0 uporabljamo kot P0.1 za izhod PWM LPC2148.
PINSEL0 - = 0x00000008; // Nastavitveni zatič P0.1 LPC2148 kot PWM3
4. korak: - Nato moramo PONASTAVITI merilnike časa s pomočjo PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Ponastavitev in onemogočanje števca za PWM
Nato nastavite vrednost predkale, ki odloča o ločljivosti PWM.
PWMPR = 0x1D; // Vrednost prescale registra
5. korak: - Nato nastavite PWMMCR (register za nadzor ujemanja PWM), saj nastavi delovanje, kot je ponastavitev, prekinitve za PWMMR0 in PWMMR3.
PWMMCR = 0x00000203; // Ponastavitev in prekinitev na tekmi MR0, prekinitev na tekmi MR3
6. korak: - Najdaljše obdobje PWM kanala je nastavljeno s PWMMR0 in ton delovnega cikla PWM je sprva nastavljen na 0,65 ms
PWMMR0 = 20000; // Časovno obdobje vala PWM, 20 ms PWMMR3 = 650; // Tona PWM vala 0,65 ms
7. korak: - Nato moramo nastaviti nastavitev Omogoči zapah na ustrezne registre ujemanja s pomočjo PWMLER
PWMLER = 0x09; // Omogočanje zapaha za PWM3 in PWM0
(Uporabljamo PWMMR0 in PWMMR3) Torej omogočite ustrezni bit z nastavitvijo 1 v PWMLER
8. korak: - Da omogočimo izhod PWM na zatič, moramo uporabiti PWMTCR za omogočanje števcev PWM Timer in načinov PWM.
PWMPCR = 0x0800; // omogoči PWM3 in PWM 0, enojno nadzorovani PWM PWMTCR = 0x09; // Omogoči PWM in števec
Korak 9: - Zdaj moramo dobiti vrednosti potenciometra za nastavitev delovnega cikla PWM iz zatiča ADC P0.28. Za pretvorbo analognega vhoda potenciometrov (0 do 3,3 V) v vrednosti ADC (0 do 1023) uporabljamo modul ADC v LPC2148.
10. korak: - Za izbiro ADC zatiča P0.28 v LPC2148 uporabljamo
PINSEL1 = 0x01000000; // Nastavitev P0.28 kot ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Nastavitev ure in PDN za A / D pretvorbo
Naslednje vrstice zajemajo analogni vhod (od 0 do 3,3 V) in ga pretvorijo v digitalno vrednost (od 0 do 1023). Nato se te digitalne vrednosti delijo s 4, da se pretvorijo v (0 do 255) in se na koncu napajajo kot izhod PWM v P0,1 pin LPC2148. Tu pretvorimo vrednosti od 0-1023 v 0-255, tako da jo delimo s 4, saj ima PWM LPC2148 8-bitno ločljivost (28).
AD0CR - = (1 << 1); // izberemo kanal AD0.1 v času zakasnitve registra ADC (10); AD0CR - = (1 << 24); // Zaženi A / D pretvorbo medtem ((AD0DR1 & (1 << 31)) == 0); // Preveri bit DONE v ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Pridobite REZULTAT iz registra podatkov ADC dutycycle = adcvalue / 4; // formula za pridobitev vrednosti delovnega cikla od (0 do 255) PWMMR1 = delovni cikel; // nastavimo vrednost delovnega cikla na register ujemanja PWM PWMLER - = (1 << 1); // Omogoči izhod PWM z vrednostjo delovnega cikla
11. korak: - Nato te vrednosti prikažemo v zaslonskem modulu LCD (16X2). Torej dodamo naslednje vrstice za inicializacijo modula LCD zaslona
Void LCD_INITILIZE (void) // Funkcija za pripravo LCD-ja { IO0DIR = 0x0000FFF0; // Nastavi pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 kot ČAS zakasnitve IZHOD (20); LCD_SEND (0x02); // inicializiramo lcd v 4-bitnem načinu delovanja LCD_SEND (0x28); // 2 vrstici (16X2) LCD_SEND (0x0C); // Prikaz na kazalcu izklopljen LCD_SEND (0x06); // Samodejni prirastek kurzorja LCD_SEND (0x01); // Prikaži jasen LCD_SEND (0x80); // Prva pozicija prve vrstice }
Ker smo LCD v 4-bitnem načinu povezali z LPC2148, moramo vrednosti poslati tako, da se prikazujejo kot grizenje za grizljanje (zgornje in spodnje grizljanje). Tako se uporabljajo naslednje vrstice.
void LCD_DISPLAY (char * msg) // Funkcija za tiskanje znakov, poslanih enega za drugim { uint8_t i = 0; medtem ko (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // pošlje zgornji grizljaj IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH za tiskanje podatkov IO0CLR = 0x00000020; // RW LOW način zakasnitve v načinu pisanja (2); IO0CLR = 0x00000040; // EN = 0, RS in RW nespremenjeni (tj. RS = 1, RW = 0) čas zakasnitve (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // pošlje spodnji griz IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; čas zakasnitve (2); IO0CLR = 0x00000040; čas zakasnitve (5); i ++; } }
Za prikaz vrednosti ADC in PWM uporabimo naslednje vrstice v funkciji int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", delovni cikel); LCD_DISPLAY (displayadc); // Prikaži vrednost ADC (0 do 1023) angle = (adcvalue / 5.7); // Formula za pretvorbo vrednosti ADC v kot (o do 180 stopinj) LCD_SEND (0xC0); sprintf (anglevalue, "ANGLE =%. 2f deg", kot); LCD_DISPLAY (kotna vrednost);
Popolna koda in video opis vadnice sta podana spodaj