- Servomotor
- Servomotor besturen met LPC2148 PWM & ADC
- PWM- en ADC-pinnen in ARM7-LPC2148
- Componenten vereist
- Schakelschema en aansluitingen
- Programmering ARM7-LPC2148 voor servomotorbesturing
In onze vorige tutorial hebben we stappenmotor gekoppeld aan ARM7-LPC2148. In deze tutorial zullen we de servomotor besturen met ARM7-LPC2148. Servomotor heeft een laag stroomverbruiksvoordeel ten opzichte van een stappenmotor. Een servomotor stopt zijn stroomverbruik wanneer de gewenste positie is bereikt, maar de stappenmotor verbruikt continu stroom om de as in de gewenste positie te vergrendelen. Servomotoren worden meestal gebruikt in robotica-projecten vanwege hun nauwkeurigheid en eenvoudige bediening.
In deze tutorial zullen we leren over Servomotor en hoe Servo te communiceren met ARM7-LPC2148. Een potentiometer is ook aangesloten om de positie van de servomotoras te variëren, en een LCD om de hoekwaarde weer te geven.
Servomotor
Een servomotor is een combinatie van gelijkstroommotor, positieregelingssysteem en tandwielen. De rotatie van de servomotor wordt geregeld door er een PWM-signaal op toe te passen, de breedte van het PWM-signaal bepaalt de rotatiehoek en richting van de motor. Hier zullen we SG90 Servomotor gebruiken in deze tutorial, het is een van de populaire en goedkoopste. SG90 is een 180 graden servo. Dus met deze servo kunnen we de as positioneren van 0-180 graden:
- Bedrijfsspanning: + 5V
- Type versnelling: kunststof
- Draaihoek: 0 tot 180 graden
- Gewicht: 9 gram
- Koppel: 2,5 kg / cm
Voordat we kunnen beginnen met programmeren voor de servomotor, moeten we weten welk type signaal moet worden verzonden voor het besturen van de servomotor. We moeten de MCU programmeren om PWM-signalen naar de signaaldraad van de servomotor te sturen. Er is een regelcircuit in de servomotor dat de werkcyclus van het PWM-signaal leest en de as van de servomotor op de respectieve plaats positioneert, zoals weergegeven in de onderstaande afbeelding
Elke 20 milliseconden controleert de servomotor de puls. Pas dus de pulsbreedte van het signaal aan om de motoras te draaien.
- 1 ms (1 milliseconde) pulsbreedte voor rotatie van servo tot 0 graden
- 1,5 ms pulsbreedte voor rotatie tot 90 graden (neutrale positie)
- 2 ms pulsbreedte voor rotatie van servo tot 180 graden.
Voordat u de servo aansluit op de ARM7-LPC2148, kunt u uw servo testen met behulp van dit servomotor-testcircuit. Bekijk ook hoe een servomotor kan worden gekoppeld aan andere microcontrollers:
- Servomotorbesturing met Arduino
- Servomotor-interface met 8051 Microcontroller
- Servomotorbesturing met MATLAB
- Servomotorbesturing met Raspberry Pi
- Koppeling van servomotor met MSP430G2
- Koppeling van servomotor met STM32F103C8
Servomotor besturen met LPC2148 PWM & ADC
Een servomotor kan worden bestuurd door LPC2148 met behulp van PWM. Door een PWM-signaal te leveren aan SERVO'S PWM-pin met een periode van 20ms en een frequentie van 50Hz, kunnen we de as van de servomotor rond 180 graden positioneren (-90 tot +90).
Een potentiometer wordt gebruikt om de duty-cycle van het PWM-signaal te variëren en de as van de servomotor te roteren, deze methode wordt geïmplementeerd met behulp van de ADC-module in LPC2148. We hebben dus zowel PWM- als ADC-concepten nodig om in deze tutorial te implementeren. Raadpleeg dus alstublieft onze vorige tutorials om PWM en ADC te leren in ARM7-LPC2148.
- Hoe PWM te gebruiken in ARM7-LPC2148
- Hoe ADC te gebruiken in ARM-LPLC2148
PWM- en ADC-pinnen in ARM7-LPC2148
De onderstaande afbeelding toont de PWM- en ADC-pinnen in LPC2148. Gele vakken geven de (6) PWM-pinnen aan en zwarte doos geeft de (14) ADC-pinnen aan.
Componenten vereist
Hardware
- ARM7-LPC2148
- LCD (16x2) weergavemodule
- Servomotor (SG-90)
- 3.3V spanningsregelaar
- 10k Potentiometer (2 nrs)
- Breadboard
- Verbindingsdraden
Software
- Keil uVision5
- Flash Magic Tool
Schakelschema en aansluitingen
De onderstaande tabel toont de verbinding tussen servomotor en ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
ROOD (+ 5V) |
+ 5V |
BRUIN (GND) |
GND |
ORANJE (PWM) |
P0.1 |
De pin P0.1 is de PWM-output van LPC2148.
De onderstaande tabel toont de circuitverbindingen tussen LCD en ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registreer selecteren) |
P0.6 |
E (inschakelen) |
P0.12 |
D4 (gegevenspin 4) |
P0.13 |
D5 (gegevenspin 5) |
P0.14 |
D6 (gegevenspin 6) |
P0.15 |
D7 (gegevenspin 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
De onderstaande tabel toont de verbindingen tussen ARM7 LPC2148 & potentiometer met 3.3V spanningsregelaar.
3.3V Spanningsregelaar IC |
Pin-functie |
ARM-7 LPC2148 Speld |
1. linker pin |
- Ve van GND |
GND-pin |
2. middelste pin |
Gereguleerde + 3.3V-uitgang |
Naar de ingang van de potentiometer en de uitgang van de potentiometer naar P0.28 van LPC2148 |
3. juiste pin |
+ Ve van 5V INVOER |
+ 5V |
Punten om op te merken
1. Een spanningsregelaar van 3,3 V wordt hier gebruikt om analoge ingangswaarde te leveren aan de ADC-pin (P0.28) van LPC2148. Omdat we 5V stroom gebruiken, moeten we de spanning regelen met een spanningsregelaar van 3.3V.
2. Een potentiometer wordt gebruikt om de spanning te variëren tussen (0V tot 3,3V) om analoge ingang (ADC) te leveren aan LPC2148 pin P0.28
3. De pin P0.1 van LPC2148 levert PWM-uitvoer naar de servomotor om de positie van de motor te regelen.
4. Volgens de waarde van de analoge ingang (ADC) verandert de positie van de servomotor van (0 tot 180 graden) via de PWM-uitgangspen op P0.1 van LPC2148.
Programmering ARM7-LPC2148 voor servomotorbesturing
Om ARM7-LPC2148 te programmeren, hebben we de tool uVision & Flash Magic nodig. We gebruiken een USB-kabel om de ARM7 Stick te programmeren via een micro-USB-poort. We schrijven code met Keil en maken een hex-bestand en vervolgens wordt het HEX-bestand met Flash Magic naar de ARM7-stick geflitst. Om meer te weten over het installeren van keil uVision en Flash Magic en hoe u ze kunt gebruiken, volgt u de link Aan de slag met ARM7 LPC2148 Microcontroller en programmeert u deze met Keil uVision.
Stappen die betrokken zijn bij het configureren van LPC2148 voor PWM & ADC om de servomotor te besturen
Stap 1: - Voeg de benodigde headerbestanden toe voor het coderen van LPC2148
# omvatten
Stap 2: - Het volgende is om de PLL te configureren voor het genereren van de klok, aangezien het de systeemklok en perifere klok van LPC2148 instelt volgens de behoeften van programmeurs. De maximale klokfrequentie voor LPC2148 is 60 MHz. De volgende regels worden gebruikt om de PLL-klokgeneratie te configureren.
void initilizePLL (void) // Functie om PLL te gebruiken voor klokgeneratie { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; terwijl (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Stap 3: - Het volgende dat u moet doen, is de PWM-pinnen en PWM-functie van LPC2148 selecteren met behulp van het PINSEL-register. We gebruiken PINSEL0 zoals we P0.1 gebruiken voor PWM-uitvoer van LPC2148.
PINSEL0 - = 0x00000008; // Pin P0.1 van LPC2148 instellen als PWM3
Stap 4: - Vervolgens moeten we de timers RESETTEN met behulp van PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Reset en deactiveer teller voor PWM
En stel vervolgens de voorverkoopwaarde in die bepaalt dat de resolutie van PWM wordt ingesteld.
PWMPR = 0x1D; // Prescale Register-waarde
Stap 5: - Stel vervolgens de PWMMCR (PWM match control register) in terwijl het de werking instelt zoals reset, interrupts voor PWMMR0 en PWMMR3.
PWMMCR = 0x00000203; // Reset en onderbreek bij MR0-overeenkomst, onderbreek bij MR3-overeenkomst
Stap 6: - De maximale periode van het PWM-kanaal wordt ingesteld met PWMMR0 en de ton van de PWM-duty cycle is aanvankelijk ingesteld op 0,65 msec
PWMMR0 = 20000; // Tijdsperiode van PWM-golf, 20 msec PWMMR3 = 650; // Ton PWM-golf 0,65 msec
Stap 7: - Vervolgens moeten we de Latch Enable instellen op de corresponderende matchregisters met PWMLER
PWMLER = 0x09; // Vergrendeling inschakelen voor PWM3 en PWM0
(We gebruiken PWMMR0 & PWMMR3) Dus schakel het corresponderende bit in door 1 in PWMLER in te stellen
Stap 8: - Om de PWM-uitvoer naar de pin in te schakelen, moeten we de PWMTCR gebruiken om de PWM-timertellers en PWM-modi in te schakelen.
PWMPCR = 0x0800; // Schakel PWM3 en PWM 0 in, enkelzijdige PWM PWMTCR = 0x09; // Schakel PWM en teller in
Stap 9: - Nu moeten we de potentiometerwaarden ophalen voor het instellen van de duty-cycle van PWM van ADC-pin P0.28. We gebruiken dus de ADC-module in LPC2148 voor het converteren van analoge ingang van potentiometers (0 tot 3,3 V) naar de ADC-waarden (0 tot 1023).
Stap 10: - Voor het selecteren van ADC-pin P0.28 in LPC2148 gebruiken we
PINSEL1 = 0x01000000; // P0.28 instellen als ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Instellen van klok en PDN voor A / D-conversie
De volgende regels leggen de analoge ingang vast (0 tot 3,3 V) en zetten deze om in digitale waarde (0 tot 1023). En dan worden deze digitale waarden gedeeld door 4 om ze om te zetten in (0 tot 255) en uiteindelijk ingevoerd als PWM-uitvoer in P0.1-pin van LPC2148. Hier converteren we de waarden van 0-1023 naar 0-255 door deze te delen door 4, aangezien PWM van LPC2148 een 8-bits resolutie heeft (28).
AD0CR - = (1 << 1); // Selecteer AD0.1-kanaal in ADC-registervertragingstijd (10); AD0CR - = (1 << 24); // Start de A / D-conversie terwijl ((AD0DR1 & (1 << 31)) == 0); // Controleer de DONE-bit in ADC-gegevensregister adcvalue = (AD0DR1 >> 6) & 0x3ff; // Haal het RESULTAAT uit ADC-gegevensregister dutycycle = adcvalue / 4; // formule om dutycycle-waarden te krijgen van (0 tot 255) PWMMR1 = dutycycle; // stel dutycycle-waarde in op PWM- matchregister PWMLER - = (1 << 1); // Schakel PWM-uitvoer in met dutycycle-waarde
Stap 11: - Vervolgens tonen we die waarden in de LCD (16X2) Display-module. Dus we voegen de volgende regels toe om de LCD-displaymodule te initialiseren
Void LCD_INITILIZE (void) // Functie om de LCD klaar te maken { IO0DIR = 0x0000FFF0; // Stelt pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 in als OUTPUT vertragingstijd (20); LCD_SEND (0x02); // Initialiseer lcd in 4-bits modus LCD_SEND (0x28); // 2 regels (16X2) LCD_SEND (0x0C); // Weergave op cursor uit LCD_SEND (0x06); // Auto increment cursor LCD_SEND (0x01); // Display duidelijk LCD_SEND (0x80); // Eerste regel eerste positie }
Omdat we LCD in 4-bit-modus met LPC2148 hebben verbonden, moeten we waarden verzenden die als nibble by nibble worden weergegeven (Upper Nibble & Lower Nibble). Dus de volgende regels worden gebruikt.
void LCD_DISPLAY (char * msg) // Functie om de verzonden tekens een voor een af te drukken { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Stuurt bovenste nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH om gegevens af te drukken IO0CLR = 0x00000020; // RW LOW Vertragingstijd schrijfmodus (2); IO0CLR = 0x00000040; // EN = 0, RS en RW ongewijzigd (dwz RS = 1, RW = 0) vertragingstijd (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Stuurt lagere nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; vertragingstijd (2); IO0CLR = 0x00000040; vertragingstijd (5); i ++; } }
Om die ADC- en PWM-waarden weer te geven, gebruiken we de volgende regels in de functie int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Weergave ADC-waarde (0 tot 1023) angle = (adcvalue / 5.7); // Formule om ADC-waarde om te zetten in hoek (o tot 180 graden) LCD_SEND (0xC0); sprintf (anglevalue, "ANGLE =%. 2f deg", hoek); LCD_DISPLAY (anglevalue);
Volledige code en videobeschrijving van de tutorial worden hieronder gegeven