- Servo Motor
- Pagkontrol sa Servo Motor gamit ang LPC2148 PWM & ADC
- Ang mga pin ng PWM at ADC sa ARM7-LPC2148
- Kinakailangan ang Mga Bahagi
- Circuit Diagram at Mga Koneksyon
- Programming ARM7-LPC2148 para sa Servo Motor Control
Sa aming nakaraang tutorial, nag-interfaced kami ng stepper motor sa ARM7-LPC2148. Sa tutorial na ito, makokontrol namin ang Servo Motor gamit ang ARM7-LPC2148. Ang servo motor ay may mababang kalamangan sa pagkonsumo ng kuryente kaysa sa stepper motor. Pinipigilan ng isang servo motor ang pagkonsumo ng kuryente nito kapag naabot ang nais na posisyon ngunit ang stepper motor ay tuluy-tuloy na ubusin ang lakas upang ma-lock ang poste sa nais na posisyon. Ang mga motor ng servo ay kadalasang ginagamit sa Mga Proyekto ng Robotiko dahil sa kanilang kawastuhan at madaling paghawak.
Sa tutorial na ito malalaman natin ang tungkol sa Servo Motor at Paano i-interface ang Servo sa ARM7-LPC2148. Ang isang potensyomiter ay din interfaced upang mag-iba ang posisyon ng baras ng servo motor, at isang LCD upang ipakita ang halaga ng anggulo.
Servo Motor
Ang Servo Motor ay isang kombinasyon ng DC motor, posisyon control system at gears. Ang pag-ikot ng servo motor ay kinokontrol ng pag-apply ng isang signal ng PWM dito, ang lapad ng signal ng PWM ay nagpapasya sa anggulo ng pag-ikot at direksyon ng motor. Dito ay gagamitin namin ang SG90 Servo Motor sa tutorial na ito, ito ay isa sa tanyag at pinakamurang. Ang SG90 ay isang 180 degree servo. Kaya sa servo na ito maaari nating iposisyon ang axis mula 0-180 degree:
- Operating Boltahe: + 5V
- Uri ng Gear: Plastik
- Angulo ng Pag-ikot: 0 hanggang 180 deg
- Timbang: 9gm
- Torque: 2.5kg / cm
Bago namin masimulan ang pag-program para sa motor ng Servo dapat nating malaman kung anong uri ng signal ang ipapadala para sa pagkontrol sa motor ng Servo. Dapat nating iprogram ang MCU upang magpadala ng mga signal ng PWM sa signal wire ng motor ng Servo. Mayroong isang control circuitry sa loob ng servo motor na binabasa ang cycle ng tungkulin ng signal ng PWM at pinoposisyon ang servo motors shaft sa kani-kanilang lugar tulad ng ipinakita sa larawan sa ibaba
Para sa bawat 20 milliseconds Servo motor ay sumusuri sa pulso. Kaya, ayusin ang lapad ng pulso ng signal upang paikutin ang poste ng motor.
- 1 ms (1 millisecond) lapad ng pulso para sa pag-ikot ng servo sa 0 degree
- 1.5ms lapad ng pulso para sa pag-ikot sa 90 degree (neutral na posisyon)
- 2 ms lapad ng pulso para sa pag-ikot ng servo hanggang 180 degree.
Bago Ikonekta ang Servo sa ARM7-LPC2148, maaari mong subukan ang iyong servo sa tulong ng Servo Motor Tester Circuit na ito. Suriin din kung paano maaaring ma-interfaced ang isang motor na servo sa iba pang mga Microcontroller:
- Servo Motor Control gamit ang Arduino
- Servo Motor Interfacing kasama ang 8051 Microcontroller
- Servo Motor Control gamit ang MATLAB
- Servo Motor Control na may Raspberry Pi
- Pag-interface ng Servo Motor sa MSP430G2
- Pag-interface ng Servo Motor na may STM32F103C8
Pagkontrol sa Servo Motor gamit ang LPC2148 PWM & ADC
Ang isang Servo Motor ay maaaring makontrol ng LPC2148 gamit ang PWM. Sa pamamagitan ng pagbibigay ng signal ng PWM sa SERVO'S PWM pin na may isang panahon ng 20ms at dalas ng 50Hz maaari naming iposisyon ang poste ng servo motor sa paligid ng 180 degree (-90 hanggang +90).
Ginagamit ang isang Potentiometer upang maiiba ang cycle ng tungkulin ng signal ng PWM at paikutin ang poste ng servo motor, ang pamamaraang ito ay ipinatupad sa pamamagitan ng paggamit ng ADC module sa LPC2148. Kaya kailangan namin ang parehong mga konsepto ng PWM at ADC upang maipatupad sa tutorial na ito. Kaya't mabait na mag-refer sa aming nakaraang mga tutorial upang malaman ang PWM at ADC sa ARM7-LPC2148.
- Paano gamitin ang PWM sa ARM7-LPC2148
- Paano gamitin ang ADC sa ARM-LPLC2148
Ang mga pin ng PWM at ADC sa ARM7-LPC2148
Ipinapakita ng imahe sa ibaba ang mga PWM at ADC na pin sa LPC2148. Ipinapahiwatig ng mga dilaw na kahon ang (6) mga PWM na pin at itim na kahon ay isinasaad ang (14) mga ADC pin.
Kinakailangan ang Mga Bahagi
Hardware
- ARM7-LPC2148
- LCD (16x2) Display Module
- Servo Motor (SG-90)
- 3.3V boltahe regulator
- 10k Potensyomiter (2 Hindi)
- Breadboard
- Mga Koneksyon sa Mga Wires
Software
- Keil uVision5
- Flash Magic Tool
Circuit Diagram at Mga Koneksyon
Ipinapakita ng talahanayan sa ibaba ang Koneksyon sa pagitan ng Servo Motor & ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
PULA (+ 5V) |
+ 5V |
BROWN (GND) |
GND |
ORANGE (PWM) |
P0.1 |
Ang pin P0.1 ay ang PWM output ng LPC2148.
Ipinapakita ng talahanayan sa ibaba ang mga koneksyon sa circuit sa pagitan ng LCD & ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Piliin ang Rehistro) |
P0.6 |
E (Paganahin) |
P0.12 |
D4 (Data pin 4) |
P0.13 |
D5 (Data pin 5) |
P0.14 |
D6 (Data pin 6) |
P0.15 |
D7 (Data pin 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Ipinapakita ng talahanayan sa ibaba ang mga koneksyon sa pagitan ng ARM7 LPC2148 at potentiometer na may 3.3V voltage regulator.
3.3V Boltahe Regulator IC |
Pag-andar ng pin |
ARM-7 LPC2148 Pin |
1. Kaliwang Pin |
- Mula sa GND |
GND pin |
2.Centre Pin |
Regulado + 3.3V Output |
Sa potentiometer Input at potentiometer's output sa P0.28 ng LPC2148 |
3. Tamang Pin |
+ Mula sa 5V INPUT |
+ 5V |
Mga Puntong Mapapansin
1. Ang isang boltahe regulator ng 3.3V ay ginagamit dito upang magbigay ng halaga ng pag-input ng analog sa ADC pin (P0.28) ng LPC2148. Habang gumagamit kami ng 5V lakas kailangan namin upang makontrol ang boltahe na may boltahe regulator ng 3.3V.
2. Ang isang Potentiometer ay ginagamit upang mag-iba ang boltahe sa pagitan ng (0V hanggang 3.3V) upang magbigay ng analog input (ADC) sa LPC2148 pin P0.28
3. Ang pin P0.1 ng LPC2148 ay nagbibigay ng output ng PWM sa servo motor upang makontrol ang posisyon ng motor.
4. Ayon sa analog input (ADC) na halaga ang posisyon ng servo motor na nagbabago mula (0 hanggang 180 degree) sa pamamagitan ng PWM output pin sa P0.1 ng LPC2148.
Programming ARM7-LPC2148 para sa Servo Motor Control
Upang Program ARM7-LPC2148 kailangan namin ng keV uVision at Flash Magic tool. Gumagamit kami ng USB Cable upang mai-program ang ARM7 Stick sa pamamagitan ng micro USB port. Nagsusulat kami ng code gamit ang Keil at lumikha ng isang hex file at pagkatapos ang HEX file ay na-flash sa ARM7 stick gamit ang Flash Magic. Upang malaman ang higit pa tungkol sa pag-install ng keil uVision at Flash Magic at kung paano gamitin ang mga ito sundin ang link na Nagsisimula Sa ARM7 LPC2148 Microcontroller at Program ito gamit ang Keil uVision.
Mga hakbang na kasangkot sa pag-configure ng LPC2148 para sa PWM & ADC upang makontrol ang Servo Motor
Hakbang 1: - Isama ang kinakailangang mga file ng header para sa pag-coding ng LPC2148
# isama
Hakbang 2: - Susunod na bagay ay upang mai - configure ang PLL para sa pagbuo ng orasan habang itinatakda nito ang system na orasan at paligid na orasan ng LPC2148 ayon sa kailangan ng bawat programmer. Ang maximum na dalas ng orasan para sa LPC2148 ay 60Mhz. Ang mga sumusunod na linya ay ginagamit upang mai-configure ang pagbuo ng orasan ng PLL.
void initilizePLL (void) // Function upang magamit ang PLL para sa pagbuo ng orasan { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; habang (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Hakbang 3: - Susunod na dapat gawin ay piliin ang mga PWM na pin at pagpapaandar ng PWM ng LPC2148 sa pamamagitan ng paggamit ng rehistro ng PINSEL. Gumagamit kami ng PINSEL0 habang gumagamit kami ng P0.1 para sa PWM output ng LPC2148.
PINSEL0 - = 0x00000008; // Ang pagtatakda ng pin P0.1 ng LPC2148 bilang PWM3
Hakbang 4: - Susunod, kailangan naming I-RESET ang mga timer gamit ang PWMTCR (Rehistro ng Timer Control).
PWMTCR = 0x02; // I-reset at huwag paganahin ang counter para sa PWM
At pagkatapos ay susunod na itakda ang prescale na halaga na magpasya ang resolusyon ng PWM ay itinakda.
PWMPR = 0x1D; // Prescale Rehistro halaga
Hakbang 5: - Susunod, itakda ang PWMMCR (rehistro ng kontrol ng tugma sa PWM) habang itinatakda nito ang pagpapatakbo tulad ng pag-reset, nakakagambala sa PWMMR0 at PWMMR3.
PWMMCR = 0x00000203; // I-reset at makagambala sa laban ng MR0, makagambala sa laban ng MR3
Hakbang 6: - Ang maximum na panahon ng PWM channel ay nakatakda gamit ang PWMMR0 at ang Ton ng PWM duty cycle ay unang itinakda sa 0.65msec
PWMMR0 = 20000; // Time period of PWM wave, 20msec PWMMR3 = 650; // Ton ng PWM alon 0.65 msec
Hakbang 7: - Susunod, kailangan naming itakda ang Latch Paganahin ang kaukulang mga rehistro ng tugma gamit ang PWMLER
PWMLER = 0x09; // Latch paganahin ang para sa PWM3 at PWM0
(Gumagamit kami ng PWMMR0 & PWMMR3) Kaya paganahin ang kaukulang bit sa pamamagitan ng pagtatakda ng 1 sa PWMLER
Hakbang 8: - Upang paganahin ang output ng PWM sa pin na kailangan namin upang magamit ang PWMTCR para sa pagpapagana ng mga counter ng PWM Timer at PWM mode.
PWMPCR = 0x0800; // Paganahin ang PWM3 at PWM 0, solong gilid na kinokontrol PWM PWMTCR = 0x09; // Paganahin ang PWM at counter
Hakbang 9: - Ngayon kailangan naming makuha ang mga halaga ng potensyomiter para sa pagtatakda ng cycle ng tungkulin ng PWM mula sa ADC pin P0.28. Kaya, ginagamit namin ang module ng ADC sa LPC2148 para sa pag-convert ng potentiometers analog input (0 hanggang 3.3V) sa mga halaga ng ADC (0 hanggang 1023).
Hakbang 10: - Para sa pagpili ng ADC pin P0.28 sa LPC2148, ginagamit namin
PINSEL1 = 0x01000000; // Setting P0.28 as ADC INPUT AD0CR = ((((14) << 8) - (1 << 21)); // Ang pagtatakda ng orasan at PDN para sa A / D Conversion
Kinukuha ng mga sumusunod na linya ang input ng Analog (0 hanggang 3.3V) at ginawang digital na halaga (0 hanggang 1023). At pagkatapos ang mga halagang digital na ito ay nahahati sa 4 upang i-convert ang mga ito sa (0 hanggang 255) at sa wakas ay pinakain bilang PWM output sa P0.1 pin ng LPC2148. Narito namin ang pag-convert ng mga halaga mula 0-1023 hanggang 0-255 sa pamamagitan ng paghahati nito sa 4 dahil ang PWM ng LPC2148 ay may resolusyon na 8-Bit (28).
AD0CR - = (1 << 1); // Piliin ang AD0.1 channel sa pagkaantala ng pagrehistro ng ADC (10); AD0CR - = (1 << 24); // Start the A / D conversion habang ((AD0DR1 & (1 << 31)) == 0); // Check the DONE bit in ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Kunin ang RESULTA mula sa rehistro ng data ng ADC dutycycle = adcvalue / 4; // formula upang makakuha ng mga halaga ng dutycycle mula sa (0 hanggang 255) PWMMR1 = dutycycle; // itakda ang halaga ng dutycycle sa PWM match register PWMLER - = (1 << 1); // Paganahin ang output ng PWM na may halaga ng dutycycle
Hakbang 11: - Susunod, ipinapakita namin ang mga halagang iyon sa LCD (16X2) na module ng pagpapakita. Kaya idinagdag namin ang mga sumusunod na linya upang gawing simula ang module ng pagpapakita ng LCD
I-void ang LCD_INITILIZE (walang bisa) // Function upang maihanda ang LCD { IO0DIR = 0x0000FFF0; // Nagtatakda ng pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 bilang OUTPUT na pagkaantala (20); LCD_SEND (0x02); // Initialize lcd sa 4-bit mode ng operasyon LCD_SEND (0x28); // 2 lines (16X2) LCD_SEND (0x0C); // Display on cursor off LCD_SEND (0x06); // Auto increment cursor LCD_SEND (0x01); // Ipakita ang malinaw na LCD_SEND (0x80); // First line first posisyon }
Tulad ng pagkonekta namin sa LCD sa 4-Bit mode sa LPC2148 kailangan naming magpadala ng mga halagang maipapakita bilang nibble ng nibble (Upper Nibble & Lower Nibble). Kaya ang mga sumusunod na linya ay ginagamit.
walang bisa ang LCD_DISPLAY (char * msg) // Function upang mai-print ang mga character na isa-isang ipinadala { uint8_t i = 0; habang (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Nagpadala ng Itaas na nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH to print data IO0CLR = 0x00000020; // RW LOW Sumulat mode mode pagkaantala (2); IO0CLR = 0x00000040; // EN = 0, RS at RW hindi nagbago (ie RS = 1, RW = 0) oras ng pagkaantala (5); IO0PIN = (((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Nagpapadala ng Mas mababang nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; oras ng pagkaantala (2); IO0CLR = 0x00000040; pagkaantala (5); ako ++; } }
Upang maipakita ang mga halagang ADC & PWM na ginagamit namin ang mga sumusunod na linya sa int pangunahing () pagpapaandar.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Ipakita ang halaga ng ADC (0 hanggang 1023) anggulo = (adcvalue / 5.7); // Formula upang i-convert ang halaga ng ADC sa anggulo (o hanggang 180 deg) LCD_SEND (0xC0); sprintf (anggulovalue, "ANGLE =%. 2f deg", anggulo); LCD_DISPLAY (anggulovalue);
Ang kumpletong paglalarawan ng code at video ng tutorial ay ibinibigay sa ibaba