ATtiny13A:

Ovládání serva pomocí napětí



Úvod

Když jsem vyráběl krmítko pro psa s malým servomotorem, napadlo mně, že by mohlo být užitečné vytvořit nějaký jednoduchý obvod, který by podle analogové hodnoty napětí dokázal otáčet s hřídelkou serva. 

Využil jsem k tomu můj oblíbený mikrokontroler ATtiny13A.

První verze programu byla velice jednoduchá. Servo se otáčelo v rozsahu -90° až +90° v závislosti na vstupním napětí 0V až 5V. 

Výsledná křivka převodu napětí na úhel vypadala takto:

Postupem času jsem ten program vylepšil tak, že je možné nastavit nejen "dorazy", za které se servo nemůže dostat, ale také je možné zvolit, při jakém vstupním napětí se má servo k těmto dorazům přiblížit.

Jedná se o 4 parametry, které jsou uloženy ve vnitřní EEPROM obvodu ATtiny13, a které určují:

  •  minimální úhel natočení serva

  •  napětí, při kterém se servo na tento minimální úhel natočí

  •  maximální úhel natočení serva

  •  napětí, při kterém se servo na tento maximální úhel natočí

Pokud vstupní napětí překročí nastavený interval, zůstane servo natočené ke zvolenému dorazu.


Schéma


vetší rozlišení po kliku na obrázek

To samé schéma ve formátu pro Eagle: servodriver.sch

Když už jsou nastaveny parametry pro body MIN a MAX na převodové křivce, stačí už jen zapojit servo podle tohoto schématu:


Zjednodušené schéma pro běžné použití po nastavení převodové křivky.


Nastavení parametrů:

Parametry, které určují způsob převodu napětí na úhel, se nachází na prvních 4 adresách ve vnitřní EEPROM.
První možností, jak je změnit, je přímá editace této EEPROM přes programátor (například s použitím programu eXtreme Burner). V tom případě se k ATtiny nemusí připojovat servisní trimr ani tlačítka.

Požadovaný úhel je třeba ručně přepočítat z intervalu -90° až +90° na číslo 0x00 až 0xFF.
Stejně tak požadovanou hodnotu napětí je také třeba přepočítat z intervalu 0V až Vcc (5V) na číslo 0x00 až 0xFF

Je nutné dodržet podmínku, že nastavený minimální úhel je menší, než nastavený maximální úhel.
Pokud tato podmínka není splněna, vyhodnotí to program jako chybu v EEPROM a pokusí se nastavit defaultní parametry:
adresa význam parametru hodnota (číslo) hodnota (fyzikální veličina)
0 minimální úhel 0x00 -90°
1 napětí pro minimální úhel 0x00 0V (GND)
2 maximální úhel 0xFF +90°
3 napětí pro maximální úhel 0xFF  napájecí napětí ATtiny (5V)


Příklad hodnot v EEPROM při zobrazení programem eXtreme Burner

 

Servisní režim:

Druhý (komfortnější) způsob nastavení parametrů je obsažen přímo v programu - tzv. "Servisní režim".


Když se při resetu (nebo při zapnutí napájení) drží tlačítko MIN, je možné pomocí servisního trimru nastavit minimální úhel natočení serva v rozsahu od -90° až do úhlu, který je aktuálně nastaven v EEPROM jako maximální úhel. Otáčením trimru se zároveň natáčí hřídel serva.

Za stálého držení tlačítka MIN se na hlavní měřící vstup připojí takové napětí, při kterém se má servo na minimální úhel natočit.

Po uvolnění tlačítka MIN dojde k zápisu obou parametrů minimálního bodu do EEPROM a servisní režim se ukončí.


Podobným způsobem se provede nastavení a uložení parametrů pro maximální bod.
Při resetu se zároveň drží tlačítko MAX, servisním trimrem se nastaví požadovaný maximální úhel natočení serva. Tento úhel je možné nastavit v rozsahu od minimálního úhlu, který je zapsán v EEPROM, až do +90°.
Na hlavním měřícím vstupu se nastaví takové napětí, při kterém se má servo natočit do maximální polohy.

Po uvolnění tlačítka MAX dojde k zápisu dvou parametrů pro maximální bod do EEPROM a servisní režim se ukončí.


Po návratu ze servisního režimu už nemá servisní trimr žádnou funkci.
V normálním režimu tlačítka simulují natáčení serva do minimální a nebo maximální polohy - nezávisle na napětí na hlavním měřícím vstupu.

(Video s nastavením parametrů v servisním režimu je níže.)


Takže například je možné nastavit, aby servo dojelo na -30° při vstupním napětí 2V a při napětí 4V se natočilo na maximální doraz, který je nastaven třeba na +45°.
Mezi těmito dorazy se servo natáčí lineárním převodem podle vstupního napětí.
Při překročení napěťových mezí zůstává servo natočené k dorazům.


Křivka závislosti natočení serva na vstupním napětí pro předchozí příklad.




Dokonce je možné pomocí vhodně zvolených parametrů docílit toho, že se servo při zvyšování napětí natáčí směrem k minimálnímu dorazu.


Křivka pro tyto parametry:
minimální úhel = +10°
napětí pro minimální úhel = 2V (A/D převodník = 102)
maximální úhel = +50°
napětí pro maximální úhel = 1V (A/D převodník = 51)



Software 

POZOR! před použitím si prosím přečtěte doplnění z 19.1.2020 na konci této stránky

Komentovaný zdroják: attiny_servo.ino

Přeložený HEX soubor pro ATtiny13A: attiny_servo.hex


Průběhy PWM signálů, kterými se servo ovládá:


Generování signálu pro minimální úhel (šířka 2,5ms)

   


Generování signálu pro střední úhel (šířka 1,5ms)

  


Generování signálu pro maximální úhel (šířka 0,5ms)

 


Video

 
Po kliknutí na obrázek s popisky se přehraje video na YouTube.

 


Doplnění 19.1.2020

Od nějaké verze překladače není pro ATtiny13 možné používat ve funkci "delayMicroseconds()" jako parametr proměnnou.

Tuto funkci používám pro časování při generování PWM impulzů pro servo.

Bylo nutné program trochu předělat.
Změna se týká nahrazení dvou řádek:

delayMicroseconds(mikropauza);

těmito smyčkami:

for (int mp = 0 ; mp < (mikropauza/4) ; mp++)
{
delayMicroseconds(2);  // pauza v mikrosekundach
 }

Přepočet už není tak přesný, jako v původní verzi programu (verze 7).
Pokud nepotřebujete dělat v programu změny, použijte původní HEX soubor verze 7, který nahrajete přes AVRDUDE (nebo přes nějakou grafickou nadstavbu - např AVRDUDESS)

Jestliže potřebujete v kódu dělat nějaké úpravy, musíte si sehnat starší kompilátor zdrojáku pro verzi 7, nebo
 použijte upravenou verzi 8.
verze zdroják HEX
7 attiny_servo.ino attiny_servo.hex
8 attiny_servo8.ino



úvodní strana webu AstroMiK.org

poslední úprava stránky 19.1.2020