- Servomotor
- Kontroll av servomotor med LPC2148 PWM & ADC
- PWM- och ADC-stift i ARM7-LPC2148
- Komponenter krävs
- Kretsschema och anslutningar
- Programmering ARM7-LPC2148 för servomotorstyrning
I vår tidigare handledning har vi kopplat stegmotor med ARM7-LPC2148. I denna handledning kommer vi att styra Servomotor med ARM7-LPC2148. Servomotor har låg strömförbrukningsfördel jämfört med stegmotor. En servomotor stoppar sin energiförbrukning när önskad position uppnås men stegmotorn fortsätter att förbruka kraft för att låsa upp axeln i önskat läge. Servomotorer används mest i robotprojekt på grund av deras noggrannhet och enkla hantering.
I den här handledningen lär vi oss om Servomotor och hur man gränssnitt Servo med ARM7-LPC2148. En potentiometer är också gränssnitt för att variera positionen på servomotorns axel och en LCD för att visa vinkelvärdet.
Servomotor
En servomotor är en kombination av likströmsmotor, positionskontrollsystem och växlar. Servomotorns rotation styrs genom att applicera en PWM-signal på den, PWM-signalens bredd bestämmer motorns rotationsvinkel och riktning. Här kommer vi att använda SG90 Servo Motor i denna handledning, det är en av de populäraste och billigaste. SG90 är en 180 graders servo. Så med denna servo kan vi placera axeln från 0-180 grader:
- Driftspänning: + 5V
- Växeltyp: Plast
- Rotationsvinkel: 0 till 180 grader
- Vikt: 9 gram
- Vridmoment: 2,5 kg / cm
Innan vi kan börja programmera för Servomotorn bör vi veta vilken typ av signal som ska skickas för styrning av Servomotorn. Vi bör programmera MCU: n för att skicka PWM-signaler till servomotorns signalkabel. Det finns en styrkrets inuti servomotorn som läser PWM-signalens arbetscykel och placerar servomotorns axel på respektive plats som visas på bilden nedan
Servomotorn kontrollerar pulsen för var 20: e millisekund. Så justera signalens pulsbredd för att rotera motorns axel.
- 1 ms (1 millisekund) pulsbredd för rotation av servo till 0 grader
- 1,5 ms pulsbredd för rotation till 90 grader (neutralt läge)
- 2 ms pulsbredd för rotation av servo till 180 grader.
Innan du ansluter servo till ARM7-LPC2148 kan du testa din servo med hjälp av denna servomotortestkrets. Kontrollera också hur en servomotor kan anslutas till andra mikrokontroller:
- Servomotorstyrning med Arduino
- Servomotorgränssnitt med 8051 mikrokontroller
- Servomotorstyrning med MATLAB
- Servomotorstyrning med Raspberry Pi
- Gränssnitts servomotor med MSP430G2
- Gränssnitts Servomotor med STM32F103C8
Kontroll av servomotor med LPC2148 PWM & ADC
En servomotor kan styras av LPC2148 med PWM. Genom att ge PWM-signal till SERVO PWM-stift med en period på 20 ms och frekvensen 50Hz kan vi placera servomotorns axel runt 180 grader (-90 till +90).
En potentiometer används för att variera PWM-signalens arbetscykel och rotera servomotorns axel. Denna metod implementeras med hjälp av ADC-modulen i LPC2148. Så vi behöver både PWM- och ADC-koncept implementeras i denna handledning. Så vänligen hänvisa våra tidigare handledning för att lära dig PWM och ADC i ARM7-LPC2148.
- Hur man använder PWM i ARM7-LPC2148
- Hur man använder ADC i ARM-LPLC2148
PWM- och ADC-stift i ARM7-LPC2148
Bilden nedan visar PWM- och ADC-stiften i LPC2148. Gula rutor indikerar (6) PWM-stift och svart ruta anger (14) ADC-stift.
Komponenter krävs
Hårdvara
- ARM7-LPC2148
- LCD (16x2) displaymodul
- Servomotor (SG-90)
- 3,3 V spänningsregulator
- 10k potentiometer (2 Nos)
- Bakbord
- Anslutande ledningar
programvara
- Keil uVision5
- Flash Magic Tool
Kretsschema och anslutningar
Tabellen nedan visar anslutningen mellan servomotor och ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
RÖD (+ 5V) |
+ 5V |
BRUN (GND) |
GND |
ORANGE (PWM) |
P0.1 |
Stiftet P0.1 är PWM-utgången för LPC2148.
Tabellen nedan visar kretsförbindelserna mellan LCD och ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registrera Välj) |
P0.6 |
E (Aktivera) |
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 nedan visar anslutningarna mellan ARM7 LPC2148 och potentiometer med 3,3 V spänningsregulator.
3,3 V spänningsregulator IC |
Pin-funktion |
ARM-7 LPC2148 Pin |
1. vänster stift |
- Ve från GND |
GND-stift |
2.Centre Pin |
Reglerad + 3,3 V utgång |
Till potentiometer Ingång och potentiometers utgång till P0.28 i LPC2148 |
3. höger stift |
+ Ve från 5V INMATNING |
+ 5V |
Poäng som ska noteras
1. En spänningsregulator på 3,3 V används här för att tillhandahålla ett analogt ingångsvärde till ADC-stiftet (P0.28) på LPC2148. När vi använder 5V-effekt måste vi reglera spänningen med en spänningsregulator på 3,3V.
2. En potentiometer används för att variera spänningen mellan (0V till 3,3V) för att ge analog ingång (ADC) till LPC2148-stift P0.28
3. Stift P0.1 i LPC2148 ger PWM-utgång till servomotorn för att styra motorns läge.
4. Enligt det analoga ingångsvärdet (ADC) ändras positionen för servomotorn från (0 till 180 grader) genom PWM-utgångsstift vid P0.1 i LPC2148.
Programmering ARM7-LPC2148 för servomotorstyrning
För att programmera ARM7-LPC2148 behöver vi keil uVision & Flash Magic-verktyget. Vi använder USB-kabel för att programmera ARM7 Stick via mikro-USB-port. Vi skriver kod med Keil och skapar en hex-fil och sedan blinkar HEX-filen till ARM7-stick med Flash Magic. Om du vill veta mer om installation av Keil uVision och Flash Magic och hur du använder dem följer du länken Komma igång med ARM7 LPC2148 Microcontroller och programmerar den med Keil uVision.
Steg för att konfigurera LPC2148 för PWM & ADC för att styra servomotorn
Steg 1: - Inkludera nödvändiga rubrikfiler för kodning av LPC2148
#omfatta
Steg 2: - Nästa sak är att konfigurera PLL för klockgenerering eftersom den ställer in systemklockan och den perifera klockan för LPC2148 enligt vad programmerare behöver. Den maximala klockfrekvensen för LPC2148 är 60 MHz. Följande rader används för att konfigurera PLL-klockgenerering.
void initilizePLL (void) // Funktion för att använda PLL för klockgenerering { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; medan (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Steg 3: - Nästa sak att göra är att välja PWM-stift och PWM-funktion för LPC2148 med PINSEL-registret. Vi använder PINSEL0 som vi använder P0.1 för PWM-utdata från LPC2148.
PINSEL0 - = 0x00000008; // Ställer in stift P0.1 för LPC2148 som PWM3
Steg 4: - Därefter måste vi ÅTERSTÄLLA timrarna med PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Återställ och inaktivera räknaren för PWM
Och ställ sedan in det förskalningsvärde som bestämmer att PWM: s upplösning är inställd.
PWMPR = 0x1D; // Prescale Register-värde
Steg 5: - Ställ sedan in PWMMCR (PWM match control register) när det ställer in drift som återställning, avbrott för PWMMR0 och PWMMR3.
PWMMCR = 0x00000203; // Återställ och avbryt på MR0-match, avbryt på MR3-match
Steg 6: - Den maximala perioden för PWM-kanalen ställs in med hjälp av PWMMR0 och ton för PWM-arbetscykeln är initialt inställd på 0,65 ms
PWMMR0 = 20000; // Tidsperiod för PWM-våg, 20 ms PWMMR3 = 650; // Ton av PWM-våg 0,65 msek
Steg 7: - Därefter måste vi ställa in Latch Enable till motsvarande matchregister med PWMLER
PWMLER = 0x09; // Spärraktivering för PWM3 och PWM0
(Vi använder PWMMR0 & PWMMR3) Så aktivera motsvarande bit genom att ställa in 1 i PWMLER
Steg 8: - För att aktivera PWM-utgången till stiftet måste vi använda PWMTCR för att aktivera PWM-timerräknare och PWM-lägen.
PWMPCR = 0x0800; // Enable PWM3 and PWM 0, single edge controlled PWM PWMTCR = 0x09; // Aktivera PWM och räknare
Steg 9: - Nu måste vi hämta potentiometervärdena för att ställa in PWM: s arbetscykel från ADC-stift P0.28. Så vi använder ADC-modulen i LPC2148 för att omvandla potentiometers analoga ingång (0 till 3,3 V) till ADC-värden (0 till 1023).
Steg 10: - För att välja ADC-stift P0.28 i LPC2148 använder vi
PINSEL1 = 0x01000000; // Ställa in P0.28 som ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Ställa in klocka och PDN för A / D-konvertering
Följande rader fångar den analoga ingången (0 till 3,3 V) och konverterar den till digitalt värde (0 till 1023). Och sedan delas dessa digitala värden med 4 för att konvertera dem till (0 till 255) och slutligen matas som PWM-utgång i P0.1-stift i LPC2148. Här konverterar vi värdena från 0-1023 till 0-255 genom att dela det med 4 eftersom PWM för LPC2148 har 8-bitars upplösning (28).
AD0CR - = (1 << 1); // Välj AD0.1-kanal i ADC-registerfördröjningstiden (10); AD0CR - = (1 << 24); // Starta A / D-omvandlingen medan ((AD0DR1 & (1 << 31)) == 0); // Kontrollera Klar bit i ADC- dataregisteret adcvalue = (AD0DR1 >> 6) & 0x3ff; // Få RESULTAT från ADC- dataregistret dutycycle = adcvalue / 4; // formel för att få dutycykelvärden från (0 till 255) PWMMR1 = dutycykel; // ställa in dutycykelvärde till PWM- matchregister PWMLER - = (1 << 1); // Aktivera PWM-utdata med dutycykelvärde
Steg 11: - Därefter visar vi dessa värden i LCD-skärmen (16X2). Så vi lägger till följande rader för att initialisera LCD-skärmmodulen
Ogiltig LCD_INITILIZE (ogiltig) // Funktion för att förbereda LCD-skärmen { IO0DIR = 0x0000FFF0; // Ställer in stift P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som UTGÅNGSfördröjningstid (20); LCD_SEND (0x02); // Initiera lcd i 4-bitars driftsätt LCD_SEND (0x28); // 2 rader (16X2) LCD_SEND (0x0C); // Visa på markören av LCD_SEND (0x06); // Autoinkrement- markör LCD_SEND (0x01); // Visa tydlig LCD_SEND (0x80); // Första raden första position }
När vi kopplade LCD i 4-bitars läge med LPC2148 måste vi skicka värden för att visas som nibble för nibble (Upper Nibble & Lower Nibble). Så följande rader används.
ogiltig LCD_DISPLAY (char * msg) // Funktion för att skriva ut de tecken som skickas en efter en { uint8_t i = 0; medan (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Skickar övre nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH för att skriva ut data IO0CLR = 0x00000020; // RW LOW Skrivfördröjningstid (2); IO0CLR = 0x00000040; // EN = 0, RS och RW oförändrade (dvs. RS = 1, RW = 0) fördröjningstid (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Skickar lägre nibble IO0SET = 0x00000050; // RS & EN HÖG IO0CLR = 0x00000020; fördröjning (2); IO0CLR = 0x00000040; fördröjningstid (5); i ++; } }
För att visa dessa ADC- och PWM-värden använder vi följande rader i int main () -funktionen.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycykel); LCD_DISPLAY (displayadc); // Visa ADC-värde (0 till 1023) vinkel = (adcvalue / 5.7); // Formel för att konvertera ADC-värde till vinkel (o till 180 grader) LCD_SEND (0xC0); sprintf (vinkelvärde, "ANGLE =%. 2f deg", vinkel); LCD_DISPLAY (vinkelvärde);
Komplett kod och videobeskrivning av handledningen ges nedan