- Servomotor
- Styring af servomotor ved hjælp af LPC2148 PWM & ADC
- PWM- og ADC-ben i ARM7-LPC2148
- Komponenter, der kræves
- Kredsløbsdiagram og forbindelser
- Programmering ARM7-LPC2148 til servomotorstyring
I vores tidligere tutorial har vi interfacet trinmotor med ARM7-LPC2148. I denne vejledning styrer vi Servomotor med ARM7-LPC2148. Servomotor har et lavt strømforbrug fordel i forhold til trinmotor. En servomotor standser sit strømforbrug, når den ønskede position er nået, men trinmotoren fortsætter med at forbruge strøm for at låse akslen i ønsket position. Servomotorer bruges for det meste i robotprojekter på grund af deres nøjagtighed og nem håndtering.
I denne vejledning lærer vi om Servo Motor og Sådan interface Servo med ARM7-LPC2148. Et potentiometer er også grænseflade for at variere placeringen af servomotorens aksel og et LCD-display for at vise vinkelværdien.
Servomotor
En servomotor er en kombination af jævnstrømsmotor, positionskontrolsystem og gear. Servomotorens rotation styres ved at anvende et PWM-signal til det, bredden af PWM-signalet bestemmer motorens rotationsvinkel og retning. Her bruger vi SG90 Servo Motor i denne vejledning, det er en af de populære og billigste. SG90 er en 180 graders servo. Så med denne servo kan vi placere aksen fra 0-180 grader:
- Driftsspænding: + 5V
- Geartype: Plastik
- Rotationsvinkel: 0 til 180 grader
- Vægt: 9 g
- Moment: 2,5 kg / cm
Før vi kan begynde at programmere for Servomotoren, skal vi vide, hvilken type signal der skal sendes til styring af Servomotoren. Vi skal programmere MCU'en til at sende PWM-signaler til servomotorens signalkabel. Der er et kontrolkredsløb inde i servomotoren, der læser PWM-signalets driftscyklus og placerer servomotorakslen på det respektive sted som vist på billedet nedenfor
Servomotor kontrollerer pulsen for hver 20 millisekunder. Så juster signalets pulsbredde for at rotere motorens aksel.
- 1 ms (1 millisekund) pulsbredde til rotation af servo til 0 grad
- 1,5 ms pulsbredde til rotation til 90 grader (neutral position)
- 2 ms pulsbredde til rotation af servo til 180 grader.
Inden du tilslutter servo til ARM7-LPC2148, kan du teste din servo ved hjælp af dette servomotortesterkredsløb. Kontroller også, hvordan en servomotor kan forbindes med andre mikrocontrollere:
- Servomotorstyring ved hjælp af Arduino
- Servomotorgrænseflade med 8051 mikrokontroller
- Servomotorstyring ved hjælp af MATLAB
- Servomotorstyring med Raspberry Pi
- Interfacing Servomotor med MSP430G2
- Interfacing servomotor med STM32F103C8
Styring af servomotor ved hjælp af LPC2148 PWM & ADC
En servomotor kan styres af LPC2148 ved hjælp af PWM. Ved at give PWM-signal til SERVO'S PWM-pin med en periode på 20 ms og frekvens på 50Hz kan vi placere akslen på servomotoren omkring 180 grader (-90 til +90).
Et potentiometer bruges til at variere PWM-signalets arbejdscyklus og dreje servomotorens aksel. Denne metode implementeres ved hjælp af ADC-modulet i LPC2148. Så vi har brug for både PWM- og ADC-koncepter, der skal implementeres i denne vejledning. Så venligst henvis vores tidligere tutorials for at lære PWM og ADC i ARM7-LPC2148.
- Sådan bruges PWM i ARM7-LPC2148
- Sådan bruges ADC i ARM-LPLC2148
PWM- og ADC-ben i ARM7-LPC2148
Billedet nedenfor viser PWM- og ADC-benene i LPC2148. Gule kasser angiver (6) PWM-ben og sort boks angiver (14) ADC-ben.
Komponenter, der kræves
Hardware
- ARM7-LPC2148
- LCD (16x2) displaymodul
- Servomotor (SG-90)
- 3,3 V spændingsregulator
- 10k Potentiometer (2 Nos)
- Brødbræt
- Tilslutning af ledninger
Software
- Keil uVision5
- Flash Magic Tool
Kredsløbsdiagram og forbindelser
Tabellen nedenfor viser forbindelsen mellem servomotor og ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
RØD (+ 5V) |
+ 5V |
BRUN (GND) |
GND |
ORANGE (PWM) |
P0.1 |
Stiften P0.1 er PWM-output fra LPC2148.
Tabellen nedenfor viser kredsløbsforbindelserne mellem LCD og ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registrer Vælg) |
P0.6 |
E (Aktiver) |
P0.12 |
D4 (datapind 4) |
P0.13 |
D5 (Data pin 5) |
P0.14 |
D6 (datapind 6) |
P0.15 |
D7 (datapind 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Nedenstående tabel viser forbindelserne mellem ARM7 LPC2148 og potentiometer med 3,3 V spændingsregulator.
3,3 V spændingsregulator IC |
Pin-funktion |
ARM-7 LPC2148 Pin |
1. venstre pin |
- Ve fra GND |
GND-pin |
2. centrum pin |
Reguleret + 3,3 V udgang |
Til potentiometer Input og potentiometer's output til P0.28 i LPC2148 |
3. højre pin |
+ Ve fra 5V INDGANG |
+ 5V |
Punkter, der skal bemærkes
1. En spændingsregulator på 3,3 V anvendes her til at give den analoge indgangsværdi til ADC-stiften (P0.28) på LPC2148. Da vi bruger 5V strøm, skal vi regulere spændingen med en spændingsregulator på 3,3V.
2. Et potentiometer bruges til at variere spændingen mellem (0V til 3,3V) for at levere analog indgang (ADC) til LPC2148 pin P0.28
3. Stiften P0.1 i LPC2148 giver PWM-output til servomotoren for at styre motorens position.
4. I henhold til den analoge indgangsværdi (ADC) ændres positionen på servomotoren fra (0 til 180 grader) gennem PWM-udgangsstift ved P0.1 i LPC2148.
Programmering ARM7-LPC2148 til servomotorstyring
For at programmere ARM7-LPC2148 har vi brug for keil uVision & Flash Magic værktøj. Vi bruger USB-kabel til at programmere ARM7 Stick via mikro-USB-port. Vi skriver kode ved hjælp af Keil og opretter en hex-fil, og derefter blinkes HEX-filen til ARM7-stick ved hjælp af Flash Magic. Hvis du vil vide mere om installation af keil uVision og Flash Magic, og hvordan du bruger dem, skal du følge linket Kom godt i gang med ARM7 LPC2148 Microcontroller og programmer det ved hjælp af Keil uVision.
Trin involveret i konfiguration af LPC2148 til PWM & ADC til styring af servomotoren
Trin 1: - Inkluder de nødvendige headerfiler til kodning af LPC2148
#omfatte
Trin 2: - Næste ting er at konfigurere PLL til urgenerering, da den indstiller systemuret og det perifere ur på LPC2148 efter programmeringens behov. Den maksimale urfrekvens for LPC2148 er 60 MHz. Følgende linjer bruges til at konfigurere PLL-urgenerering.
ugyldigt initilizePLL (ugyldigt) // Funktion til brug af PLL til urgenerering { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; mens (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Trin 3: - Næste ting at gøre er at vælge PWM-ben og PWM-funktion af LPC2148 ved hjælp af PINSEL-register. Vi bruger PINSEL0, som vi bruger P0.1 til PWM-output på LPC2148.
PINSEL0 - = 0x00000008; // Indstilling af pin P0.1 i LPC2148 som PWM3
Trin 4: - Derefter skal vi NULSTILLE timerne ved hjælp af PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Nulstil og deaktiver tæller for PWM
Indstil derefter den forudskalningsværdi, der bestemmer, at opløsningen af PWM er indstillet.
PWMPR = 0x1D; // Værdi for prescale-register
Trin 5: - Indstil derefter PWMMCR (PWM match control register), da det indstiller operation som reset, afbrydelser for PWMMR0 og PWMMR3.
PWMMCR = 0x00000203; // Nulstil og afbryd på MR0-kamp, afbryd på MR3-kamp
Trin 6: - Den maksimale periode for PWM-kanalen indstilles ved hjælp af PWMMR0, og ton af PWM-driftscyklus er oprindeligt indstillet til 0,65 msek.
PWMMR0 = 20000; // Tidsperiode for PWM-bølge, 20 ms PWMMR3 = 650; // Ton af PWM-bølge 0,65 msek
Trin 7: - Derefter skal vi indstille Latch Enable til de tilsvarende matchregistre ved hjælp af PWMLER
PWMLER = 0x09; // Lås muliggør PWM3 og PWM0
(Vi bruger PWMMR0 & PWMMR3) Så aktiver den tilsvarende bit ved at indstille 1 i PWMLER
Trin 8: - For at aktivere PWM-output til stiften skal vi bruge PWMTCR til at aktivere PWM-timertællere og PWM-tilstande.
PWMPCR = 0x0800; // Aktivér PWM3 og PWM 0, enkelt kantstyret PWM PWMTCR = 0x09; // Aktivér PWM og tæller
Trin 9: - Nu skal vi hente potentiometerværdierne til indstilling af PWM's driftscyklus fra ADC-pin P0.28. Så vi bruger ADC-modul i LPC2148 til at konvertere potentiometre analog input (0 til 3,3 V) til ADC-værdier (0 til 1023).
Trin 10: - Til valg af ADC-pin P0.28 i LPC2148 bruger vi
PINSEL1 = 0x01000000; // Indstilling af P0.28 som ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Indstilling af ur og PDN til A / D-konvertering
Følgende linjer fanger den analoge indgang (0 til 3,3 V) og konverterer den til digital værdi (0 til 1023). Og så deles disse digitale værdier med 4 for at konvertere dem til (0 til 255) og til sidst tilføres som PWM-output i P0.1-pin i LPC2148. Her konverterer vi værdierne fra 0-1023 til 0-255 ved at dividere den med 4, da PWM af LPC2148 har 8-bit opløsning (28).
AD0CR - = (1 << 1); // Vælg AD0.1-kanal i ADC-registerets forsinkelsestid (10); AD0CR - = (1 << 24); // Start A / D-konvertering mens ((AD0DR1 & (1 << 31)) == 0); // Kontroller DONE bit i ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Få RESULTATET fra ADC-dataregisteret dutycycle = adcvalue / 4; // formel for at få dutycycle-værdier fra (0 til 255) PWMMR1 = dutycycle; // indstil dutycycle-værdi til PWM- matchregister PWMLER - = (1 << 1); // Aktiver PWM-output med dutycykelværdi
Trin 11: - Dernæst viser vi disse værdier i LCD-modulet (16X2). Så vi tilføjer følgende linjer for at initialisere LCD-displaymodulet
Ugyldig LCD_INITILIZE (ugyldig) // Funktion for at gøre klar LCD { IO0DIR = 0x0000FFF0; // Indstiller pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som OUTPUT forsinkelsestid (20); LCD_SEND (0x02); // Initialiser lcd i 4-bit driftstilstand LCD_SEND (0x28); // 2 linjer (16X2) LCD_SEND (0x0C); // Vis på markør fra LCD_SEND (0x06); // Auto stigning markør LCD_SEND (0x01); // Vis klar LCD_SEND (0x80); // Første linje første position }
Da vi forbandt LCD i 4-bit tilstand med LPC2148, skal vi sende værdier, der skal vises som nibble for nibble (Upper Nibble & Lower Nibble). Så følgende linjer bruges.
ugyldigt LCD_DISPLAY (char * msg) // Funktion til at udskrive de tegn, der sendes en efter en { uint8_t i = 0; mens (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Sender øvre nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH for at udskrive data IO0CLR = 0x00000020; // RW LOW Skriveforsinkelsestid (2); IO0CLR = 0x00000040; // EN = 0, RS og RW uændret (dvs. RS = 1, RW = 0) forsinkelsestid (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Sender nedre nibble IO0SET = 0x00000050; // RS & EN HØJ IO0CLR = 0x00000020; forsinkelsestid (2); IO0CLR = 0x00000040; forsinkelsestid (5); i ++; } }
For at vise disse ADC & PWM-værdier bruger vi følgende linjer i int main () -funktionen.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Vis ADC-værdi (0 til 1023) vinkel = (adcvalue / 5.7); // Formel til at konvertere ADC-værdi til vinkel (o til 180 grader) LCD_SEND (0xC0); sprintf (vinkelværdi, "ANGLE =%. 2f deg", vinkel); LCD_DISPLAY (vinkelværdi);
Komplet kode og videobeskrivelse af vejledningen er angivet nedenfor