Vytvořeno: 2010-10-28 23:31:58
Změněno: 2012-04-04 13:01:57
Tento obvod byl vyvinut pro potřeby robotického ramene PidiArm, přesněji pro řízení jeho modelářských serv. Důvod pro vyvinutí vlastního řízení byl ten, že běžně dostupné obvody většinou nejsou schopny provádět plynulý pohyb samy a je nutné jej realizovat způsoby, které jsou náročné na rychlost komunikace s nadřízeným obvodem. Servo7QG však tento a další problémy řeší, a proto si vystačí i s relativně pomalou I2C sběrnicí.
Serva jsou k mikrokontroléru M9S08QG8CBPE (IC1) připojeny přes odpor 1 kΩ, který slouží jako alespoň malá ochrana před přepětím, které by se při poruše mohlo na řídící pin dostat. Při potřebě zvýšené ochrany těchto výstupů by bylo vhodné použít např. zenerovy diody. Velikost plošného spoje však měla větší prioritu, a proto taková důmyslnější ochrana použita nebyla. Piny řídících signálů byly zvoleny tak, aby byl plošný spoj co nejjednodušší. Vývody PTA4 a PTA5 nebyly využity, jelikož PTA5 je schopny fungovat jen jako logický vstup a PTA4 je určen pro BDM rozhraní. Pro další úsporu je k taktování mikrokontroléru využit interní zdroj hodinového signálu nastavený na 8,192 MHz.
Napájení mikrokontroléru zprostředkovává stabilizátor LE33CD (IC2) v SMD pouzdru SO08, který je schopný pracovat se vstupním napětím až 18 V a dodávat proud až 100mA. Kondenzátor C1 nejen slouží pro funkci stabilizátoru, ale také pro krátkodobé vykrytí poklesů napětí při mechanickém zatěžování serv. Pro lepší vykrývání proudových špiček by bylo vhodné ještě před kondenzátor C1 zařadit tlumivku dimenzovanou.
Komunikační sběrnice se připojují přes konektor X2 určený pro konektory samořezné. Zapojení pinů bylo zvoleno tak trochu nešťastně a to z důvodu použití Servo7QG pro řízení robotického ramene PidiArm. Pro volbu komunikační sběrnice slouží jumper J8. Jeho stav je přečten pouze jednou hned po nastartování mikrokontroléru a při jeho běhu jej není možné změnit.
Toto schéma, zejména zapojení konektoru X2, slouží jen jako příklad zapojení řídícího obvodu Servo7QG a předpokládá se, že si každý přizpůsobí schéma a hlavě plošný spoj své aplikaci.
Komunikační protokol je pro obě komunikační rozhraní stejný. I2C adresa jednotky Servo7QG je 0x5E (0x101111X), kde X určuje směr komunikace (1 - čtení, 0 - zápis).
Možné je nastavovat natočení jednotlivých servomotorů nebo všech servomotorů najedou. Plynulá změna natočení a rychlost této změny se odesílá pro každý servomotor zvlášť. Aktuální hodnoty natočení je také možné číst a tak kontrolovat, zda již bylo dosaženo žádané cílové polohy. Hodnota natočení může být v rozsahu 1 až 4095 a hodnota rychlosti v rozsahu 1 až 255. Příkazy (změna natočení, vypnutí atd.) jsou prováděny hned po přijmutí příkazu.
Čtení aktuálních nastavených délek řídících pulzů se provádí pro všechny serva najednou, tj. Servo7QG odešle 14 bajtů hodnot natočení (7 hodnot 1 až 4095). Při komunikaci prostřednictvím sběrnice I2C se čtení provádí rovnou (stačí pouze správné nastavení R/W bitu při volání I2C adresy. Při komunikaci prostřednictvím rozhraní UART je však potřeba nejprve vyslat znak (0x52) 'R'. Po přijmutí tohoto znaku odešle jednotka Servo7QG všech 14 bajtů.
Při komunikaci přes rozhraní UART je možné změnit baudrate, pokud je 9600 baud, nastavených po restartu, nedostatečných. Rozsah možných rychlostí je 2400 až 57600 baud. Dále viz tabulka s výčtem všech příkazů.
Příkaz | 1. bajt | Další bajty | |
Nastavení všech serv | 0x41 (‘A‘) | 14 bajtů hodnot natočení (hodnoty 1 až 4095 pro 7 serv) |
|
Nastavení jednoho serva | 1 bajt - Zvolení serva 0x30 až 0x36 (‘0’ až ‘6‘) |
2 bajty - Natočení (1 až 4095) |
|
Plynulé nastavení jednoho serva |
0x46 (‘F’) | 1 bajt - Zvolení serva 0x30 až 0x36 (‘0’ až ‘6‘) |
2 bajty - Natočení (1 až 4095) |
Nastavení rychlosti plynulého pohybu serva |
0x53 (‘S’) | 1 bajt - Zvolení serva 0x30 až 0x36 (‘0’ až ‘6‘) |
1 bajt - Rychlost (1 až 255) |
Vypnutí všech serv | 0x58 (‘X’) | 0x41 (‘A’) | |
Vypnutí zvoleného serva | 0x58 (‘X’) | 1 bajt - Zvolení serva 0x30 až 0x36 (‘0’ až ‘6‘) |
|
Čtení natočení serv (Pouze pro UART) |
0x52 (‘R’) | ╳ | |
Změna baudrate (Pouze pro UART) |
0x42 (‘B’) | '1' => 2400 baud, '2' => 4800 baud, '3' => 9600 baud, '4' => 19200 baud, '5' => 38400 baud, '6' => 57600 baud |
Zdrojové kódy Servo7QG (ke stažení zde) se skládají ze souborů main.c, tpm.c, iic.c, sci.c a inicializačnímy soubory vygenerovanými komponentou "Device Initialization". V souboru tpm.c je implementováno samotné generování řídících impulzů a v iic.c a sci.c obsluha komunikačních sběrnic. Komunikační protokol byl implementován v main.c (metoda ProccesCommandBuffer).
Pro generování řídících impulzů byl použit pouze jeden 16 bitový čítač/časovač. Ten přeteče každé 2,5 ms. Tento čas odpovídá hodnotě čítače 5119 = 1023 + 4096 (1023 je offsetová hodnota a odpovídá času 0,5ms). Při přetečení časovače je ukončena obsluha aktuálního serva a je obslouženo servo následující. Obsluha všech sedmi serv tedy celkem trvá 17,5 ms (7 x 2,5 ms) z čehož vyplývá opakovací frekvence řídících pulzů 57 Hz.
Délka pulzu je řízena tak, že na začátku každé obsluhy je na daném pinu nastavena log. 1 a do "value" registru nultého kanálu časovače je uložena hodnota žádaného natočení (1 až 4095). Tato hodnota je hardwarově komparovaná s hodnotou 16 bitového čítače a pokud dojde ke shodě je vyvoláno přerušení (isrVtpmch0). V obsluze toho přerušení dojde k nastavení log. 0 na pinu právě obsluhovaného serva.
Pokud je nastavena rychlost pro plynulý pohyb není do "value" registru nultého kanálu časovače hned uložena hodnota žádaného natočení (tak jak popisuje předchozí odstavec), ale k hodnotě, která je ve "value" registru je přičtena hodnota odpovídající nastavené rychlosti. Délka řídícího pulzu se tak změní o 0,5 až 125 us (Tyto hodnoty vyplývají z 8 bitového rozsahu hodnoty "rychlost" a z rozlišení řídícího pulzu a to následovně: inkrement = rychlost*((2,5 - 0,5)/4096) ). K této inkrementaci dochází při každé obsluze serva (tedy jednou za 17,5 ms) až do té doby, než je dosaženo cílové hodnoty.
Díky jednoduchosti tohoto zařízení bylo možné použít jen jednovrstvý plošný spoj. Pasivní součástky pro povrchovou montáž jsou ve velikostech 1206. Pro mikrokontrolér byla použita obyčejná patice, jelikož nebyl osazen konektor pro připojení programovacího a ladícího rozhraní BDM.
Osazení horních součástek | Osazení spodních součástek | Spodní vrstva (600 dpi) |
R1 až R7 | 100 Ω | Odpor SMD1206 |
R8 | 2,7 kΩ | Odpor SMD1206 |
R9, R10 | 47 kΩ | Odpor SMD1206 |
C1 | 470 uF / 16 V | Elyt. kondenzátor 10x13 mm, RM5 mm |
C2, C4 | 100 nF | Keramický kondenzátor SMD1206 |
C3 | 10 uF / 16 V | Elyt. kondenzátor 4x7 mm, RM1.5 mm |
LED1 | 3mm zelená 2 mA | |
IC1 | MC9S08QG8CBPE | Mikrokontrolér HCS08 DIP16 |
IC2 | LF33CD | Stabilizátor 3,3 V, 100 mA, SO08 |
X1 | K375A | Napájecí konektor 2,1 mm |
X2 | MLW10 | Konektor 5x2 pin s roztečí 2,54 mm |
JP1 až JP7 | Lámací kolíky 7x1 pin a 7x2 RM2,54 mm | |
JP8 | Lámací kolíky 1x2 pin RM2,54 mm | |
Obyčejná patice DIP 16 |
Funkčnost Servo7QG byla ověřena na robotickém ramenu PidiArm a zejména při použití nízké komunikační rychlosti se ukázala výhodnost plynulého nastavování řídících impulzů.
Jistě by bylo vhodné použité algoritmy využít pro řízení více než sedmi modelářských serv a při použití mikrokontroléru s alespoň jedním 16 bitovým časovačem navíc implementovat sofistikovanější plynulé pohybování s větším rozlišením a s možností rampování.
Nakonec malá prezentace toho co Servo7QG dovede. Přes UART rychlostí 9600 baud je ovládáno maximální množství modelářských serv. Nejprve jsou všechna natočena do krajních poloh, poté do středu a nakonec jsou postupně plynule natáčena.
Tweet |