- Servomotor
- Ovládání servomotoru pomocí LPC2148 PWM a ADC
- PWM a ADC piny v ARM7-LPC2148
- Požadované komponenty
- Schéma zapojení a zapojení
- Programování ARM7-LPC2148 pro řízení servomotoru
V našem předchozím tutoriálu jsme propojili krokový motor s ARM7-LPC2148. V tomto tutoriálu budeme ovládat servomotor s ARM7-LPC2148. Servomotor má oproti krokovému motoru výhodu nízké spotřeby energie. Servomotor zastaví svou spotřebu energie, když je dosaženo požadované polohy, ale krokový motor nepřetržitě spotřebovává energii, aby zajistil hřídel v požadované poloze. Servomotory se většinou používají v robotických projektech kvůli jejich přesnosti a snadné manipulaci.
V tomto tutoriálu se dozvíte o servomotoru a jak propojit servo s ARM7-LPC2148. Potenciometr je také propojen pro změnu polohy hřídele servomotoru a LCD pro zobrazení hodnoty úhlu.
Servomotor
Servomotor je kombinací stejnosměrného motoru, systému řízení polohy a převodů. Otáčení servomotoru je řízeno aplikací PWM signálu, šířka PWM signálu určuje úhel a směr otáčení motoru. Zde budeme v tomto tutoriálu používat servomotor SG90, je to jeden z populárních a nejlevnějších. SG90 je 180 stupňové servo. Takže s tímto servem můžeme polohovat osu od 0 do 180 stupňů:
- Provozní napětí: + 5V
- Typ převodovky: plast
- Úhel rotace: 0 až 180 stupňů
- Hmotnost: 9 gm
- Točivý moment: 2,5 kg / cm
Než začneme programovat servomotor, měli bychom vědět, jaký typ signálu má být odeslán pro ovládání servomotoru. Měli bychom naprogramovat MCU tak, aby odesílal signály PWM na signální vodič servomotoru. Uvnitř servomotoru je řídicí obvod, který čte pracovní cyklus signálu PWM a polohuje hřídel servomotoru na příslušné místo, jak je znázorněno na obrázku níže
Servomotor každých 20 milisekund kontroluje puls. Upravte tedy šířku impulzu signálu a otáčejte hřídelí motoru.
- Šířka impulzu 1 ms (1 milisekunda) pro otáčení serva na 0 stupňů
- Šířka pulzu 1,5 ms pro rotaci na 90 stupňů (neutrální poloha)
- Šířka impulzu 2 ms pro otáčení serva na 180 stupňů.
Před připojením serva k ARM7-LPC2148 můžete své servo otestovat pomocí tohoto testovacího obvodu servomotoru. Zkontrolujte také, jak lze propojit servomotor s jinými mikrokontroléry:
- Ovládání servomotoru pomocí Arduina
- Propojování servomotorů s mikrokontrolérem 8051
- Řízení servomotoru pomocí MATLABu
- Ovládání servomotoru s Raspberry Pi
- Propojení servomotoru s MSP430G2
- Propojovací servomotor s STM32F103C8
Ovládání servomotoru pomocí LPC2148 PWM a ADC
Servomotor lze ovládat pomocí LPC2148 pomocí PWM. Poskytnutím signálu PWM na pin PWM SERVO s periodou 20ms a frekvencí 50Hz můžeme polohovat hřídel servomotoru kolem 180 stupňů (-90 až +90).
Potenciometr se používá ke změně pracovního cyklu signálu PWM a otáčení hřídele servomotoru, tato metoda je implementována pomocí modulu ADC v LPC2148. V tomto kurzu tedy potřebujeme implementovat koncepty PWM i ADC. Odkažte se tedy prosím na naše předchozí výukové programy a naučte se PWM a ADC v ARM7-LPC2148.
- Jak používat PWM v ARM7-LPC2148
- Jak používat ADC v ARM-LPLC2148
PWM a ADC piny v ARM7-LPC2148
Obrázek níže ukazuje PWM a ADC piny v LPC2148. Žluté rámečky označují (6) piny PWM a černé rámečky označují (14) piny ADC.
Požadované komponenty
Hardware
- ARM7-LPC2148
- Modul LCD (16x2)
- Servomotor (SG-90)
- Regulátor napětí 3,3 V
- 10k potenciometr (2 Nos)
- Nepájivá deska
- Připojení vodičů
Software
- Keil uVision5
- Flash Magic Tool
Schéma zapojení a zapojení
Níže uvedená tabulka ukazuje spojení mezi servomotorem a ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
ČERVENÁ (+ 5 V) |
+ 5V |
HNĚDÝ (GND) |
GND |
ORANŽOVÁ (PWM) |
P0.1 |
Pin P0.1 je PWM výstup LPC2148.
Tabulka níže ukazuje zapojení obvodů mezi LCD a ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Povolit) |
P0.12 |
D4 (datový kolík 4) |
P0.13 |
D5 (datový kolík 5) |
P0.14 |
D6 (datový kolík 6) |
P0.15 |
D7 (datový kolík 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Níže uvedená tabulka ukazuje zapojení mezi ARM7 LPC2148 a potenciometrem s regulátorem napětí 3,3V.
IC regulátoru napětí 3,3 V |
Pin funkce |
ARM-7 LPC2148 Pin |
1. Levý kolík |
- Ve z GND |
GND kolík |
2. Středový kolík |
Regulovaný výstup +3,3 V. |
Na potenciometr Vstup a výstup potenciometru na P0,28 LPC2148 |
3. Pravý kolík |
+ Ve od 5V VSTUP |
+ 5V |
Body, které je třeba si všimnout
1. Regulátor napětí 3,3 V se zde používá k poskytování analogové vstupní hodnoty kolíku ADC (P0.28) LPC2148. Protože používáme 5V napájení, musíme regulovat napětí regulátorem napětí 3,3V.
2. Potenciometr se používá pro změnu napětí mezi (0 V až 3,3 V), aby se zajistil analogový vstup (ADC) na LPC2148 pin P0.28
3. Pin P0.1 LPC2148 poskytuje PWM výstup do servomotoru pro řízení polohy motoru.
4. Podle hodnoty analogového vstupu (ADC) se poloha servomotoru změní z (0 na 180 stupňů) prostřednictvím výstupního pinu PWM na P0.1 LPC2148.
Programování ARM7-LPC2148 pro řízení servomotoru
K programování ARM7-LPC2148 potřebujeme nástroj Keil uVision & Flash Magic. Používáme USB kabel k programování ARM7 Stick přes micro USB port. Napíšeme kód pomocí Keila a vytvoříme hexadecimální soubor a poté se soubor HEX přenese na flash disk ARM7 pomocí Flash Magic. Chcete-li se dozvědět více o instalaci keil uVision a Flash Magic a o tom, jak je používat, přejděte na odkaz Začínáme s mikrokontrolérem ARM7 LPC2148 a naprogramujte jej pomocí Keil uVision.
Kroky zapojené do konfigurace LPC2148 pro PWM a ADC pro ovládání servomotoru
Krok 1: - Zahrňte potřebné hlavičkové soubory pro kódování LPC2148
#zahrnout
Krok 2: - Další věcí je konfigurace PLL pro generování hodin, protože nastavuje systémové hodiny a periferní hodiny LPC2148 podle potřeby programátorů. Maximální taktovací frekvence pro LPC2148 je 60Mhz. Následující řádky se používají ke konfiguraci generování hodin PLL.
void initilizePLL (void) // Funkce pro použití PLL pro generování hodin { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Krok 3: - Další věcí je výběr pinů PWM a funkce PWM LPC2148 pomocí registru PINSEL. Používáme PINSEL0, protože používáme P0.1 pro PWM výstup LPC2148.
PINSEL0 - = 0x00000008; // Nastavení kolíku P0.1 na LPC2148 jako PWM3
Krok 4: - Dále musíme RESETOVAT časovače pomocí PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Reset a deaktivace počítadla pro PWM
A pak dále nastavte přednastavenou hodnotu, která rozhoduje o nastavení rozlišení PWM.
PWMPR = 0x1D; // Přednastavená hodnota registru
Krok 5: - Dále nastavte PWMMCR (registr řízení shod PWM), protože nastavuje operace jako reset, přerušení pro PWMMR0 a PWMMR3.
PWMMCR = 0x00000203; // Reset a přerušení při shodě MR0, přerušení při shodě MR3
Krok 6: - Maximální doba kanálu PWM je nastavena pomocí PWMMR0 a Ton pracovního cyklu PWM je zpočátku nastaven na 0,65 ms
PWMMR0 = 20 000; // Časové období PWM vlny, 20 ms PWMMR3 = 650; // Tuna vlny PWM 0,65 ms
Krok 7: - Dále musíme pomocí PWMLER nastavit Latch Enable na odpovídající registry shody
PWMLER = 0x09; // Povolení západky pro PWM3 a PWM0
(Používáme PWMMR0 & PWMMR3) Povolte tedy odpovídající bit nastavením 1 v PWMLER
Krok 8: - Chcete - li povolit výstup PWM na pin, musíme použít PWMTCR pro povolení čítačů časovače PWM a režimů PWM.
PWMPCR = 0x0800; // Povolit PWM3 a PWM 0, PWM PTC řízené jednou hranou PWMTCR = 0x09; // Povolit PWM a počítadlo
Krok 9: - Nyní musíme získat hodnoty potenciometru pro nastavení pracovního cyklu PWM z kolíku ADC P0.28. V LPC2148 tedy používáme modul ADC pro převod analogového vstupu potenciometru (0 až 3,3 V) na hodnoty ADC (0 až 1023).
Krok 10: - Pro výběr kolíku ADC P0.28 v LPC2148 používáme
PINSEL1 = 0x01000000; // Nastavení P0.28 jako ADC VSTUP AD0CR = (((14) << 8) - (1 << 21)); // Nastavení hodin a PDN pro A / D převod
Následující řádky zachycují analogový vstup (0 až 3,3 V) a převádějí jej na digitální hodnotu (0 až 1023). A pak jsou tyto digitální hodnoty rozděleny 4, aby se převáděly na (0 až 255), a nakonec přiváděny jako výstup PWM na pin P0.1 LPC2148. Zde převádíme hodnoty z 0-1023 na 0-255 dělením 4, protože PWM LPC2148 má 8-bitové rozlišení (28).
AD0CR - = (1 << 1); // Vyberte kanál AD0.1 v registru ADC delaytime (10); AD0CR - = (1 << 24); // Spusťte A / D převod while ((AD0DR1 & (1 << 31)) == 0); // Zkontrolujte bit DONE v ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Získejte VÝSLEDEK z datového registru ADC dutycycle = adcvalue / 4; // vzorec pro získání hodnot dutycycle od (0 do 255) PWMMR1 = dutycycle; // nastavit hodnotu dutycycle na PWM match register PWMLER - = (1 << 1); // Povolit výstup PWM s hodnotou dutycycle
Krok 11: - Dále tyto hodnoty zobrazíme na LCD (16X2) zobrazovacím modulu. Přidáme tedy následující řádky k inicializaci modulu LCD displeje
Void LCD_INITILIZE (void) // Funkce pro přípravu LCD { IO0DIR = 0x0000FFF0; // Nastaví pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 jako OUTPUT delaytime (20); LCD_SEND (0x02); // Inicializace lcd ve 4bitovém provozním režimu LCD_SEND (0x28); // 2 řádky (16X2) LCD_SEND (0x0C); // Vypnout zobrazení kurzoru LCD_SEND (0x06); // Automatický přírůstek kurzoru LCD_SEND (0x01); // Zobrazit jasný LCD_SEND (0x80); // První řádek první pozice }
Protože jsme připojili LCD ve 4bitovém režimu k LPC2148, musíme posílat hodnoty, které se budou zobrazovat jako nibble by nibble (Upper Nibble & Lower Nibble). Používají se tedy následující řádky.
void LCD_DISPLAY (char * msg) // Funkce pro tisk posílaných znaků jeden po druhém { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Odešle horní okusování IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH pro tisk dat IO0CLR = 0x00000020; // RW LOW Režim zápisu delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS a RW beze změny (tj. RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Odesílá spodní okusování IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delaytime (2); IO0CLR = 0x00000040; delaytime (5); i ++; } }
K zobrazení těchto hodnot ADC a PWM používáme následující řádky ve funkci int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Zobrazit hodnotu ADC (0 až 1023) úhel = (adcvalue / 5,7); // Vzorec pro převod hodnoty ADC na úhel (o na 180 stupňů) LCD_SEND (0xC0); sprintf (hodnota úhlu, "ANGLE =%. 2f deg", úhel); LCD_DISPLAY (hodnota úhlu);
Kompletní kód a popis videa tutoriálu jsou uvedeny níže