Jste zde

Řízení serva

103_02m.png

Cílem projektu bylo navrhnout desku plošného spoje s odděleným řízením a výkonovou částí. A vytvořit v prostředí AVR Studio aplikaci, která by umožňovala řízení polohy modelářského serva. Pro obsluhu modelářského serva bude vytvořena knihovna AVR GCC, která bude veškerou obsluhu serva provádět prostřednictvím funkcí. Poloha modelářského serva musí být určena přímo její hodnotou.

Obsah:

  1. Napájecí obvod
  2. Ovládání serva
  3. Závěr
  4. Literatura.

Modelářské mikroservo Hitec HS-81 je zobrazeno na obrázku 1. Jeho rozměry jsou 40x35x12mm, hmotnost 17g a napájet ho lze od 4,8V do 6,0V. Zapojení konektoru je následující: černý vodič je společná zem, červený vodič je napájecí a žlutý vodič je vstup řídících impulsů. Řízení polohy serva obstarává pulzní šířková modulace (PWM) s opakovací frekvencí 50Hz, většina serv pracuje s rozsahem impulzů 1-2ms. Výrobce Hitec udává ve svém všeobecném manuálu rozsah impulsů od 0,9ms do 2,1ms s centrální polohou 1,5ms. Ve specifikaci k servu HS-81 je uveden rozsah 40° doprava pro 400µs od středové polohy, pro standardní servo HS-422 výrobce udává obdobný rozsah 45° doprava pro 400µs od středové polohy. Středová poloha 1500µs bývá obvyklá pro všechny serva různých výrobců. Pásmo necitlivosti pro serva Hitec je 8µs. Spotřebu serva HS-81 v klidu udává výrobce do 10mA, při pohybu 280mA. Servo HS-422 má udávanou spotřebu při pohybu 150mA. Všechny hodnoty jsou uváděny pro servo bez zatížení.


Obr. 1. Modelářské servo HS-81
 

Součástí projektu je ověřit funkci na reálném mikrokontroléru. Pro tyto účely je k dispozici vývojová deska obsahující mikrokontrolér Atmel ATmega 16. Deska obsahuje řadu periferií, sloužících k výuce několika předmětů zabývajících se mikroprocesorovou technikou. Právě servo by mohlo být další vhodnou periferií ilustrující použití pulzně šiřkové modulace (PWM). Náhled na vývojovou desku je na obrázku 2.


Obr. 2. Vývojová deska
 

Napájecí obvod

Protože proudový odběr serva přesahuje možnosti napájení vývojové desky, bylo nutné navrhnout vhodné napájecí obvody. Rozsah napájecího napětí serva udává výrobce v rozmezí 4,8V až 6,0V, což odpovídá použití čtyř nebo pětičlánkové akumulátorové baterie, které se primárně používají k napájení modelářských serv. Jmenovité napětí jednoho článku baterie NiCd nebo NiMH je 1,2V, ale v průběhu vybíjecího cyklu kolísá od 1,4V při plně nabitém akumulátoru naprázno až k 0,7V při téměř vybitém akumulátoru. Teoreticky by tedy servo mělo fungovat v rozsahu napětí od 2,8V do 7,5V. Při nízkém napětí však nemusí mít servo dostatečnou sílu a výkon, při vyšším napájecím napětí zase hrozí možnost přetížení serva.

Z výše uvedeného se přímo nabízí možnost použití integrovaného stabilizátoru napětí 5V. Použít můžeme standartní integrovaný stabilizátor L7805, pro mobilní bateriově napájené obvody bude možná vhodnější nízkopříkonový L4940V5. Při použití standartního integrovaného stabilizátoru L7805 bude nutné obvod napájet napětím v rozsahu 8V až 20V, maximální výstupní proud 1A. Při použití nízkopříkonového stabilizátoru L4940V5 bude rozsah vstupního napájecího napětí 6,5V až 16V a díky nižším tepelným ztrátám bude možné zatížit výstup až 1,5A, což se může hodit například pro napájení několika serv.

Výsledné schéma zapojení je znázorněno na obrázku 3. Hlavní část U1 tvoří integrovaný stabilizátor L4940V5 doplněný o filtrační kondenzátory C1 a C3. Velikost kapacity kondenzátorů je zvolena dle testovacího přípravku výrobce stabilizátoru. Pro zmenšení zvlnění stabilizovaného napětí 5V při náhlých změnách polohy serva by bylo vhodné zvětšit jejich velikost. Dále je na výstupu stabilizovaného obvodu připojena signalizační dioda s předřadným odporem upravující pracovní bod diody (I=20mA). Dále je stabilizované napětí 5V přivedeno na konektor SV1, který slouží k připojení a napájení použitého serva.
Bylo nutné nějakým způsobem vyřešit oddělené řízení serva. To je možné provádět dvěma způsoby. Buď ke svorkovnici CON2 připojit spínač a servo řídit spínáním tohoto spínače, nebo na svorkovnici CON3 přivádět signál a řídit servo oddělěné optronem OK1. Jako optron OK1 byl použit levný PC817, použitý rovněž na vývojové desce. Servo je řízeno kladnými impulsy, které obstará pull-up rezistor R2. Je třeba si uvědomit, že kladné impulsy vzniknou rozpojením spínače na svorkovnici CON2 nebo přivedením nízké úrovně na svorkovnici CON3. Nízká uroveň na servu je při sepnutém spínači na CON2 a vysoké úrovni na CON3. Pro řízení serva je nutné vždy zvolit pouze jeden řidící vstup, buď na svorkovnici CON2 nebo na CON3, nikdy však ne současně. Mezi svorkovnicí CON3 a optronem OK1 je zapojen rezistor R3 omezující vstupní proud optronem na 20mA při vstupním napětí na CON3 5V. Pokud by nastal požadavek řídit vstup CON3 jiným napětím, musela by se upravit velikost rezistoru R3, tak aby na optronu bylo napětí 1,2V při proudu optronem 20mA.


Obr. 3. Schéma zapojení
 

Pro návrh desky plošných spojů (DPS) byl použit program EAGLE 4.16r2. V tomto programu bylo nakresleno schéma zapojení, program obsahuje rozsáhlou databázi běžně používaných součástek včetně různých typů pouzder. Práce s programem je rychlá a intuitivní, ani bez předchozích zkušeností s tímto programem nebyl problém najít požadovanou funkci, na rozdíl od jiných komplexnějších a komplikovanějších programů. Hlavní funkcí programu je návrh desky plošných spojů (DPS, layout). Nejdříve nakreslíme obrys desky ( rozměry desky 55mm x 33mm), rozmístíme součástky, popřípadě jimi různě rotujeme abychom docílili nejmenšího možného počtu křížení vodičů. Pak mezi jednotlivými pájecími body vytvoříme vodivé spojení, buď ručně (pro jednoduchá schémata) nebo pomocí autorouteru. Nakonec zvolíme viditelnost jednotlivých vrstev a můžeme přímo tisknout layout desky a osazovací výkres a nebo je exportovat do externího souboru. Na obrázku 4 je znázorněn osazovací výkres a na obrázku 5 je znázorněn layout vodivých vrstev (kliknutím zobrazíte původní velikost). Tabulka 1 obsahuje seznam použitých součástek.


Obr. 4. Osazovací výkres (rozměry 55mm x 33mm)
 

Obr. 5. Deska plošných spojů (rozměry 55mm x 33mm)
 

 

Na obrázku 6 je vyfocena hotová již osazená deska. Při vytváření prvního prototypu jsem se nepozorností dopustil dvou chyb. První byla připojení signalizační LED přímo na napájecí napětí místo na stabilizovanou 5V větev. Provizorní oprava byla provedena přerušením jedné vodivé cesty a vytvoření nové pomocí drátové propojky. Druhou chybou bylo opomenutí předřadit optronu rezistor R3 upravující jeho vstupní pracovní bod, náprava byla jednoduchá připojením rezistoru přímo na svorkovnici CON3. Uvedené chyby jsou již ve výše uvedeném návrhu opraveny! Při použití prvního prototypu je třeba pamatovat na připojení předřadného rezistoru na svorkovnici!


Obr. 6. Osazená deska
 

Ovládání serva

Pulzní šířkovou modulaci (PWM) můžeme snadno generovat pomocí mikrokontroleru. Mikrokontroler ATmega16 je vybaven čítači/časovači přizpůsobenými ke generování pulzní šířkové modulace hned v několika různých režimech:

Fast PWM Mode

Nejjednodušším způsobem ovládání serva by bylo využití generování pulzní šířkové modulace v režimu Fast PWM. Princip funkce je zobrazen na obrázku 7 převzatý z [2] ATmega16 Datasheet. V tomto režimu pouze nastavíme příslušné registry a šířku pulzu měníme přímo změnou hodnoty registru OCR0.


Obr. 7. Princip Fast PWM

Pro opakovací frekvenci PWM platí:
 ,
kde   fclk_I/O=16MHz..........frekvence krystalu mikrokontroleru,
;    N=1024..................hodnota předděličky kmitočtu.

Z toho je vidět, že opakovací frekvence nejde s daným krystalem nastavit přesně na 50Hz. Navíc celá perioda (asi 16ms) je rozdělena pouze na 256 časových úseků, z nichž bychom pro řízení serva využili pouze 16 (šiřka pulsu 1ms odpovídá hodnotě OCR0=239 a šířka pulsu 2ms odpovídá OCR0=223). Rozsah serva 90° dělený 16 polohami, by nám dal příliš hrubý krok 5,6°. Přestože tento způsob řízení serva má pouze malý počet poloh, mohl by se v určitých aplikacích uplatnit. Zejména v aplikacích náročných na rychlost zpracování a kde řízení serva hraje pouze podružnou roli, může být výhodou jednoduchost, rychlost a nenáročnost na strojový čas programu.

Zdrojový kód se skládá prakticky pouze z nastavení registrů čítače/časovače:

#include // definiční soubor pro mikrokontrolér ATmega16
#define F_CPU 16000000 //definice frekvence procesoru

//Globální proměnné
char maximum = 0b11101111;
char neutral = 0b11100111;
char minimum = 0b11011111;
char poloha = 0b11100111;

//HLAVNI FUNKCE
int main()
{
// Inicializace registru pro PWM citace/casovace 0
DDRB = 0xff; // nastavi portB jako vystupni
TCCR0 = (1<

Podstatou tohoto kódu je nastavení registru TCCR0 na generování Fast PWM, uložení výchozí polohy serva do registru OCR0 a nesmíme zapomenout nastavit pin PB3 jako výstupní. Na pinu PB3 portu B je generována výstupní pulzně šířková modulace. Změnu polohy serva provádíme změnou hodnoty v registru OCR0, což je záležitost jednoho řádku zdrojového kódu. Maximální hodnota registru OCR0 pro generování impulsů šířky 1ms je 239, pro šířku impulsu 2ms 223 a pro středovou polohu serva a šířku impulsu 1,5ms 231. Pro připojení serva k vývojové desce na obrázku 8 slouží patice KB, jejíž zapojení je znázorněno na obrázku 9 a) přejatého z [1] Mikroprocesorová technika, Laboratorní cvičení. Přípravek pro napájení a řízení serva připojíme k vývojové desce následujícím způsobem: svorku CON3-1 (-IN2) připojíme na GND vývojové desky, svorku CON3-2 (+IN2) připojíme přes rezistor 200R na pin PB3.

 


Obr. 8. Vývojová deska
 
a)                                 b)
Obr. 9. Zapojení patic [1], a) patice KB, b) patice KD

Clear Timer on Compare Match (CTC) Mode

Clear Timer on Compare Match Mode je další režim čítače/časovače, který lze využít ke generování pulsní šířkové modulaci (PWM). Tento režim již umožňuje velmi rozmanité možnosti generování přesných časových posloupností, je však již náročnější na obsluhu. Základem režimu je nulování čítače a vyvolání přerušení při komparaci čítače s hodnotou registru OCR0 jak je to naznačeno na obrázku 10 přejatého z [2] ATmega16 Datasheet.


Obr. 10. Princip režimu Clear Timer on Compare Match Mode [1]
 

Nastavíme čítač/časovač tak, aby generoval přerušení při komparaci každou 1ms, předděličku nastavíme na N=64 a komparační registr OCR0=250, potom bude frekvence: 

  V obsluze přerušení zavedeme počitadlo do 20ms, tím máme obnovovací frekvenci 50Hz. V obsluze přerušení při komparaci OCR0 s čítačem můžeme definovat jakýkoliv výstupní port a pin, kterým chceme řídit servo. Jakmile dojde k resetu počitadla nastavíme výstup do vysoké úrovně, další přerušení přijde za 1ms, tím máme zajištěn základní šířku impulsu. Nastavíme registr OCR0 dle požadované polohy 0 až 250, kde OCR0=0 odpovídá základní šířce impulsu 1ms a levé poloze serva, OCR0=125 odpovídá neutrální poloze serva a šířce impulsu 1,5ms a OCR0=250 odpovídá pravé poloze serva a šířce impulsu 2ms. V další obsluze přerušení při komparaci nulujeme výstup a počítáme dokud se opět nevynuluje počitadlo, kdy se postup znovu opakuje. Tímto máme rozsah 1ms až 2ms rozdělen na 250 časových úseků, jeden úsek trvá 4µs, což vzhledem k pásmu necitlivosti serva 8µs je plně dostačující krok. Protože v rámci počitadla využíváme pouze první dva intervaly a zbylé zatím nevyužíváme. Nevyužité intervaly můžeme obdobným způsobem využít pro řízení dalších nezávislých kanálů serv. Můžeme tak efektně využít všech 8 pinů daného portu pro řízení 8 kanálů serv.

Připojení serva k vývojové desce je obdobné jako v minulém případě, jen s tím rozdílem, že jako výstup můžeme zvolit prakticky jakýkoliv pin jakéhokoliv portu. Zapojení jednotlivých pinů na paticích KB a KD je uvedeno na obrázku 9. Umístění patic na vývojové desce je zvýrazněno na obrázku 8. Nastavení se provádí v hlavičkovém souboru "servo_h.h" definováním potřebných konstant (pro jednoduchost můžeme opět připojit servo na pin PB3 portu B):

/*
	** ===================================================================
	** Konstanty
	** ===================================================================
	*/
	#define SERVO_PORT	PORTB		// výstupní port pro ovladani serva
	#define DDR( x )	( *(&x - 1) )	// adresa směrového registru portu

	#define PIN_OUT0 0			// Definice pinu OUTPUT 0
	#define PIN_OUT1 1			// Definice pinu OUTPUT 1
	#define PIN_OUT2 2			// Definice pinu OUTPUT 2
	#define PIN_OUT3 3			// Definice pinu OUTPUT 3
	#define PIN_OUT4 4			// Definice pinu OUTPUT 4
	#define PIN_OUT5 5			// Definice pinu OUTPUT 5
	#define PIN_OUT6 6			// Definice pinu OUTPUT 6
	#define PIN_OUT7 7			// Definice pinu OUTPUT 7

Při implementaci do programu musíme počítat s tím, že pro ovládání serva je vyhrazen čítač/časovač_0 a pro ovládání osmi kanálů serv celý jeden výstupní port. Tyto periferie není proto možné použít pro jinou aplikaci. Drobnou úpravou zdrojového kódu by bylo možné snížit počet kanálů řízení serv a tím uvolnit některé piny daného portu pro jinou aplikaci. Ovládání polohy serva je pak velmi jednoduché. Stačí na začátku programu inicializovat registry čítače/časovače funkcí "servo_init(char neutral)", potom již stačí měnit polohu serva na daném kanále funkcí "servo_poloha(char poloha, char kanal)" a v hlavním programu povolit přerušení:

/* Frekvence krystalu */
#define F_CPU 16000000 //definice frekvence procesoru

/*
** Hlavičkové soubory
*/
#include ‹stdio.h› // definiční soubor pro mikrokontrolér ATmega16
#include ”.\avr\interrupt.h” //definicni soubor pro obsluhu preruseni
#include ”servo_h.h” //definicni soubor pro ovladani serva

/*
** Globální proměnné
*/
char maximum = 0b11111010; //maximalni poloha serva
char minimum = 0b00000001; //minimalni poloha serva
char neutral = 0b01111100; //neutralni poloha serva
char poloha = 0b01111100; //aktualni poloha serva

/*
** HLAVNÍ FUNKCE
*/
int main()
{
poloha = neutral;
servo_init(poloha) ; //inicialicace nastaveni pro rizeni serva

servo_poloha(maximum, 0); //zmena polohy serva kanalu 0
servo_poloha(neutral, 3); //zmena polohy serva kanalu 3
servo_poloha(minimum, 7); //zmena polohy serva kanalu 7

sei(); //globalni povoleni preruseni

while(1) //nekonecna smycka
{}
} 

 Vytvořený program jsem uspěšně skompiloval a nahrál programátorem JTAGICE mkII do mikrokontroleru ATmega16 ve vývojové desce. Servo jsem připojil na pin PB3, dále jsem z patice KB vyvedl piny PB0, PB5 a PB7 a i s PB3 jsem je osciloskopickými sondami připojil k osciloskopu Agilent 54624A. Na osciloskopu jsem pozoroval generované průběhy.

Na obrázku 11 je celkový náhled na pulsně šířkovou modulaci, zejména se zde dá dobře odečíst opakovací frekvence 49,5Hz.


Obr. 11. Pulzní šířková modulace (PWM)
 

Z obrázku 12 můžeme odečíst minimální hodnotu šířky impulsu 1,010ms, tato hodnota je nepatrně vyšší protože při 1ms již servo HS-81 naráželo na mechanický doraz.


Obr. 12. Šířka pulzu 1,0ms
 

Z obrázku 13 můžeme odečíst neutrální hodnotu šířky impulsu 1,500ms, což je středová výchozí poloha serva. Od této hodnoty se servo vychyluje na každou stranu asi o 45°, dle typu serva a výrobce. Při zvětšování šiřky pulsu se většina serv pohybuje ve směru hodinových ručiček a při zkracování impulsu proti směru hodinových ručiček.


Obr. 13. Šířka pulzu 1,5ms
 

Z obrázku 14 můžeme odečíst naopak maximální hodnotu šířky impulsu 2,010ms.


Obr. 15. Ovládání více kanálů
 

Závěr

Navrhnul jsem prototyp desky pro napájení modelářského serva s odděleným řízením. Orientačně jsem se pokusil změřit poudový odběr serva, který je velmi závislý na režimu pohybu a zatížení serva. Měřil jsem celkový odběr desky řízení serva s připojeným mikroservem HS-81 bez mechanického zatížení. V klidu byl celkový odběr desky včetně serva 30mA, což je asi 20mA pro LED diodu a 10mA pro servo, což odpovídá údajům výrobce serva. Při velmi pomalém pohybu serva byl odběr asi 90mA. Při neustálém plynulém pohybu z jedné krajní polohy do druhé byl odběr asi 300mA, což rovněž odpovídá údajům výrobce. Ale při rychlém střídání krajních poloh, kdy servo ještě nedosáhlo požadované krajní polohy vzrostla spotřeba serva až na 700mA!

Při praktických zkouškách servo HS-81 při šířce pulsu 1ms již naráželo na mechanický doraz, proto byla minimální šířka o něco málo větší než 1ms. Asi každý typ serva se bude mírně lišit v přípustném rozsahu, proto byl zvolen snad universální rozsah impulsů 1ms až 2ms. Poloha serva je snímána mechanickým potenciometrem a proto se parametry jednotlivých kusů serv mohou mírně lišit. Toto je třeba brát v úvahu při používání serva v blízkosti krajních poloh.

Byly vytvořeny knihovny ”servo_c.c” a ”servo_h.h” pro ovládání až osmi nezávislých kanálů pro řízení serv. Poloha každého serva je dána 8-bitovou hodnotou 0 až 255, mezní hodnoty odpovídají šířkám pulsů 1ms až 2ms. Před vlastním řízením polohy serva je nutné zavolat inicializační funkci a povolit globální přerušení, viz. výše. Knihovny používají čítač/časovač_0 a jeden port definovaný v hlavičkovém souboru ”servo_h.h”, který lze snadno změnit přepsáním jedné konstanty.

Propojení serva s vývojovou deskou je řešeno pomocí patice KB. Nepodařilo se mi oživit I2C (TWI) expandér portu Philips PCF8574 ke kterému je připojena svorkovnice. Propojení přes svorkovnici by bylo mnohem elegantnější řešení, než připojovat jednotlivé piny do patice.

Celý projekt vznikl v rámci předmětu MMIA - mikropočítače pro přístrojové aplikace na Ústavu radioelektroniky VUT v Brně a vše potřebné možné stáhnou níže. ZIP obsahuje soubory programu Eagle, zdrojové soubory AVR Studia i html dokumentaci.

Literatura

  • Ústav radioelektroniky VUT v Brně - http://www.urel.feec.vutbr.cz/
  • FRÝZA T., FEDRA Z., ŠEBESTA J. Mikroprocesorová technika, Laboratorní cvičení. Brno: FEKT VUT v Brně, 2008. 51s. ISBN: 978-80-214-3756-2.
  • Atmel Corporation. USA. ATmega16 Datasheet. 2008. 358s. Dostupné z WWW:  zde 
  • Hitec RCD USA. Servomanual. 2002. 2s. Dostupné z WWW:  zde 
  • Hitec RCD USA. HS-422 Specifikace. 2001. 1s. Dostupné z WWW:  zde
  • Hitec RCD USA. HS-81 Specifikace. 2001. 1s. Dostupné z WWW:  zde 
  • STMicroelectronics. Switzerland. L7805 Datasheet. 2008. 56s. Dostupné z WWW:  zde 
  • STMicroelectronics. Switzerland. L4940V5 Datasheet. 2008. 23s. Dostupné z WWW:  zde 
  • COSMO Electronics Corporation. Taiwan. K1010_817 Datasheet. 2007. 6s. Dostupné z WWW:  zde
  • Philips Electronics. Netherlands. PCF8574 Datasheet. 2002. 24s. Dostupné z WWW: zde 

     

PřílohaVelikost
Package icon Kompletní projekt1022.6 KB
Hodnocení článku: 

Komentáře

Poloha serva se ridi sirkou impulsu privadenou na zluty vodic serva. Sirka impulsu je od 1ms do 2ms (stredova poloha 1,5ms) s opakovaci frekvenci 50Hz. Zmena sirky impulsu je provadena programove pomoci 8-bitove promenne "poloha". Rozsah binarnich hodnot lezi mezi hodnotami promennych "maximum" a "minimum".

Ten plošný spoj je šílenost, větší by to už nešlo? ;)

Jinak jako pokus asi dobré, každý se nějak učí.