Multiplexace řízení serv - projekt MMIA

Viktor Obr, UREL, FEKT, VUT Brno
xobrvi00stud.feec.vutbr.cz

Obsah:

  1. Úvod
  2. Realizace
  3. Závěr
  4. Literatura

Úvod

     Cílem tohoto projektu bylo navrhnout a vyrobit prototyp desky a také vytvořit knihovnu funkcí pro řízení až 8 serv pomocí demultilexeru. Výsledné zařízení lze využít u různých robotů s velkým množstvím serv (hexapody aj.) nebo i k ovládání jiných zařízení pracujících s pulzní šířkovou modulací (PWM), např. ke zjišťování vzdálenosti pomocí infračervených diod (zkoumání okolního terénu jejich postupným přepínáním).
     Modelářská serva jsou většinou řízená kladnými pulzy o šířce 1 - 2 ms (uvádí se i 0,5 - 2,5 ms, vždy se středovou polohou 1,5 ms) a periodě opakování těchto pulzů 20 ms, což odpovídá frekvenci 50 Hz. Řízení jednoho serva proto není žádný velký problém, pouze se některý z čítačů mikrokontroléru nastaví do módu Fast PWM a hodnotou nastavenou v registru OCRn se řídí šířka pulzu modulace generované na odpovídajícím pinu. Pokud bychom ale takto chtěli řídit více serv, jsme omezeni počtem čítačů a pinů, na kterých lze takto PWM generovat.
     V tomto případě je výhodnější využívat čítač v módu Clear Timer on Compare Match (CTC), kdy dochází k načítání hodnoty v registru čítače a k vynulování čítače a přerušení, pokud hodnota odpovídá hodnotě nastavené v registru OCRn. Takto lze při vhodně zvolené předděličce frekvence generovat pulzy o požadované šířce. Výhodou tohoto módu je, že při přerušeních lze nastavovat nebo nulovat námi zvolené piny (nebo i více pinů), nejsme tak vázáni na konkrétní piny jako v módu Fast PWM. Je pak možné využít toho, že by čítač po generování pulzu pro první servo v podstatě jen čekal na začátek další 20 ms periody, a během tohoto čekání tak čítač může generovat pulzy pro další serva. Vyhradíme-li jednomu servu čas 2,5 ms, je takto možné řídit až 8 serv, než nastane začátek další periody prvního serva. Nevýhodou tohoto řešení je však to, že musí být každé servo připojené na jiném pinu a 8 serv tak zabere celkem 8 pinů (např. celý port). Hlavní myšlenkou tohoto projektu je tak možnost zařazení demultiplexeru mezi mikrokontrolér a serva a ovládání 8 serv jen pomocí 4 pinů, kde tři slouží jako adresní k určení cílového serva a jeden jako datový jako nosič signálu PWM.

Realizace

     K realizaci a testování programu byla využita vývojová deska s ATmega 16, která byla k dispozici na UREL a slouží k výuce předmětů zabývajících se mikroprocesory. Protože mají serva (obzvlášť 8 serv) proudový odběr větší, než je v možnostech vývojové desky, bylo nutné navrhovanou desku doplnit o samostatný zdroj s dostatečně proudově dimenzovaným stabilizátorem napětí. Při rychlých změnách polohy mají serva spotřebu až 500 mA, byl proto využit stabilizátor LM1084V5 s výstupním proudem až 5 A a úbytkovým napětím max. 1,5 V doplněný o filtrační kondenzátory (viz. obr. 1). Desku je proto možné připojit na zdroj napětí 6,5 - 30 V (při testování s osciloskopem deska pracovala i na 4 tužkové baterky, se servy by to ale nejspíš nestačilo). K indikaci připojeného napájení slouží červená dioda s rezistorem omezujícím její proud. Kvůli samostatnému napájení bylo nutné výkonovou část (serva) oddělit od řídící části, jsou proto využity dva obvody PC847, z nichž každý obsahuje 4 optrony. Na vstupu každého optronu je rezistor o velikosti 200 Ohm pro omezení proudu optronem, na výstupu pak pull-up rezistor o velikosti 4,7 kOhm. V řídící části desky je pak 3-to-8 demultiplexer 74HCT138, který předává data na vstupu G1 podle adresy na vstupech A, B a C na konkrétní výstup (Y0 - Y7).
Schéma zapojení
Obr. 1 Schéma zapojení

     Vlastní deska plošných spojů pak byla navržena v programu Eagle tak, aby byly zachovány malé rozměry, šlo pouze o testovací prototyp. Na obrázku 2 je vlastní motiv plošného spoje, na obrázku 3 pak osazovací výkres desky. Rozměry desky jsou 53 x 69 mm.
Motiv plošného spoje Osazovací výkres
Obr. 2, 3 Motiv plošného spoje a osazovací výkres desky

     Na obrázku 4 je pak již hotová osazená deska, vstupní piny jsou rozmístěny tak, aby bylo možné je vsunout do patice KB na vývojové desce s vyvedeným portem B (obrázek 5).
Hotová deska Patice KB
Obr. 4, 5 Hotová deska a patice KB na vývojové desce

     Softwarová část projektu spočívá ve vytvoření knihovny funkcí serva_c.c (prototypy těchto funkcí jsou pak v hlavičkovém souboru serva_h.h) pro ovládání serv prostřednictvím demultiplexeru. Funkce servo_init má za úkol nastavit čítač Timer0 do módu CTC a předděličku, povolit přerušení při komparaci, nastavit část portu B jako výstupní a nastavit počáteční polohu serv (vstupní proměnná position). Velikost předděličky byla zvolena 64, při frekvenci krystalu 16 MHz a hodnotě komparačního registru OCR0 = 250 je frekvence přerušení při komparaci
Rovnice
což odpovídá periodě 1 ms. Funkce servo_init pak vypadá takto:
	void servo_init( unsigned char position)
	{
	     TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);	// CTC mode, preddelicka 64
	     OCR0 = 250;							// prvni preruseni po 1 ms
	     TIMSK = (1<<OCIE0);						// povoleni preruseni pri komparaci
	     
	     DDRB |= 0b00001111;						// PB3:0 vystupni
	     
	     int i;
	     for( i=0; i<<8; i++)
	     {
	          servo_position[i] = position;					// pocatecni poloha vsech serv
	     }
	}
	
     Další funkcí v knihovně serva_c.c je funkce servo_position_new, která slouží ke změně polohy jednoho serva. Poloha je zadávána v rozmezí 0 - 250, což odpovídá šířce pulzu 1 - 2 ms, hodnota 125 odpovídá středové poloze serva (1,5 ms).
	void servo_position_new( unsigned char position, unsigned char servo)
	{
	     servo_position[servo] = position;					// nova pozice (position) konkrétního serva (servo)
	}
	
     Poslední částí knihovny je pak samotná obsluha přerušení od čítače. Při každém přerušení dochází k navýšení proměnné timer a rozhodnutí, co se podle její hodnoty provede. Např. pro první servo (adresa adr = 0) dojde při prvním přerušení k navýšení hodnoty timer na 0 (definován jako globální proměnná unsigned char timer = 255), na adresních pinech (PB2:0) zůstane nízká úroveň a na datovém (PB3) je vysoká. Při dalším přerušení (po 1 ms) timer = 1, na datovém pinu je stále vysoká úroveň a hodnota v komparačním registru (OCR0) je nastavena tak, aby měl pulz požadovanou šířku. Při dalším přerušení (timer = 2) je na datový pin přivedena nízká úroveň a v OCR0 je nastavena taková hodnota, aby při dalším přerušení uběhly od začátku 2 ms. Při dalším přerušení (timer = 3) se už jen nastaví hodnota OCR0 na 125, aby uběhlo ještě 0,5 ms a uplynulo tak 2,5 ms určených pro jedno servo. Při dalším přerušení (timer = 4) se zvýší adresa a je tak ovládáno další servo.
	ISR( TIMER0_COMP_vect )
	{
	     timer++;
	     if( timer==0 )
	     {
	          adr = 0;
		  PORTB = 8;                             		// PORTB = 0b00001000
	          OCR0 = 250;
	     }
	     else if( timer==4 || timer==8 || timer==12 || timer==16 || timer==20 || timer==24 || timer==28 )
	     {
	          adr++;
		  PORTB = 8 + adr;                       		// PORTB = 0b00001000 + (1 az 7)
	          OCR0 = 250;
	     }
	     else if( timer==1 || timer==5 || timer==9 || timer==13 || timer==17 || timer==21 || timer==25 || timer==29 )
	     {
	          OCR0 = servo_position[adr];
	     }
	     else if( timer==2 || timer==6 || timer==10 || timer==14 || timer==18 || timer==22 || timer==26 || timer==30 )
	     {
		  PORTB = 0 + adr;                      		// PORTB = 0b00000000 + (0 az 7)
	          OCR0 = 250 - servo_position[adr];
	     }
	     else if( timer==3 || timer==7 || timer==11 || timer==15 || timer==19 || timer==23 || timer==27 )
	     {
	          OCR0 = 125;
	     }
	     else if( timer==31 )
	     {
	          OCR0 = 125;
	          timer = 255;
	     }
	}
	
     Jak vypadá signál na jednotlivých pinech je vidět na obrázku 6, kde PB3 je datový pin s pulzy o šířce 1 - 2 ms, na pinech PB2:0 je pak 3bitová adresa pro demultiplexer, který tak rozvádí data na konkrétní serva.
Průběhy na pinech
Obr. 6 Průběhy na jednotlivých pinech

     Hlavní program pak obsahuje jen vložení definičních souborů, definici počáteční polohy serv jako konstanty a v hlavní funkci inicializaci a nastavení nové polohy serv, povolení přerušení a nekonečnou smyčku.
	#define F_CPU 16000000		        // definice frekvence procesoru
	#include <avr\io.h>			// definicni soubor pro mikrokontroler ATmega16
	#include <avr\interrupt.h>		// definicni soubor pro obsluhu preruseni
	#include "serva_h.h"
	
	// konstanty
	
	unsigned char neutral = 125;        	// vychozi poloha serv
	
	// hlavni funkce
	
	int main( void)
	{
		servo_init(neutral) ;           // inicializace, nastaveni vychozi polohy serv
	
		servo_position_new(  10, 0);    // nastaveni nove polohy jednotlivych serv
		servo_position_new(  40, 1);
		servo_position_new(  70, 2);
		servo_position_new( 100, 3);
		servo_position_new( 150, 4);
		servo_position_new( 180, 5);
		servo_position_new( 210, 6);
		servo_position_new( 240, 7);
	
		sei();				//globalni povoleni preruseni
	
		while(1)			//nekonecna smycka
		{}
	}
	
     Při testování prototypu desky byl místo serv na konektory připojen osciloskop, bohužel bez možnosti exportu naměřených průběhů, na obrázku 7 jsou proto zobrazeny překreslené průběhy ze dvou měření, červený je průběh na datovém pinu prvního serva (označeno servo 0), zelený je průběh druhého serva (servo 1), při druhém měření byl opět zobrazován průběh prvního serva a modrý průběh osmého serva (servo 7). Hodnota OCR0 byla nastavena na 245, což odpovídá šířce pulzu asi 1,98 ms.
Průběhy na servech
Obr. 6 Průběhy na datových pinech jednotlivých serv (rozlišení 5 V / 5 ms)

Závěr

     Byl navržen prototyp desky a vytvořeny knihovny serva_c.c a serva_h.h pro řízení až 8 serv pomocí demultiplexeru. Při testování se ukázalo, že není možné využít celý rozsah polohy 0 - 250, protože při krajních hodnotách už docházelo k přerušení od čítače až při dalším běhu a pulz se tak o 1 ms prodloužil. Rozsah polohy 5 - 245 ale pro většinu serv plně dostačuje, při krajních polohách většinou serva už narážejí na mechanické dorazy a ničí se tak jejich převody. Jednotlivé typy serv třeba i stejné značky se značně liší, co se použitelného rozsahu týče.
     Schéma zapojení a programovou část je možné stáhnout zde jako ZIP archiv.

Literatura

[1] FRÝZA T., FEDRA Z., ŠEBESTA J. Mikroprocesorová technika a embedded systémy, Počítačová cvičení. Brno: FEKT VUT v Brně, 2011. 87s. ISBN: 978-80-214-3756-2.
[2] Atmel Corporation. USA. ATmega16 Datasheet. 2010. 357s. Dostupné z WWW: < http://www.atmel.com/Images/doc2466.pdf >.
[3] Philips Electronics. Netherlands. 74HCT138 Datasheet. 2012. 19 s. Dostupné z WWW: < http://www.nxp.com/documents/data_sheet/74HC_HCT138.pdf >.
[4] Liteon. USA. PC847 Datasheet. 2012. 5 s. Dostupné z WWW: < http://www.us.liteon.com/downloads/LTV-817-827-847.PDF >.