- Servo motor
- Controlul servomotorului utilizând LPC2148 PWM și ADC
- Pinii PWM și ADC în ARM7-LPC2148
- Componente necesare
- Diagrama circuitului și conexiunile
- Programare ARM7-LPC2148 pentru Servo Motor Control
În tutorialul nostru anterior, am interfațat motorul pas cu pas cu ARM7-LPC2148. În acest tutorial, vom controla Servo Motor cu ARM7-LPC2148. Servomotorul are un avantaj de consum redus față de motorul pas cu pas. Un servomotor își oprește consumul de energie când se atinge poziția dorită, dar motorul pas cu pas continuă să consume energie pentru a bloca arborele în poziția dorită. Servomotorele sunt utilizate mai ales în proiecte de robotică datorită acurateței și manevrării lor ușoare.
În acest tutorial vom afla despre Servo Motor și cum se interfață Servo cu ARM7-LPC2148. Un potențiometru este, de asemenea, interfațat pentru a varia poziția arborelui servomotorului și un LCD pentru a afișa valoarea unghiului.
Servo motor
Un servomotor este o combinație de motor DC, sistem de control al poziției și angrenaje. Rotația servomotorului este controlată prin aplicarea unui semnal PWM, lățimea semnalului PWM decide unghiul de rotație și direcția motorului. Aici vom folosi SG90 Servo Motor în acest tutorial, este unul dintre cele mai populare și cele mai ieftine. SG90 este un servo de 180 de grade. Deci, cu acest servo putem poziționa axa de la 0 la 180 de grade:
- Tensiune de funcționare: + 5V
- Tip de angrenaj: Plastic
- Unghiul de rotație: 0 la 180 grade
- Greutate: 9gm
- Cuplu: 2,5 kg / cm
Înainte de a putea începe programarea pentru servomotor, ar trebui să știm ce tip de semnal trebuie trimis pentru controlul servomotorului. Ar trebui să programăm MCU pentru a trimite semnale PWM către firul de semnal al motorului Servo. Există un circuit de comandă în interiorul servomotorului care citește ciclul de funcționare al semnalului PWM și poziționează arborele servomotorelor în locul respectiv așa cum se arată în imaginea de mai jos
Pentru fiecare 20 de milisecunde Servomotorul verifică pulsul. Deci, reglați lățimea impulsului semnalului pentru a roti arborele motorului.
- Lățimea impulsului de 1 ms (1 milisecundă) pentru rotația servo la 0 grade
- 1.5ms lățime a impulsului pentru rotație la 90 de grade (poziție neutră)
- Lățimea impulsului de 2 ms pentru rotația servo la 180 de grade.
Înainte de a conecta servo la ARM7-LPC2148, puteți testa servo-ul cu ajutorul acestui circuit de testare a motorului servo. De asemenea, verificați modul în care un servomotor poate fi interfațat cu alte microcontrolere:
- Servomotor Control folosind Arduino
- Interfață servomotor cu microcontroler 8051
- Servomotor Control folosind MATLAB
- Servomotor Control cu Raspberry Pi
- Interfațarea servomotorului cu MSP430G2
- Interfațarea servomotorului cu STM32F103C8
Controlul servomotorului utilizând LPC2148 PWM și ADC
Un servomotor poate fi controlat de LPC2148 folosind PWM. Prin furnizarea semnalului PWM pinului PWM al SERVO cu o perioadă de 20ms și frecvență de 50Hz, putem poziționa arborele servomotorului în jur de 180 de grade (-90 până la +90).
Un potențiometru este utilizat pentru a varia ciclul de funcționare al semnalului PWM și pentru a roti arborele servomotorului, această metodă este implementată utilizând modulul ADC din LPC2148. Deci, avem nevoie atât de concepte PWM, cât și de ADC pentru a fi implementate în acest tutorial. Așadar, consultați cu amabilitate tutorialele noastre anterioare pentru a învăța PWM și ADC în ARM7-LPC2148.
- Cum se utilizează PWM în ARM7-LPC2148
- Cum se utilizează ADC în ARM-LPLC2148
Pinii PWM și ADC în ARM7-LPC2148
Imaginea de mai jos prezintă pinii PWM și ADC în LPC2148. Căsuțele galbene indică (6) pini PWM, iar caseta neagră indică (14) pini ADC.
Componente necesare
Hardware
- ARM7-LPC2148
- Modul de afișare LCD (16x2)
- Servomotor (SG-90)
- Regulator de tensiune 3.3V
- Potențiometru 10k (2 numere)
- Breadboard
- Conectarea firelor
Software
- Keil uVision5
- Instrument Flash Magic
Diagrama circuitului și conexiunile
Tabelul de mai jos arată conexiunea dintre servomotor și ARM7-LPC2148:
PINS SERVO |
ARM7-LPC2148 |
ROȘU (+ 5V) |
+ 5V |
MARO (GND) |
GND |
ORANGE (PWM) |
P0.1 |
Pinul P0.1 este ieșirea PWM a LPC2148.
Tabelul de mai jos prezintă conexiunile de circuit între LCD și ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Selectare înregistrare) |
P0.6 |
E (Activare) |
P0.12 |
D4 (pinul de date 4) |
P0.13 |
D5 (pinul de date 5) |
P0.14 |
D6 (pinul 6) |
P0.15 |
D7 (pinul de date 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Tabelul de mai jos prezintă conexiunile dintre ARM7 LPC2148 și potențiometru cu regulator de tensiune de 3,3V.
CI regulator de tensiune 3.3V |
Funcția Pin |
ARM-7 LPC2148 Pin |
1. Pin stânga |
- Am venit de la GND |
Pinul GND |
2. Centrul Pin |
Ieșire reglementată + 3.3V |
Pentru intrarea potențiometrului și ieșirea potențiometrului la P0.28 din LPC2148 |
3. Pinul drept |
+ Ve de la 5V INTRARE |
+ 5V |
Puncte de notat
1. Un regulator de tensiune de 3,3V este utilizat aici pentru a furniza valoarea de intrare analogică a pinului ADC (P0.28) al LPC2148. Deoarece folosim puterea de 5V, trebuie să reglăm tensiunea cu regulatorul de tensiune de 3,3V.
2. Un potențiometru este utilizat pentru a varia tensiunea între (0V până la 3,3V) pentru a furniza intrare analogică (ADC) la pinul LPC2148 P0.28
3. Pinul P0.1 al LPC2148 furnizează ieșire PWM către servomotor pentru a controla poziția motorului.
4. Conform valorii de intrare analogică (ADC), poziția servomotorului se schimbă de la (0 la 180 de grade) prin pinul de ieșire PWM la P0.1 din LPC2148.
Programare ARM7-LPC2148 pentru Servo Motor Control
Pentru a programa ARM7-LPC2148 avem nevoie de instrumentul keil uVision și Flash Magic. Folosim cablul USB pentru a programa Stick ARM7 prin port micro USB. Scriem cod folosind Keil și creăm un fișier hexagonal și apoi fișierul HEX este afișat pe stick-ul ARM7 folosind Flash Magic. Pentru a afla mai multe despre instalarea keil uVision și Flash Magic și despre modul de utilizare, urmați linkul Noțiuni introductive despre microcontrolerul ARM7 LPC2148 și programați-l folosind Keil uVision.
Pași implicați în configurarea LPC2148 pentru PWM și ADC pentru a controla servomotorul
Pasul 1: - Includeți fișierele antet necesare pentru codarea LPC2148
#include
Pasul 2: - Următorul lucru este să configurați PLL pentru generarea ceasului, deoarece setează ceasul sistemului și ceasul periferic al LPC2148, conform programatorilor. Frecvența maximă a ceasului pentru LPC2148 este de 60Mhz. Următoarele linii sunt utilizate pentru a configura generarea ceasului PLL.
void initilizePLL (void) // Funcția de a utiliza PLL pentru generarea ceasului { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Pasul 3: - Următorul lucru de făcut este să selectați pinii PWM și funcția PWM a LPC2148 utilizând registrul PINSEL. Folosim PINSEL0 așa cum folosim P0.1 pentru ieșirea PWM a LPC2148.
PINSEL0 - = 0x00000008; // Setarea pinului P0.1 din LPC2148 ca PWM3
Pasul 4: - Apoi, trebuie să RESETăm cronometrele folosind PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Resetați și dezactivați contorul pentru PWM
Și apoi setați valoarea prescalei care decide rezoluția PWM este setată.
PWMPR = 0x1D; // Valoarea Prescale Registru
Pasul 5: - Apoi, setați PWMMCR (registrul de control al potrivirii PWM), deoarece setează operațiunea cum ar fi resetarea, întreruperile pentru PWMMR0 și PWMMR3.
PWMMCR = 0x00000203; // Resetați și întrerupeți pe meciul MR0, întrerupeți pe meciul MR3
Pasul 6: - Perioada maximă a canalului PWM este setată utilizând PWMMR0 și Tonul ciclului de funcționare PWM este inițial setat la 0,65 msec
PWMMR0 = 20000; // Perioada de timp a undei PWM, 20msec PWMMR3 = 650; // Ton de undă PWM 0,65 msec
Pasul 7: - Apoi, trebuie să setăm Latch Enable la registrele de potrivire corespunzătoare utilizând PWMLER
PWMLER = 0x09; // Activare blocare pentru PWM3 și PWM0
(Folosim PWMMR0 și PWMMR3) Deci, activați bitul corespunzător setând 1 în PWMLER
Pasul 8: - Pentru a activa ieșirea PWM la pin, trebuie să folosim PWMTCR pentru activarea contoarelor PWM Timer și a modurilor PWM.
PWMPCR = 0x0800; // Activați PWM3 și PWM 0, PWM controlat cu o singură margine PWMTCR = 0x09; // Activați PWM și contorul
Pasul 9: - Acum trebuie să obținem valorile potențiometrului pentru setarea ciclului de funcționare al PWM de la pinul ADC P0.28. Deci, folosim modulul ADC în LPC2148 pentru conversia intrării analogice a potențiometrelor (0 la 3,3 V) la valorile ADC (0 la 1023).
Pasul 10: - Pentru selectarea pinului ADC P0.28 în LPC2148, folosim
PINSEL1 = 0x01000000; // Setarea P0.28 ca ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Setarea ceasului și a PDN pentru conversia A / D
Următoarele linii captează intrarea analogică (0 la 3,3 V) și o convertesc în valoare digitală (0 la 1023). Și apoi aceste valori digitale sunt împărțite la 4 pentru a le converti în (0 la 255) și în cele din urmă alimentate ca ieșire PWM în pinul P0.1 al LPC2148. Aici convertim valorile de la 0-1023 la 0-255 împărțind-o cu 4 deoarece PWM din LPC2148 are o rezoluție de 8 biți (28).
AD0CR - = (1 << 1); // Selectați canalul AD0.1 în timpul de întârziere al registrului ADC (10); AD0CR - = (1 << 24); // Începeți conversia A / D în timp ce ((AD0DR1 & (1 << 31)) == 0); // Verificați bitul DONE în registrul de date ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Obțineți REZULTATUL din registrul de date ADC dutycycle = adcvalue / 4; // formula pentru a obține valorile dutycycle de la (0 la 255) PWMMR1 = dutycycle; // setați valoarea ciclului dutycycle la registrul de potrivire PWM PWMLER - = (1 << 1); // Activați ieșirea PWM cu valoarea ciclului de lucru
Pasul 11: - Apoi, afișăm acele valori în modulul de afișare LCD (16X2). Așadar, adăugăm următoarele linii pentru a inițializa modulul de afișare LCD
Void LCD_INITILIZE (void) // Funcție pentru a pregăti ecranul LCD { IO0DIR = 0x0000FFF0; // Setează pinul P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 ca întârziere OUTPUT (20); LCD_SEND (0x02); // Inițializați lcd în modul de operare pe 4 biți LCD_SEND (0x28); // 2 linii (16X2) LCD_SEND (0x0C); // Afișare pe cursor dezactivat LCD_SEND (0x06); // Cursor auto increment LCD_SEND (0x01); // Afișează LCD_SEND clar (0x80); // Prima linie prima poziție }
Pe măsură ce conectăm ecranul LCD în modul 4 biți cu LPC2148, trebuie să trimitem valori pentru a fi afișate ca nibble by nibble (Upper Nibble & Lower Nibble). Deci se folosesc următoarele rânduri.
void LCD_DISPLAY (char * msg) // Funcția de imprimare a caracterelor trimise unul câte unul { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Trimite nibble superior IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH pentru a imprima date IO0CLR = 0x00000020; // RW LOW Timp de întârziere în scriere (2); IO0CLR = 0x00000040; // EN = 0, RS și RW neschimbate (adică RS = 1, RW = 0) întârziere (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Trimite nibble inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; întârziere (2); IO0CLR = 0x00000040; întârziere (5); i ++; } }
Pentru a afișa acele valori ADC și PWM folosim următoarele linii în funcția int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Afișați valoarea ADC (0-1023 ) unghiul = (adcvalue / 5.7); // Formula pentru a converti valoarea ADC în unghi (o la 180 grade) LCD_SEND (0xC0); sprintf (anglevalue, "ANGLE =%. 2f deg", angle); LCD_DISPLAY (anglevalue);
Codul complet și descrierea video a tutorialului sunt prezentate mai jos