- Servo motors
- Servomotora vadība, izmantojot LPC2148 PWM un ADC
- PWM un ADC tapas ARM7-LPC2148
- Nepieciešamās sastāvdaļas
- Shēmas shēma un savienojumi
- ARM7-LPC2148 programmēšana servomotora vadībai
Mūsu iepriekšējā apmācībā mēs esam saskarnes soļu motoru ar ARM7-LPC2148. Šajā apmācībā mēs kontrolēsim servomotoru ar ARM7-LPC2148. Servomotoram ir zema enerģijas patēriņa priekšrocība salīdzinājumā ar soļu motoru. Servomotors pārtrauc enerģijas patēriņu, kad ir sasniegta vēlamā pozīcija, bet pakāpju motors nepārtraukti patērē enerģiju, lai bloķētu vārpstu vēlamajā stāvoklī. Servomotorus galvenokārt izmanto robotikas projektos to precizitātes un vieglās vadāmības dēļ.
Šajā apmācībā mēs uzzināsim par servomotoru un kā saskarni Servo ar ARM7-LPC2148. Saskarne ir arī potenciometrs, lai mainītu servomotora vārpstas stāvokli, un LCD, lai parādītu leņķa vērtību.
Servo motors
Servomotors ir līdzstrāvas motora, stāvokļa kontroles sistēmas un pārnesumu kombinācija. Servomotora rotāciju kontrolē, tam pievienojot PWM signālu, PWM signāla platums nosaka motora rotācijas leņķi un virzienu. Šajā apmācībā mēs izmantosim SG90 servomotoru, tas ir viens no populārākajiem un lētākajiem. SG90 ir 180 grādu servo. Tātad ar šo servo mēs varam novietot asi no 0 līdz 180 grādiem:
- Darba spriegums: + 5V
- Zobrata tips: plastmasa
- Rotācijas leņķis: no 0 līdz 180 grādiem
- Svars: 9gm
- Griezes moments: 2,5 kg / cm
Pirms varam sākt programmēt servomotoru, mums jāzina, kāda veida signāls jāsūta servomotora vadībai. Mums vajadzētu ieprogrammēt MCU sūtīt PWM signālus uz servomotora signāla vadu. Servomotora iekšpusē ir vadības shēma, kas nolasa PWM signāla darba ciklu un pozicionē servomotora vārpstu attiecīgajā vietā, kā parādīts attēlā zemāk
Servo motors ik pēc 20 milisekundēm pārbauda impulsu. Tātad, noregulējiet signāla impulsa platumu, lai pagrieztu motora vārpstu.
- 1 ms (1 milisekunde) impulsa platums servo pagriešanai līdz 0 grādiem
- 1,5 ms impulsa platums pagriešanai līdz 90 grādiem (neitrālā stāvoklī)
- 2 ms impulsa platums servo pagriešanai līdz 180 grādiem.
Pirms servo pievienošanas ARM7-LPC2148, jūs varat pārbaudīt servo ar šīs servomotora testēšanas shēmas palīdzību. Pārbaudiet arī to, kā servomotoru var sasaistīt ar citiem mikrokontrolleriem:
- Servomotora vadība, izmantojot Arduino
- Servomotora mijiedarbība ar 8051 mikrokontrolleru
- Servomotora vadība, izmantojot MATLAB
- Servomotora vadība ar Raspberry Pi
- Saskarne servomotoram ar MSP430G2
- Saskarne servomotoram ar STM32F103C8
Servomotora vadība, izmantojot LPC2148 PWM un ADC
Servomotoru var vadīt ar LPC2148, izmantojot PWM. Nodrošinot PWM signālu SERVO PWM tapai ar 20ms periodu un 50Hz frekvenci, servomotora vārpstu varam novietot ap 180 grādiem (-90 līdz +90).
Potenciometru izmanto, lai mainītu PWM signāla darba ciklu un pagrieztu servomotora vārpstu, šī metode tiek ieviesta, izmantojot ADC moduli LPC2148. Tāpēc mums šajā apmācībā ir jāievieš gan PWM, gan ADC koncepcijas. Tāpēc, lūdzu, skatiet mūsu iepriekšējās apmācības, lai uzzinātu PWM un ADC ARM7-LPC2148.
- Kā lietot PWM operētājsistēmā ARM7-LPC2148
- Kā lietot ADC operētājsistēmā ARM-LPLC2148
PWM un ADC tapas ARM7-LPC2148
Zemāk redzamajā attēlā ir redzamas PWM un ADC tapas LPC2148. Dzeltenās rūtiņas norāda (6) PWM tapas un melnās rūtiņas (14) ADC tapas.
Nepieciešamās sastāvdaļas
Aparatūra
- ARM7-LPC2148
- LCD (16x2) displeja modulis
- Servomotors (SG-90)
- 3,3 V sprieguma regulators
- 10 k potenciometrs (2 nos)
- Maizes dēlis
- Vadu savienošana
Programmatūra
- Keil uVision5
- Flash burvju rīks
Shēmas shēma un savienojumi
Zemāk esošajā tabulā parādīts savienojums starp servomotoru un ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
Sarkans (+ 5 V) |
+ 5V |
BROWN (GND) |
GND |
APELSINS (PWM) |
P0.1 |
Tapa P0.1 ir LPC2148 PWM izeja.
Zemāk esošajā tabulā parādīti ķēdes 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 |
Zemāk esošajā tabulā parādīti savienojumi 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 |
Punkti, kas jāatzīmē
1. Šeit tiek izmantots 3,3 V sprieguma regulators, lai nodrošinātu analogo ieejas vērtību LPC2148 ADC tapai (P0.28). Tā kā 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.
3. LPC2148 tapa P0.1 nodrošina PWM izeju uz servomotoru, lai kontrolētu motora stāvokli.
4. Saskaņā ar analogās ievades (ADC) vērtību servomotora stāvoklis mainās no (0 līdz 180 grādiem) caur PWM izejas tapu pie LPC2148 P0.1.
ARM7-LPC2148 programmēšana servomotora vadībai
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.
Darbības, kas saistītas ar LPC2148 konfigurēšanu PWM un ADC servomotora vadībai
1. solis: - Iekļaujiet nepieciešamos galvenes failus, lai kodētu LPC2148
# iekļaut
2. solis: - Nākamā lieta 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; }
3. solis: - Nākamā lieta, kas jādara, ir izvēlēties LPC2148 PWM tapas un PWM funkciju, izmantojot PINSEL reģistru. Mēs izmantojam PINSEL0, tāpat kā P0.1, lai LPC2148 PWM izvadītu.
PINSEL0 - = 0x00000008; // LPC2148 tapas P0.1 iestatīšana kā PWM3
4. solis: - Tālāk mums ir jāatjauno taimeri, izmantojot PWMTCR (taimera vadības reģistrs).
PWMTCR = 0x02; // Atiestatīt un atspējot PWM skaitītāju
Un pēc tam iestatiet pirmsskolas vērtību, kas nosaka PWM izšķirtspēju.
PWMPR = 0x1D; // Prescale Register vērtība
5. solis: - Pēc tam iestatiet PWMMCR (PWM spēles kontroles reģistrs), jo tas nosaka darbību, piemēram, atiestatīšanu, PWMMR0 un PWMMR3 pārtraukumus.
PWMMCR = 0x00000203; // Atiestatīt un pārtraukt MR0 spēli, pārtraukt MR3 spēli
6. solis: - PWM kanāla maksimālais periods tiek iestatīts, izmantojot PWMMR0, un PWM darba cikla tonna sākotnēji tiek iestatīta uz 0,65 ms
PWMMR0 = 20000; // PWM viļņa laika periods, 20msek PWMMR3 = 650; // PWM viļņa tonna 0,65 ms
7. solis: - Pēc tam, izmantojot PWMLER, mums jāiestata fiksatora iespējošana atbilstošajos atbilstības reģistros
PWMLER = 0x09; // Fiksatora iespējošana PWM3 un PWM0
(Mēs izmantojam PWMMR0 un PWMMR3) Tātad iespējojiet atbilstošo bitu, PWMLER iestatot 1
8. 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.
PWMPCR = 0x0800; // Iespējot PWM3 un PWM 0, ar vienu malu kontrolētu PWM PWMTCR = 0x09; // Iespējot PWM un skaitītāju
9. solis: - Tagad mums jāiegūst potenciometra vērtības PWM darba cikla iestatīšanai no ADC tapas P0.28. Tātad, 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).
10. 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). Pēc tam šīs digitālās vērtības tiek dalītas ar 4, lai tās pārveidotu par (0 līdz 255), un visbeidzot tiek piegādātas kā PWM izeja LPC2148 P0.1 tapā. Š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 (28).
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
11. solis: - Pēc tam šī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 (Upper Nibble & 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", dutycycle); LCD_DISPLAY (displayadc); // Parādīt ADC vērtības (no 0 līdz 1023) leņķi = (adcvalue / 5.7); // Formula, lai pārveidotu ADC vērtību leņķī (o līdz 180 grādiem) LCD_SEND (0xC0); sprintf (leņķa vērtība, "ANGLE =%. 2f deg", leņķis); LCD_DISPLAY (leņķa vērtība);
Pilns apmācības kods un video apraksts ir sniegts zemāk