- Szervómotor
- A szervomotor vezérlése LPC2148 PWM és ADC segítségével
- PWM és ADC csapok az ARM7-LPC2148-ban
- Szükséges alkatrészek
- Áramkör és kapcsolatok
- ARM7-LPC2148 programozása a szervomotor vezérléséhez
Korábbi oktatóanyagunkban összekapcsoltuk a léptetőmotort az ARM7-LPC2148-mal. Ebben az oktatóanyagban a szervomotort az ARM7-LPC2148 vezérli. A szervomotor alacsony energiafogyasztási előnnyel rendelkezik a léptetőmotorral szemben. A szervomotor leállítja az energiafogyasztást, amikor eléri a kívánt helyzetet, de a léptetőmotor folyamatosan fogyasztja az energiát, hogy a tengelyt a kívánt helyzetbe rögzítse. A szervomotorokat pontosságuk és könnyű kezelhetőségük miatt többnyire a robotprojektekben használják.
Ebben az oktatóanyagban megismerkedhetünk a szervomotorral és a szervo interfészének kezelésével az ARM7-LPC2148-mal. Potenciométer is csatlakozik a szervomotor tengelyének helyzetének megváltoztatásához, valamint egy LCD a szögérték megjelenítéséhez.
Szervómotor
A szervomotor az egyenáramú motor, a helyzetszabályozó rendszer és a fogaskerekek kombinációja. A szervomotor forgását PWM jel alkalmazásával lehet szabályozni, a PWM jel szélessége határozza meg a motor forgási szögét és irányát. Itt az SG90 szervomotort fogjuk használni ebben az oktatóanyagban, ez az egyik legnépszerűbb és legolcsóbb. Az SG90 180 fokos szervo. Tehát ezzel a szervóval 0-180 fokos helyzetbe tudjuk hozni a tengelyt:
- Üzemi feszültség: + 5V
- Fogaskerék típusa: műanyag
- Forgási szög: 0-180 fok
- Súly: 9gm
- Nyomaték: 2,5kg / cm
Mielőtt elkezdenénk programozni a szervomotort, tudnunk kell, hogy milyen típusú jelet kell küldeni a szervomotor vezérléséhez. Programoznunk kell az MCU-t, hogy PWM jeleket küldjön a szervomotor jelvezetékére. A szervomotor belsejében van egy vezérlő áramkör, amely leolvassa a PWM jel működési ciklusát, és a szervomotor tengelyét a megfelelő helyre pozicionálja, az alábbi képen látható módon
A szervomotor 20 milliszekundumonként ellenőrzi az impulzust. Tehát állítsa be a jel impulzusszélességét a motor tengelyének forgatásához.
- 1 ms (1 milliszekundum) impulzusszélesség a szervo 0 fokos elforgatásához
- 1,5 ms impulzusszélesség 90 fokos forgatáshoz (semleges helyzet)
- 2 ms impulzusszélesség a szervo 180 fokos elforgatásához.
Mielőtt a szervót csatlakoztatja az ARM7-LPC2148-hoz, tesztelheti a szervót ennek a szervomotor tesztelő áramkörnek a segítségével. Ellenőrizze azt is, hogyan lehet a szervomotort összekapcsolni más mikrovezérlőkkel:
- Szervomotor vezérlés az Arduino segítségével
- Szervomotor összekapcsolása a 8051 mikrokontrollerrel
- Szervomotor vezérlés a MATLAB segítségével
- Szervomotor vezérlés Raspberry Pi-vel
- Összekötő szervomotor az MSP430G2-vel
- Összekötő szervomotor és STM32F103C8
A szervomotor vezérlése LPC2148 PWM és ADC segítségével
A szervomotort az LPC2148 vezérelheti a PWM segítségével. Ha PWM jelet juttatunk a SERVO PWM érintkezõjéhez 20ms periódussal és 50Hz frekvenciával, akkor a szervomotor tengelyét 180 fok (-90 és +90) között tudjuk elhelyezni.
A PWM jel működési ciklusának megváltoztatására és a szervomotor tengelyének forgatására potenciométert használnak, ezt a módszert az LPC2148 ADC moduljának használatával valósítják meg. Tehát mind a PWM, mind az ADC koncepciókra van szükségünk ebben az oktatóanyagban. Ezért kérjük, olvassa el korábbi oktatóanyagainkat, hogy megtanulják a PWM-et és az ADC-t az ARM7-LPC2148-ban.
- A PWM használata az ARM7-LPC2148 fájlban
- Az ADC használata az ARM-LPLC2148 fájlban
PWM és ADC csapok az ARM7-LPC2148-ban
Az alábbi képen láthatóak az LPC2148 PWM és ADC csapjai. A sárga négyzetek a (6) PWM csapokat, a fekete dobozok a (14) ADC csapokat jelölik.
Szükséges alkatrészek
Hardver
- ARM7-LPC2148
- LCD (16x2) kijelző modul
- Szervomotor (SG-90)
- 3,3 V feszültségszabályozó
- 10k potenciométer (2 Nos)
- Kenyérlemez
- Vezetékek csatlakoztatása
Szoftver
- Keil uVision5
- Flash Magic eszköz
Áramkör és kapcsolatok
Az alábbi táblázat a szervomotor és az ARM7-LPC2148 közötti kapcsolatot mutatja :
SERVO PINS |
ARM7-LPC2148 |
VÖRÖS (+ 5 V) |
+ 5V |
BARNA (GND) |
GND |
NARANCS (PWM) |
P0.1 |
A P0.1 érintkezõ az LPC2148 PWM kimenete.
Az alábbi táblázat az LCD és az ARM7-LPC2148 közötti áramköri kapcsolatokat mutatja.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Regisztráció kiválasztása) |
P0.6 |
E (engedélyezés) |
P0.12 |
D4 (4. adatcsap) |
P0.13 |
D5 (5. adat tű) |
P0.14 |
D6 (6. adat tű) |
P0.15 |
D7 (7. adat tű) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Az alábbi táblázat az ARM7 LPC2148 és a 3,3 V-os feszültségszabályozóval ellátott potenciométer közötti kapcsolatokat mutatja.
3,3 V feszültségszabályozó IC |
Pin funkció |
ARM-7 LPC2148 tű |
1. Bal tű |
- Ve a GND-ből |
GND csap |
2. Központi tű |
Szabályozott + 3,3 V kimenet |
Potenciométer bemenetére és potenciométer kimenetére az LPC2148 P0.28-ig |
3. Jobb csap |
+ Ve 5V-ból BEMENET |
+ 5V |
Megjegyzendő pontok
1. Itt 3,3 V feszültségszabályozót használnak az analóg bemeneti érték biztosításához az LPC2148 ADC tűjéhez (P0.28). Mivel 5 V-os energiát használunk, a feszültséget 3,3 V-os feszültségszabályozóval kell szabályozni.
2. Potenciométert használnak a feszültség változtatására (0 V és 3,3 V) között, hogy analóg bemenetet (ADC) biztosítson az LPC2148 P0.28 tűhöz
3. Az LPC2148 P0.1 csapja PWM kimenetet biztosít a szervomotorhoz a motor helyzetének szabályozásához.
4. Az analóg bemenet (ADC) értéke szerint a szervomotor helyzete (0 és 180 fok) között változik a PWM kimeneti tüskén keresztül az LPC2148 P0.1 pontján.
ARM7-LPC2148 programozása a szervomotor vezérléséhez
Az ARM7-LPC2148 programozásához szükségünk van keil uVision és Flash Magic eszközre. USB-kábellel programozzuk az ARM7 Stick-et mikro USB-porton keresztül. Kódot írunk a Keil segítségével, és létrehozunk egy hex fájlt, majd a HEX fájlt a Flash Magic segítségével az ARM7 pálcára villantjuk. Ha többet szeretne megtudni a keil uVision és a Flash Magic telepítéséről és használatáról, kövesse az Első lépések az ARM7 LPC2148 mikrovezérlővel linket és programozza be a Keil uVision használatával.
A szervomotor vezérléséhez szükséges lépések az LPC2148 PWM és ADC konfigurálásához
1. lépés: - Tartalmazza az LPC2148 kódolásához szükséges fejlécfájlokat
#include
2. lépés: - A következő lépés az, hogy konfiguráljuk a PLL-t az óra előállításához, mivel ez az LPC2148 rendszeróráját és perifériás óráját állítja be, amire a programozóknak szüksége van. Az LPC2148 maximális órajel-frekvenciája 60Mhz. A következő sorokat használjuk a PLL óra generálásának konfigurálásához.
void initilizePLL (void) // Funkció a PLL használatához az óra létrehozásához { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; míg (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
3. lépés: - A következő lépés a PINSEL regiszter használatával válassza ki az LPC2148 PWM csapszegeit és PWM funkcióját. PINSEL0-t használunk, mivel a P0.1-et használjuk az LPC2148 PWM kimenetéhez.
PINSEL0 - = 0x00000008; // Az LPC2148 P0.1 lábának beállítása PWM3 néven
4. lépés: - Ezután vissza kell állítanunk az időzítőket a PWMTCR (Timer Control Register) segítségével.
PWMTCR = 0x02; // A PWM számlálójának visszaállítása és letiltása
Ezután állítsa be az előskála értékét, amely meghatározza a PWM felbontását.
PWMPR = 0x1D; // Prescale Register értéke
5. lépés: - Ezután állítsa be a PWMMCR (PWM match control register) beállítást, amely olyan műveletet állít be, mint a reset, a PWMMR0 és a PWMMR3 megszakítása.
PWMMCR = 0x00000203; // Visszaállítás és megszakítás az MR0 mérkőzésen, megszakítás az MR3 mérkőzésen
6. lépés: - A PWM csatorna maximális periódusát a PWMMR0 segítségével állítja be, és a PWM üzemi ciklus tonnáját kezdetben 0,65 ms-ra állítja be
PWMMR0 = 20000; // A PWM hullám időtartama, 20 ms PWMMR3 = 650; // PWM hullám tonna 0,65 ms
7. lépés: - Ezután be kell állítanunk a Latch Enable-t a megfelelő egyeztetési regiszterekre a PWMLER segítségével
PWMLER = 0x09; // Retesz engedélyezése PWM3 és PWM0 esetén
(PWMMR0 és PWMMR3-at használunk) Tehát engedélyezzük a megfelelő bitet azáltal, hogy a PWMLER-ben 1-et beállítunk
8. lépés: - A PWM kimenet engedélyezéséhez a csaphoz a PWMTCR-t kell használnunk a PWM Timer számlálók és PWM módok engedélyezéséhez.
PWMPCR = 0x0800; // PWM3 és PWM 0 engedélyezése, egy élű vezérlésű PWM PWMTCR = 0x09; // PWM és számláló engedélyezése
9. lépés: - Most meg kell kapnunk a PWM munkaciklusának beállításához szükséges potenciométer értékeket az ADC P0.28 tűről. Tehát az LPC2148 ADC modulját használjuk a potenciométerek analóg bemenetének (0–3,3 V) átalakítására az ADC értékekre (0–1023).
10. lépés: - A kiválasztására ADC pin P0.28 a LPC2148, az általunk használt
PINSEL1 = 0x01000000; // A P0.28 beállítása ADC bemenetként AD0CR = (((14) << 8) - (1 << 21)); // Óra és PDN beállítása az A / D konverzióhoz
A következő sorok rögzítik az analóg bemenetet (0–3,3 V), és átalakítják digitális értékre (0–1023). Ezután ezeket a digitális értékeket elosztjuk 4 -gyel, hogy átalakítsuk őket (0-tól 255-ig), és végül PWM kimenetként tápláljuk az LPC2148 P0.1 tűjébe. Itt az értékeket 0-1023-ról 0-255-re konvertáljuk úgy, hogy elosztjuk 4-gyel, mivel az LPC2148 PWM-jének 8 bites felbontása van (28).
AD0CR - = (1 << 1); // Válassza ki az AD0.1 csatornát az ADC regiszter késleltetési idejéből (10); AD0CR - = (1 << 24); // Indítsa el az A / D konverziót, míg (((AD0DR1 & (1 << 31)) == 0); // Ellenőrizze a DONE bitet az ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Az EREDMÉNY beszerzése az ADC adatregiszterből dutycycle = adcvalue / 4; // képlet a dutycycle értékek (0-tól 255-ig) megszerzésére PWMMR1 = dutycycle; // állítsa a dutycycle értékét PWM egyezési regiszterbe PWMLER - = (1 << 1); // PWM kimenet engedélyezése dutycycle értékkel
11. lépés: - Ezután ezeket az értékeket megjelenítjük az LCD (16X2) kijelző modulban. Tehát a következő sorokat adjuk az LCD kijelző modul inicializálásához
Törölje az LCD_INITILIZE (void) // Funkciót az LCD előkészítéséhez { IO0DIR = 0x0000FFF0; // a P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 csapokat OUTPUT késleltetési időként állítja be (20); LCD_SEND (0x02); // Lcd inicializálása 4 bites üzemmódban LCD_SEND (0x28); // 2 sor (16X2) LCD_SEND (0x0C); // Megjelenítés a kurzoron ki LCD_SEND (0x06); // Automatikus növekedési kurzor LCD_SEND (0x01); // Kijelző tiszta LCD_SEND (0x80); // Az első sor első pozíciója }
Mivel 4-bites módban csatlakoztattuk az LCD-t az LPC2148-hoz, el kell küldenünk azokat az értékeket, amelyek rágcsálással jelennek meg. Tehát a következő sorokat használjuk.
void LCD_DISPLAY (char * msg) // Funkció az egyesével elküldött karakterek kinyomtatására { uint8_t i = 0; míg (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Felső rágcsálást küld IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH az adatok kinyomtatásához IO0CLR = 0x00000020; // RW LOW Írási mód késleltetési ideje (2); IO0CLR = 0x00000040; // EN = 0, RS és RW változatlan (azaz RS = 1, RW = 0) késleltetési idő (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Alsó rágcsálást küld IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; késleltetési idő (2); IO0CLR = 0x00000040; késleltetési idő (5); i ++; } }
Az ADC & PWM értékek megjelenítéséhez a következő sorokat használjuk az int main () függvényben.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // ADC-érték megjelenítése (0-1023 ) szög = (adcvalue / 5.7); // Képlet az ADC érték szöggé alakítására (o – 180 fok) LCD_SEND (0xC0); sprintf (szögérték, "ANGLE =%. 2f deg", szög); LCD_DISPLAY (anglevalue);
Az oktatóanyag teljes kódját és videó leírását az alábbiakban adjuk meg