- Servo variklis
- Servovariklio valdymas naudojant LPC2148 PWM ir ADC
- PWM ir ADC kaiščiai ARM7-LPC2148
- Būtini komponentai
- Grandinės schema ir jungtys
- ARM7-LPC2148 programavimas servovariklio valdymui
Ankstesnėje mūsų pamokoje mes sujungėme žingsninį variklį su ARM7-LPC2148. Šioje pamokoje mes valdysime servo variklį su ARM7-LPC2148. Servo variklis turi mažą energijos vartojimo pranašumą, palyginti su žingsniniu varikliu. Servo variklis sustabdo energijos suvartojimą, kai pasiekiama norima padėtis, tačiau žingsninis variklis nuolat vartoja energiją, kad užfiksuotų veleną norimoje padėtyje. Servo varikliai dažniausiai naudojami robotikos projektuose dėl jų tikslumo ir paprasto valdymo.
Šioje pamokoje sužinosime apie servo variklį ir kaip susieti servo su ARM7-LPC2148. Taip pat yra sąsaja su potenciometru, kad būtų galima pakeisti servo variklio veleno padėtį, ir LCD, kad būtų rodoma kampo vertė.
Servo variklis
Servovariklis yra nuolatinės srovės variklio, padėties valdymo sistemos ir pavarų derinys. Servovariklio sukimas valdomas įjungiant PWM signalą, PWM signalo plotis lemia variklio sukimosi kampą ir kryptį. Čia šioje instrukcijoje naudosime „SG90 Servo Motor “, tai yra vienas iš populiariausių ir pigiausių. SG90 yra 180 laipsnių servo. Taigi naudodami šį servo ašį mes galime nustatyti 0-180 laipsnių kampą:
- Darbinė įtampa: + 5V
- Pavarų tipas: plastikas
- Pasukimo kampas: nuo 0 iki 180 laipsnių
- Svoris: 9gm
- Sukimo momentas: 2,5 kg / cm
Prieš pradėdami programuoti servovariklį, turėtume žinoti, kokio tipo signalas turi būti siunčiamas valdant servovariklį. Turėtume užprogramuoti MCU siųsti PWM signalus į servo variklio signalo laidą. Servovariklio viduje yra valdymo grandinė, nuskaitanti PWM signalo veikimo ciklą ir padedanti servovariklio veleną atitinkamoje vietoje, kaip parodyta paveikslėlyje žemiau
Servo variklis tikrina impulsą kas 20 milisekundžių. Taigi, norėdami pasukti variklio ašį, sureguliuokite signalo impulso plotį.
- 1 ms (1 milisekundės) impulso plotis, kai servo pasukamas iki 0 laipsnių
- 1,5 ms impulso plotis pasukant iki 90 laipsnių (neutrali padėtis)
- 2 ms impulso plotis servo pasukimui iki 180 laipsnių.
Prieš prijungdami servomotorą prie ARM7-LPC2148, galite patikrinti servo servorą naudodamiesi šia servo variklio testerio grandine. Taip pat patikrinkite, kaip servovariklis gali būti sujungtas su kitais mikrovaldikliais:
- Servo variklio valdymas naudojant „Arduino“
- Servo variklio sąsaja su 8051 mikrovaldikliu
- Servovariklio valdymas naudojant MATLAB
- Servo variklio valdymas su „Raspberry Pi“
- Servo variklio sąsaja su MSP430G2
- Servo variklio sąsaja su STM32F103C8
Servovariklio valdymas naudojant LPC2148 PWM ir ADC
Servovariklį galima valdyti LPC2148 naudojant PWM. Teikdami PWM signalą į SERVO PWM kaištį 20ms periodu ir 50Hz dažniu, servovariklio ašį galime nustatyti maždaug 180 laipsnių kampu (nuo -90 iki +90).
Potenciometras naudojamas PWM signalo darbo ciklui keisti ir servovariklio velenui pasukti. Šis metodas įgyvendinamas naudojant ADC modulį LPC2148. Taigi šioje pamokoje mums reikia įgyvendinti tiek PWM, tiek ADC koncepcijas. Taigi maloniai perskaitykite mūsų ankstesnes pamokas, kad sužinotumėte PWM ir ADC iš ARM7-LPC2148.
- Kaip naudoti PWM sistemoje ARM7-LPC2148
- Kaip naudoti ADC sistemoje ARM-LPLC2148
PWM ir ADC kaiščiai ARM7-LPC2148
Žemiau pateiktame paveikslėlyje parodyti LPC2148 PWM ir ADC kaiščiai. Geltonos spalvos langeliai žymi (6) PWM kaiščius, o juoda dėžutė - (14) ADC kaiščius.
Būtini komponentai
Aparatinė įranga
- ARM7-LPC2148
- LCD (16x2) ekrano modulis
- Servo variklis (SG-90)
- 3,3 V įtampos reguliatorius
- 10 k potenciometras (2 pavad.)
- Bandomoji Lenta
- Laidų sujungimas
Programinė įranga
- „Keil uVision“
- „Flash Magic“ įrankis
Grandinės schema ir jungtys
Žemiau esančioje lentelėje parodytas servovariklio ir ARM7-LPC2148 ryšys:
SERVO PINS |
ARM7-LPC2148 |
RAUDONA (+ 5 V) |
+ 5 V |
RUDA (GND) |
BND |
APELSINAS (PWM) |
P0.1 |
Kaištis P0.1 yra LPC2148 PWM išvestis.
Žemiau esančioje lentelėje parodytos grandinės jungtys tarp LCD ir ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS („Register Select“) |
P0.6 |
E (įjungti) |
P0.12 |
D4 (4 duomenų kaištis) |
P0.13 |
D5 (5 duomenų kaištis) |
P0.14 |
D6 (6 duomenų kaištis) |
P0.15 |
D7 (7 duomenų kaištis) |
BND |
VSS, R / W, K |
+ 5 V |
VDD, A |
Žemiau esančioje lentelėje parodytos jungtys tarp ARM7 LPC2148 ir potenciometro su 3,3 V įtampos reguliatoriumi.
3,3 V įtampos reguliatoriaus IC |
PIN funkcija |
ARM-7 LPC2148 kaištis |
1. Kairysis kaištis |
- Ve iš GND |
BND kaištis |
2. Centro kaištis |
Reguliuojama + 3,3 V išvestis |
Į potenciometro įvestį ir potenciometro išėjimą į LPC2148 P0.28 |
3. Dešinysis kaištis |
+ Ve nuo 5V ĮVADAS |
+ 5 V |
Taškai, į kuriuos reikia atkreipti dėmesį
1. Analoginės įvesties vertei LPC2148 ADC kaiščiui (P0.28) pateikti čia naudojamas 3,3 V įtampos reguliatorius. Naudodami 5 V galią, mes turime reguliuoti įtampą 3,3 V įtampos reguliatoriumi.
2. Potenciometras naudojamas įtampai keisti (nuo 0 V iki 3,3 V), kad būtų užtikrinta analoginė įvestis (ADC) į LPC2148 kontaktą P0.28.
3. LPC2148 kaištis P0.1 suteikia PWM išėjimą į servovariklį, kad valdytų variklio padėtį.
4. Pagal analoginio įėjimo (ADC) vertę servovariklio padėtis keičiasi nuo (0 iki 180 laipsnių) per PWM išvesties kaištį ties LPC2148 P0.1.
ARM7-LPC2148 programavimas servovariklio valdymui
Norėdami programuoti ARM7-LPC2148, mums reikia „Keil uVision“ ir „Flash Magic“ įrankio. „ARM7 Stick“ programavimui per „micro USB“ prievadą naudojame USB kabelį. Mes rašome kodą naudodami „Keil“ ir sukuriame hex failą, tada HEX failas perduodamas į „ARM7“ lazdelę naudojant „Flash Magic“. Norėdami sužinoti daugiau apie „Keil uVision“ ir „Flash Magic“ diegimą ir kaip juos naudoti, spustelėkite nuorodą „Darbo pradžia su„ ARM7 LPC2148 “mikrovaldikliu ir užprogramuokite naudodami„ Keil uVision “.
Veiksmai, susiję su LPC2148 konfigūravimu PWM ir ADC valdyti servo variklį
1 žingsnis: - Įtraukite būtinus antraštės failus, skirtus koduoti LPC2148
# įtraukti
2 žingsnis: - Kitas dalykas yra sukonfigūruoti PLL laikrodžio generavimui, nes jis nustato sistemos laikrodį ir periferinį LPC2148 laikrodį, kaip reikia programuotojams. Maksimalus LPC2148 laikrodžio dažnis yra 60 MHz. Šios eilutės naudojamos konfigūruoti PLL laikrodžio generavimą.
void initilizePLL (void) // Funkcija naudoti PLL laikrodžio generavimui { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; o (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
3 žingsnis: - Kitas dalykas, kurį reikia padaryti, yra pasirinkti LPC2148 PWM kaiščius ir PWM funkciją naudojant PINSEL registrą. Mes naudojame PINSEL0, nes mes naudojame P0.1 PWM išėjimui LPC2148.
PINSEL0 - = 0x00000008; // LPC2148 kaištis P0.1 kaip PWM3
4 žingsnis: - Tada turime iš naujo nustatyti laikmačius naudodami PWMTCR (laikmačio valdymo registrą).
PWMTCR = 0x02; // Iš naujo nustatykite ir išjunkite PWM skaitiklį
Tada nustatykite išankstinio lygio vertę, kuri nustato PWM skiriamąją gebą.
PWMPR = 0x1D; // Prescale Register vertė
5 žingsnis: - Tada nustatykite PWMMCR (PWM atitikties valdymo registrą), nes jis nustato tokią operaciją kaip atstatymas, PWMMR0 ir PWMMR3 pertraukimas.
PWMMCR = 0x00000203; // Reset ir pertraukite MR0 rungtynes, pertraukite MR3 rungtynes
6 žingsnis: - Maksimalus PWM kanalo laikotarpis nustatomas naudojant PWMMR0, o PWM darbo ciklo tona iš pradžių nustatoma į 0,65 ms
PWMMR0 = 20000; // PWM bangos laikotarpis, 20msek PWMMR3 = 650; // PWM bangos tona 0,65 msek
7 žingsnis: - Tada turime nustatyti „Latch Enable“ į atitinkamus atitikties registrus, naudodami PWMLER
PWMLER = 0x09; // Užrakto įgalinimas PWM3 ir PWM0
(Mes naudojame PWMMR0 ir PWMMR3) Taigi įjunkite atitinkamą bitą nustatydami 1 PWMLER
8 žingsnis: - Norėdami įjungti PWM išvestį į kaištį, turime naudoti PWMTCR įgalindami PWM laikmačio skaitiklius ir PWM režimus.
PWMPCR = 0x0800; // Įjungti PWM3 ir PWM 0, valdomas vienu kraštu PWM PWMTCR = 0x09; // Įgalinti PWM ir skaitiklį
9 žingsnis: - Dabar mes turime gauti potenciometro reikšmes PWM darbo ciklui nustatyti iš ADC kaiščio P0.28. Taigi, mes naudojame ADC modulį LPC2148 konvertuodami potenciometrų analoginę įvestį (nuo 0 iki 3,3 V) į ADC reikšmes (nuo 0 iki 1023).
10 žingsnis: - Norėdami pasirinkti ADC kaištį P0.28 LPC2148, mes naudojame
PINSEL1 = 0x01000000; // P0.28 nustatymas kaip ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // A / D konvertavimo laikrodžio ir PDN nustatymas
Šiose eilutėse užfiksuotas analoginis įėjimas (nuo 0 iki 3,3 V) ir paverstas skaitmenine reikšme (nuo 0 iki 1023). Tada šios skaitmeninės vertės padalijamos iš 4, kad būtų galima jas konvertuoti į (nuo 0 iki 255) ir galiausiai tiekiamos kaip PWM išvestis LPC2148 P0.1 kontakte. Čia mes konvertuojame vertes nuo 0-1023 į 0-255, padalydami ją iš 4, nes LPC2148 PWM turi 8 bitų skiriamąją gebą (28).
AD0CR - = (1 << 1); // ADC registro delsos laikas (10) pasirinkite AD0.1 kanalą ; AD0CR - = (1 << 24); // Pradėkite A / D konversiją, kol ((AD0DR1 & (1 << 31)) == 0); // Patikrinkite DONE bitą ADC duomenų registre adcvalue = (AD0DR1 >> 6) & 0x3ff; // Gaukite REZULTATĄ iš ADC duomenų registro dutycycle = adcvalue / 4; // formulė gauti dutycycle reikšmes nuo (0 iki 255) PWMMR1 = dutycycle; // nustatyti dutycycle reikšmę į PWM atitikmenų registrą PWMLER - = (1 << 1); // Įgalinti PWM išvestį su dutycycle verte
11 žingsnis: - Tada tas vertes rodysime LCD (16X2) ekrano modulyje. Taigi, norėdami inicializuoti LCD ekraną, pridedame šias eilutes
Negalima LCD_INITILIZE (negaliojanti) // Funkcija norint paruošti skystųjų kristalų ekraną { IO0DIR = 0x0000FFF0; // nustato kaiščius P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 kaip OUTPUT delaytime (20); LCD_SEND (0x02); // Inicijuoti lcd 4 bitų darbo režimu LCD_SEND (0x28); // 2 eilutės (16X2) LCD_SEND (0x0C); // Rodyti žymeklį išjungus LCD_SEND (0x06); // Automatinio prieaugio žymeklis LCD_SEND (0x01); // Rodyti aiškų LCD_SEND (0x80); // Pirmos eilutės pirma pozicija }
Kai prijungėme LCD 4 bitų režimu su LPC2148, turime išsiųsti reikšmes, kurios bus rodomos kaip nibble by Nibble (Upper Nibble & Lower Nibble). Taigi naudojamos šios eilutės.
void LCD_DISPLAY (char * msg) // Funkcija išspausdinti simbolius, atsiųstus po vieną { uint8_t i = 0; o (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Siunčia viršutinį nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH spausdinti duomenis IO0CLR = 0x00000020; // RW LOW rašymo režimo atidėjimo laikas (2); IO0CLR = 0x00000040; // EN = 0, RS ir RW nepakitę (ty RS = 1, RW = 0) vėlavimo laikas (5); IO0PIN = ((IO0PIN ir 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Siunčia apatinį nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; vėlavimo laikas (2); IO0CLR = 0x00000040; vėlavimo laikas (5); i ++; } }
Norėdami rodyti tas ADC ir PWM reikšmes, mes naudojame šias eilutes funkcijoje int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Rodyti ADC vertės (nuo 0 iki 1023) kampas = (adcvalue / 5.7); // Formulė konvertuoti ADC vertę į kampą (o iki 180 laipsnių) LCD_SEND (0xC0); „sprintf“ (kampo vertė, „KAMPAS =%. 2f laipsnis“, kampas); LCD_DISPLAY (kampas);
Pilnas pamokos kodas ir vaizdo įrašo aprašymas pateikiami žemiau