- Servo motor
- Styring av servomotor ved bruk av LPC2148 PWM & ADC
- PWM- og ADC-pinner i ARM7-LPC2148
- Komponenter kreves
- Kretsdiagram og tilkoblinger
- Programmering ARM7-LPC2148 for servomotorstyring
I vår forrige opplæring har vi koblet trinnmotor til ARM7-LPC2148. I denne opplæringen vil vi kontrollere Servomotor med ARM7-LPC2148. Servomotor har lavt strømforbruk fordel i forhold til trinnmotor. En servomotor stopper strømforbruket når ønsket posisjon er nådd, men trinnmotoren bruker kontinuerlig strøm for å låse akselen i ønsket posisjon. Servomotorer brukes mest i robotprosjekter på grunn av nøyaktighet og enkel håndtering.
I denne opplæringen vil vi lære om Servo Motor og hvordan du kan interface Servo med ARM7-LPC2148. Et potensiometer er også grensesnitt for å variere posisjonen til servomotorens aksel, og en LCD for å vise vinkelverdien.
Servo motor
En servomotor er en kombinasjon av likestrømsmotor, posisjonskontrollsystem og gir. Servomotorens rotasjon styres ved å påføre et PWM-signal på den, bredden på PWM-signalet bestemmer motorens rotasjonsvinkel og retning. Her skal vi bruke SG90 Servo Motor i denne opplæringen, den er en av de populære og billigste. SG90 er en 180 graders servo. Så med denne servoen kan vi plassere aksen fra 0-180 grader:
- Driftsspenning: + 5V
- Girtype: Plast
- Rotasjonsvinkel: 0 til 180 grader
- Vekt: 9 gram
- Dreiemoment: 2,5 kg / cm
Før vi kan begynne å programmere for Servomotoren, bør vi vite hvilken type signal som skal sendes for å kontrollere Servomotoren. Vi bør programmere MCU for å sende PWM-signaler til signalledningen til servomotoren. Det er en kontrollkrets inni servomotoren som leser PWM-signalets driftssyklus og posisjonerer servomotorakselen på det respektive stedet som vist på bildet nedenfor
For hver 20. millisekund sjekker Servomotor pulsen. Juster derfor pulsbredden til signalet for å rotere motorakselen.
- 1 ms (1 millisekund) pulsbredde for rotasjon av servo til 0 grader
- 1,5 ms pulsbredde for rotasjon til 90 grader (nøytral posisjon)
- 2 ms pulsbredde for rotasjon av servo til 180 grader.
Før du kobler servo til ARM7-LPC2148, kan du teste servoen din ved hjelp av denne servomotortesterkretsen. Sjekk også hvordan en servomotor kan kobles til andre mikrokontrollere:
- Servomotorstyring ved hjelp av Arduino
- Servomotorgrensesnitt med 8051 mikrokontroller
- Servomotorstyring ved bruk av MATLAB
- Servomotorstyring med Raspberry Pi
- Grensesnitt Servomotor med MSP430G2
- Grensesnitt Servomotor med STM32F103C8
Styring av servomotor ved bruk av LPC2148 PWM & ADC
En servomotor kan styres av LPC2148 ved bruk av PWM. Ved å gi PWM-signal til SERVO'S PWM-pinne med en periode på 20ms og frekvens på 50Hz, kan vi plassere akselen til servomotoren rundt 180 grader (-90 til +90).
Et potensiometer brukes til å variere driftssyklusen til PWM-signalet og rotere servomotorens aksel. Denne metoden er implementert ved bruk av ADC-modulen i LPC2148. Så vi trenger både PWM- og ADC-konsepter som skal implementeres i denne opplæringen. Så vennligst referer til våre tidligere veiledninger for å lære PWM og ADC i ARM7-LPC2148.
- Hvordan bruke PWM i ARM7-LPC2148
- Hvordan bruke ADC i ARM-LPLC2148
PWM- og ADC-pinner i ARM7-LPC2148
Bildet nedenfor viser PWM- og ADC-pinnene i LPC2148. Gule bokser indikerer (6) PWM-pinner, og svart boks indikerer (14) ADC-pinner.
Komponenter kreves
Maskinvare
- ARM7-LPC2148
- LCD (16x2) skjermmodul
- Servomotor (SG-90)
- 3,3V spenningsregulator
- 10k potensiometer (2 nr)
- Brettbrett
- Koble ledninger
Programvare
- Keil uVision5
- Flash Magic Tool
Kretsdiagram og tilkoblinger
Tabellen nedenfor viser forbindelsen mellom servomotor og ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
RØD (+ 5V) |
+ 5V |
BRUN (GND) |
GND |
ORANGE (PWM) |
P0.1 |
Pinnen P0.1 er PWM-utgangen til LPC2148.
Tabellen nedenfor viser kretsforbindelsene mellom LCD og ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Aktiver) |
P0.12 |
D4 (datapinne 4) |
P0.13 |
D5 (datapinne 5) |
P0.14 |
D6 (datapinne 6) |
P0.15 |
D7 (datapinne 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Tabellen nedenfor viser forbindelsene mellom ARM7 LPC2148 og potensiometer med 3,3 V spenningsregulator.
3,3V spenningsregulator IC |
Pin-funksjon |
ARM-7 LPC2148 Pin |
1. venstre pin |
- Ve fra GND |
GND-pinne |
2. sentrum pin |
Regulert + 3.3V utgang |
Til potensiometer Inngang og potensiometer utgang til P0.28 i LPC2148 |
3. høyre pin |
+ Ve fra 5V INNGANG |
+ 5V |
Poeng å merke seg
1. En spenningsregulator på 3,3 V brukes her for å gi analog inngangsverdi til ADC-pinnen (P0.28) på LPC2148. Når vi bruker 5V strøm, må vi regulere spenningen med en spenningsregulator på 3,3V.
2. Et potensiometer brukes til å variere spenningen mellom (0V til 3,3V) for å gi analog inngang (ADC) til LPC2148 pin P0.28
3. Pinnen P0.1 til LPC2148 gir PWM-utgang til servomotoren for å kontrollere posisjonen til motoren.
4. I henhold til den analoge inngangsverdien (ADC) endres posisjonen til servomotoren fra (0 til 180 grader) gjennom PWM-utgangspinnen ved P0.1 i LPC2148.
Programmering ARM7-LPC2148 for servomotorstyring
For å programmere ARM7-LPC2148 trenger vi keil uVision & Flash Magic verktøy. Vi bruker USB-kabel til å programmere ARM7 Stick via mikro-USB-port. Vi skriver kode ved hjelp av Keil og lager en hex-fil, og deretter blinkes HEX-filen til ARM7-pinne ved hjelp av Flash Magic. Hvis du vil vite mer om å installere keil uVision og Flash Magic og hvordan du bruker dem, kan du følge lenken Komme i gang med ARM7 LPC2148 Microcontroller og programmere den ved hjelp av Keil uVision.
Trinn involvert i å konfigurere LPC2148 for PWM & ADC for å kontrollere servomotoren
Trinn 1: - Inkluder de nødvendige headerfilene for koding av LPC2148
#inkludere
Trinn 2: - Neste ting er å konfigurere PLL for klokkegenerering ettersom den stiller inn systemklokken og den perifere klokken til LPC2148 etter hvert som programmerere trenger. Maksimal klokkefrekvens for LPC2148 er 60Mhz. Følgende linjer brukes til å konfigurere PLL-klokkegenerering.
void initilizePLL (void) // Funksjon for å bruke PLL for klokkegenerering { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; mens (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Trinn 3: - Neste ting å gjøre er å velge PWM-pinner og PWM-funksjonen til LPC2148 ved å bruke PINSEL-registeret. Vi bruker PINSEL0 som vi bruker P0.1 for PWM-utgang fra LPC2148.
PINSEL0 - = 0x00000008; // Innstilling av pinne P0.1 til LPC2148 som PWM3
Trinn 4: - Deretter må vi NULLSTILL timerne ved hjelp av PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Tilbakestill og deaktiver teller for PWM
Og sett deretter neste forhåndsskalaverdi som bestemmer at oppløsningen til PWM er satt.
PWMPR = 0x1D; // Prescale Register-verdi
Trinn 5: - Sett deretter PWMMCR (PWM match control register) når det setter drift som tilbakestilling, avbryter for PWMMR0 og PWMMR3.
PWMMCR = 0x00000203; // Tilbakestill og avbryt på MR0-kamp, avbryt på MR3-kamp
Trinn 6: - Maksimumsperioden for PWM-kanalen stilles inn ved bruk av PWMMR0 og Ton av PWM-driftssyklusen er innledningsvis satt til 0,65 msek.
PWMMR0 = 20000; // Tidsperiode for PWM-bølge, 20 ms PWMMR3 = 650; // Ton av PWM-bølge 0,65 msek
Trinn 7: - Deretter må vi sette Latch Enable til de tilsvarende kampregistrene ved hjelp av PWMLER
PWMLER = 0x09; // Låseaktivering for PWM3 og PWM0
(Vi bruker PWMMR0 og PWMMR3) Så aktiver den tilsvarende biten ved å sette 1 i PWMLER
Trinn 8: - For å aktivere PWM-utgangen til pinnen, må vi bruke PWMTCR for å aktivere PWM Timer-tellere og PWM-modus.
PWMPCR = 0x0800; // Aktiver PWM3 og PWM 0, enkeltkantstyrt PWM PWMTCR = 0x09; // Aktiver PWM og teller
Trinn 9: - Nå må vi hente potensiometerverdiene for å stille PWM-driftssyklus fra ADC-pinne P0.28. Så vi bruker ADC-modulen i LPC2148 for å konvertere potensiometre analog inngang (0 til 3,3 V) til ADC-verdiene (0 til 1023).
Trinn 10: - For å velge ADC-pinne P0.28 i LPC2148, bruker vi
PINSEL1 = 0x01000000; // Innstilling av P0.28 som ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Innstilling av klokke og PDN for A / D-konvertering
Følgende linjer fanger den analoge inngangen (0 til 3,3 V) og konverterer den til digital verdi (0 til 1023). Og så deles disse digitale verdiene med 4 for å konvertere dem til (0 til 255) og til slutt mates som PWM-utgang i P0.1-pinne på LPC2148. Her konverterer vi verdiene fra 0-1023 til 0-255 ved å dele den med 4 da PWM på LPC2148 har 8-biters oppløsning (28).
AD0CR - = (1 << 1); // Velg AD0.1-kanal i ADC-registerforsinkelsestid (10); AD0CR - = (1 << 24); // Start A / D-konvertering mens ((AD0DR1 & (1 << 31)) == 0); // Sjekk FERDIG bit i ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Få RESULTATET fra ADC-dataregisteret dutycycle = adcvalue / 4; // formel for å få dutycycle-verdier fra (0 til 255) PWMMR1 = dutycycle; // sett tollsyklusverdi til PWM matchregister PWMLER - = (1 << 1); // Aktiver PWM-utgang med dutyycle-verdi
Trinn 11: - Deretter viser vi disse verdiene i LCD-modulen (16X2). Så vi legger til følgende linjer for å initialisere LCD-skjermmodulen
Ugyldig LCD_INITILIZE (ugyldig) // Funksjon for å gjøre klar LCD-skjermen { IO0DIR = 0x0000FFF0; // Stiller pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som UTGANG forsinkelsestid (20); LCD_SEND (0x02); // Initier lcd i 4-biters modus LCD_SEND (0x28); // 2 linjer (16X2) LCD_SEND (0x0C); // Vis på markøren av LCD_SEND (0x06); // Automatisk økningsmarkør LCD_SEND (0x01); // Vis klar LCD_SEND (0x80); // Første linje førsteplass }
Da vi koblet LCD i 4-biters modus med LPC2148, må vi sende verdier som skal vises som nibble for nibble (Upper Nibble & Lower Nibble). Så følgende linjer brukes.
ugyldig LCD_DISPLAY (char * msg) // Funksjon for å skrive ut tegnene som sendes en etter en { uint8_t i = 0; mens (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Sender Upper nibble IO0SET = 0x00000050; // RS HIGH & AKTIVER HIGH for å skrive ut data IO0CLR = 0x00000020; // RW LOW Skrivemodus forsinkelsestid (2); IO0CLR = 0x00000040; // EN = 0, RS og RW uendret (dvs. RS = 1, RW = 0) forsinkelsestid (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Sender nedre knabb IO0SET = 0x00000050; // RS & EN HØY IO0CLR = 0x00000020; forsinkelsestid (2); IO0CLR = 0x00000040; forsinkelsestid (5); i ++; } }
For å vise disse ADC- og PWM-verdiene bruker vi følgende linjer i int main () -funksjonen.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Vis ADC-verdi (0 til 1023) vinkel = (adcvalue / 5.7); // Formel for å konvertere ADC-verdi til vinkel (o til 180 grader) LCD_SEND (0xC0); sprintf (vinkelverdi, "ANGLE =%. 2f deg", vinkel); LCD_DISPLAY (vinkelverdi);
Fullstendig kode og videobeskrivelse av opplæringen er gitt nedenfor