- Servo motor
- Ovládanie servomotora pomocou LPC2148 PWM a ADC
- PWM a ADC piny v ARM7-LPC2148
- Súčasti sú povinné
- Schéma zapojenia a zapojenia
- Programovanie ARM7-LPC2148 pre riadenie servomotora
V našom predchádzajúcom tutoriáli sme prepojili krokový motor s ARM7-LPC2148. V tomto výučbe budeme ovládať servomotor s ARM7-LPC2148. Servomotor má oproti krokovému motoru výhodu nízkej spotreby energie. Servomotor zastaví svoju spotrebu energie, keď sa dosiahne požadovaná poloha, ale krokový motor nepretržite spotrebúva energiu na zablokovanie hriadeľa v požadovanej polohe. Servomotory sa v robotických projektoch používajú väčšinou pre ich presnosť a ľahkú manipuláciu.
V tomto výučbe sa dozvieme o servomotore a spôsobe prepojenia servo s ARM7-LPC2148. Je tiež zapojený potenciometer na zmenu polohy hriadeľa servomotora a LCD na zobrazenie hodnoty uhla.
Servo motor
Servomotor je kombináciou jednosmerného motora, systému riadenia polohy a prevodových stupňov. Otáčanie servomotora je riadené aplikovaním signálu PWM, šírka signálu PWM určuje uhol a smer otáčania motora. Tu budeme v tomto návode používať servomotor SG90, je to jeden z populárnych a najlacnejších. SG90 je 180 stupňové servo. Takže pomocou tohto serva môžeme polohovať os od 0 do 180 stupňov:
- Prevádzkové napätie: + 5V
- Typ prevodovky: plast
- Uhol natočenia: 0 až 180 stupňov
- Hmotnosť: 9gm
- Krútiaci moment: 2,5 kg / cm
Predtým, ako začneme programovať pre servomotor, mali by sme vedieť, aký typ signálu sa má poslať na riadenie servomotora. Mali by sme naprogramovať MCU tak, aby odosielal signály PWM na signálny vodič servomotora. Vo vnútri servomotora je riadiaci obvod, ktorý sníma pracovný cyklus signálu PWM a polohuje hriadeľ servomotorov na príslušné miesto, ako je to znázornené na obrázku nižšie.
Každých 20 milisekúnd servomotor kontroluje impulz. Upravte teda šírku impulzu signálu tak, aby sa otáčal hriadeľ motora.
- Šírka impulzu 1 ms (1 milisekunda) pre otočenie serva na 0 stupňov
- Šírka impulzu 1,5 ms pre rotáciu na 90 stupňov (neutrálna poloha)
- 2 ms šírka impulzu pre otočenie serva na 180 stupňov.
Pred pripojením serva k ARM7-LPC2148 môžete svoje servo otestovať pomocou tohto testovacieho obvodu servomotora. Skontrolujte tiež, ako je možné prepojiť servomotor s inými mikrokontrolérmi:
- Ovládanie servomotora pomocou Arduina
- Prepojenie servomotorov s mikrokontrolérom 8051
- Ovládanie servomotora pomocou MATLABu
- Ovládanie servomotora s Raspberry Pi
- Prepojenie servomotora s MSP430G2
- Prepojovací servomotor s STM32F103C8
Ovládanie servomotora pomocou LPC2148 PWM a ADC
Servomotor je možné ovládať pomocou LPC2148 pomocou PWM. Poskytnutím signálu PWM na pin PWM SERVO s periódou 20 ms a frekvenciou 50 Hz môžeme umiestniť hriadeľ servomotora okolo 180 stupňov (-90 až +90).
Potenciometer sa používa na zmenu pracovného cyklu signálu PWM a na otáčanie hriadeľa servomotora. Táto metóda je implementovaná pomocou modulu ADC v LPC2148. V tomto výučbe teda potrebujeme implementovať koncepty PWM aj ADC. Preto si prosím prečítajte naše predchádzajúce výukové programy, kde sa dozviete PWM a ADC v ARM7-LPC2148.
- Ako používať PWM v ARM7-LPC2148
- Ako používať ADC v ARM-LPLC2148
PWM a ADC piny v ARM7-LPC2148
Obrázok nižšie zobrazuje piny PWM a ADC v LPC2148. Žlté políčka označujú (6) piny PWM a čierne políčko označujú (14) piny ADC.
Súčasti sú povinné
Hardware
- ARM7-LPC2148
- Modul displeja LCD (16 x 2)
- Servomotor (SG-90)
- Regulátor napätia 3,3 V
- 10k potenciometer (2 čísla)
- Nepál
- Pripojenie drôtov
Softvér
- Keil uVision5
- Flash Magic Tool
Schéma zapojenia a zapojenia
Nasledujúca tabuľka zobrazuje prepojenie medzi servomotorom a ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
ČERVENÁ (+ 5 V) |
+ 5V |
HNEDÝ (GND) |
GND |
ORANŽOVÁ (PWM) |
P0.1 |
Pin P0.1 je PWM výstup LPC2148.
Nasledujúca tabuľka zobrazuje zapojenie obvodov medzi LCD a ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Povoliť) |
P0.12 |
D4 (dátový kolík 4) |
P0.13 |
D5 (dátový kolík 5) |
P0.14 |
D6 (dátový kolík 6) |
P0.15 |
D7 (dátový kolík 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Nižšie uvedená tabuľka ukazuje prepojenie medzi ARM7 LPC2148 & potenciometrom s regulátorom 3.3V napätie.
IC regulátora napätia 3,3 V |
Funkcia pripnutia |
ARM-7 LPC2148 kolík |
1. Ľavý kolík |
- Ve z GND |
GND pin |
2. Stredový kolík |
Regulovaný výstup +3,3 V. |
Na potenciometer Vstup a výstup potenciometra na P0,28 LPC2148 |
3. Pravý kolík |
+ Ve od 5V VSTUP |
+ 5V |
Body, ktoré treba upozorniť
1. Regulátor napätia 3,3 V sa tu používa na zabezpečenie analógovej vstupnej hodnoty na kolík ADC (P0.28) LPC2148. Pretože používame napájanie 5V, musíme regulovať napätie regulátorom napätia 3,3V.
2. Potenciometer sa používa na zmenu napätia medzi (0 V až 3,3 V) na zabezpečenie analógového vstupu (ADC) na kolíku LPC2148 P0,28.
3. Pin P0.1 LPC2148 poskytuje výstup PWM do servomotora na riadenie polohy motora.
4. Podľa hodnoty analógového vstupu (ADC) sa poloha servomotora zmení z (0 na 180 stupňov) cez výstupný pin PWM na P0.1 LPC2148.
Programovanie ARM7-LPC2148 pre riadenie servomotora
Na programovanie ARM7-LPC2148 potrebujeme keil uVision & Flash Magic nástroj. Na programovanie karty ARM7 Stick cez port micro USB používame kábel USB. Napíšeme kód pomocou Keila a vytvoríme hexadecimálny súbor. Potom sa HEX súbor nahrá na flash disk ARM7 pomocou Flash Magic. Ak sa chcete dozvedieť viac o inštalácii keil uVision a Flash Magic a o tom, ako ich používať, kliknite na odkaz Začíname s mikrokontrolérom ARM7 LPC2148 a naprogramujte ho pomocou Keil uVision.
Kroky spojené s konfiguráciou LPC2148 pre PWM a ADC na riadenie servomotora
Krok 1: - Zahrňte potrebné hlavičkové súbory na kódovanie LPC2148
#include
Krok 2: - Ďalšou vecou je nakonfigurovať PLL na generovanie hodín, pretože nastavuje systémové hodiny a periférne hodiny LPC2148 podľa potreby programátorov. Maximálna frekvencia hodín pre LPC2148 je 60Mhz. Nasledujúce riadky sa používajú na konfiguráciu generovania hodín PLL.
void initilizePLL (void) // Funkcia na použitie PLL na generovanie hodín { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Krok 3: - Ďalšou vecou, ktorú musíte urobiť, je výber pinov PWM a funkcie PWM LPC2148 pomocou registra PINSEL. Používame PINSEL0, pretože používame P0.1 pre PWM výstup LPC2148.
PINSEL0 - = 0x00000008; // Nastavovací kolík P0.1 LPC2148 ako PWM3
Krok 4: - Ďalej musíme RESETOVAŤ časovače pomocou PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Reset a deaktivácia počítadla pre PWM
A potom ďalej nastavte prednastavenú hodnotu, ktorá rozhodne o rozlíšení PWM.
PWMPR = 0x1D; // Prednastavená hodnota registra
Krok 5: - Ďalej nastavte PWMMCR (PWM match control register), pretože nastavuje operácie ako reset, prerušenia pre PWMMR0 a PWMMR3.
PWMMCR = 0x00000203; // Reset a prerušenie pri zhode MR0, prerušenie pri zhode MR3
Krok 6: - Maximálna perióda kanálu PWM sa nastavuje pomocou PWMMR0 a tona pracovného cyklu PWM je pôvodne nastavená na 0,65 ms
PWMMR0 = 20 000; // Časové obdobie vlny PWM, 20 ms PWMMR3 = 650; // Tona vlny PWM 0,65 ms
Krok 7: - Ďalej musíme pomocou príkazu PWMLER nastaviť funkciu Latch Enable na príslušné registre zhody
PWMLER = 0x09; // Povolenie blokovania pre PWM3 a PWM0
(Používame PWMMR0 a PWMMR3) Povolte teda zodpovedajúci bit nastavením 1 v PWMLER
Krok 8: - Ak chcete povoliť výstup PWM na pin, musíme použiť PWMTCR na povolenie počítadiel časovača PWM a režimov PWM.
PWMPCR = 0x0800; // Povoliť PWM3 a PWM 0, s jednou hranou riadené PWM PWMTCR = 0x09; // Povoliť PWM a počítadlo
Krok 9: - Teraz musíme získať hodnoty potenciometra pre nastavenie pracovného cyklu PWM z kolíka ADC P0.28. Takže v LPC2148 používame modul ADC na prevod analógového vstupu potenciometra (0 až 3,3 V) na hodnoty ADC (0 až 1023).
Krok 10: - Na výber kolíka ADC P0.28 v LPC2148 použijeme
PINSEL1 = 0x01000000; // Nastavenie P0.28 ako ADC VSTUP AD0CR = ((((14) << 8) - (1 << 21)); // Nastavenie hodín a PDN pre A / D prevod
Nasledujúce riadky zachytávajú analógový vstup (0 až 3,3 V) a prevádzajú ho na digitálnu hodnotu (0 až 1023). A potom sú tieto digitálne hodnoty rozdelené o 4, aby sa previedli na (0 až 255), a nakoniec sú napájané ako výstup PWM na pin P0.1 LPC2148. Tu prevádzame hodnoty z 0-1023 na 0-255 vydelením 4, pretože PWM LPC2148 má 8-bitové rozlíšenie (28).
AD0CR - = (1 << 1); // Vyberte kanál AD0.1 v registri ADC delaytime (10); AD0CR - = (1 << 24); // Spustenie A / D prevodu while ((AD0DR1 & (1 << 31)) == 0); // Skontrolujte bit Hotovo v ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Získajte VÝSLEDOK z dátového registra ADC dutycycle = adcvalue / 4; // vzorec na získanie hodnôt colného cyklu od (0 do 255) PWMMR1 = colný cyklus; // nastavenie hodnoty dutycycle na PWM match register PWMLER - = (1 << 1); // Povolí výstup PWM s hodnotou cyklu
Krok 11: - Ďalej tieto hodnoty zobrazíme na LCD (16X2) zobrazovacom module. Takže pridáme nasledujúce riadky na inicializáciu modulu LCD displeja
Void LCD_INITILIZE (void) // Funkcia prípravy LCD { IO0DIR = 0x0000FFF0; // Nastaví pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 ako OUTPUT delaytime (20); LCD_SEND (0x02); // Inicializácia lcd v 4-bitovom režime prevádzky LCD_SEND (0x28); // 2 riadky (16X2) LCD_SEND (0x0C); // Vypnuté zobrazenie kurzora LCD_SEND (0x06); // Automatický prírastok kurzora LCD_SEND (0x01); // Zobraziť jasný LCD_SEND (0x80); // Prvý riadok prvá pozícia }
Pretože sme pripojili LCD v 4-bitovom režime k LPC2148, musíme posielať hodnoty, ktoré sa majú zobrazovať ako nibble by nibble (Upper Nibble & Lower Nibble). Používajú sa teda nasledujúce riadky.
void LCD_DISPLAY (char * msg) // Funkcia pre tlač znakov odosielaných po jednom { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Odošle horný nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH na tlač údajov IO0CLR = 0x00000020; // RW LOW režim zápisu delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS a RW nezmenené (tj. RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Odošle dolný nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delaytime (2); IO0CLR = 0x00000040; delaytime (5); i ++; } }
Na zobrazenie týchto hodnôt ADC a PWM používame nasledujúce riadky vo funkcii int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Zobraziť hodnotu ADC (0 až 1023) angle = (adcvalue / 5,7); // Vzorec na prevod hodnoty ADC na uhol (o na 180 stupňov) LCD_SEND (0xC0); sprintf (hodnota uhla, "ANGLE =%. 2f deg", uhol); LCD_DISPLAY (hodnota uhla);
Kompletný kód a video popis tutoriálu sú uvedené nižšie