Teraz prichádza na rad presnejší popis regulátora - hardvéru a v 3. časti bude podrobnejší popis softvéru.
autor: Andrej B.
pripravil: Janko O.
Úvodná poznámka Janka O.:
V komentároch k 1. časti Andrejovho miniseriálu sa objavili v podstate pravdivé pochybnosti o význame amatérskej stavby jednosmerného regulátora v dnešnej dobe lacných čínskych výrobkov.
Ale výstižné zdôvodnenie, prečo to má význam aj dnes, napísal v komentároch "Vašek 133":
Já jsem se mnoho let věnoval radioamatérské činnosti, navrhoval jsem a stavěl měřící přístroje a různé elektronické pomucky pro doma. Později jsem se věnoval přijímačům i vysílačům pro amatérská pasma a k tomu samozřejmě i příslušným zařízením pro měření i nastavování. Nejdále jsem se dostal k cmos obvodům. Velký skok v elektronice byl přechod na mikroprocesory, které dokážou velmi jednoduše-obvodově nahradit klasická zapojení. Programování jsem ale už nezvládl a proto obdivuji všechny, kteří to umí. Dá se dnes vše koupit, ale člověku vždy udělá největší radost, když si něco udělá sám a ono to funguje. To je vlastně podstata všech amaterských technických činností. Držím Andrejovi palce a těším se na jiné nápady, které bude realizovat.
A teraz už Andrej:
Najprv
popíšem obvodové riešenie regulátora - hardvér.
Regulátor samotný aj palubná sieť sú napájané z pohonného akumulátora. Toto napätie stabilizuje monolitický stabilizátor, nízko-úbytkový (LM2940 - 5), keďže pri vybíjaní akumulátora sa napätie dostáva na hodnotu nižšiu ako minimálna dovolená pre obyčajné stabilizátory.
Napätie akumulátora je sledované mikrokontrolérom pomocou analógového komparátora, kde na jeden vstup je privádzané cez delič Uaku a na druhý referencia získaná deličom z výstupu stabilizátora. Referencia nemá žiadne zvlnenie (napr. prenesené zo vstupu stabilizátora), takže s ňou nie sú problémy.
Paralelne k napájaniu mikrokontroléra je
pripojený keramický kondenzátor na potlačenie rušenia ním
spôsobovaného. Hneď na vstupe regulátora je pripojený
kondenzátor. Jeho úlohou je odľahčiť akumulátor od prúdových
špičiek: pri napájaní jednosmerného motora nie je nutný, ale
ani neuškodí.
Signál z prijímača je do mikrokontroléra
privádzaný priamo, bez úprav, na vstup Input Capture.
Na
výstupe mikrokontroléra je PWM signál riadiaci motor. Motor je
spínaný výkonovým MOSFETom, na jeho Gate (G)
chcem dostať čo najvyššie napätie, takže tam privádzam celé
Uaku. Rozhodol som sa na to použiť optočlen, keďže to vychádzalo
jednoduchšie a menšie ako použiť 2 tranzistory. Hlavnou
podmienkou bolo aby bol MOSFET otvorený len keď je na výstupe MCU
jednotka, vždy inokedy musí byť zavretý (preto sa to nedalo
vyriešiť 1 tranzistorom). Odpor medzi G a zemou slúži na zavretie
MOSFETu po zavretí optočlenu. Spínacia frekvencia je 490 Hz.
Paralelne k motoru je pripojená nulová dióda, keďže motor je
indukčná záťaž. Regulátor (a palubná sieť) sa zapína
pripojením akumulátora.
Ako som už písal, všetky funkcie regulátora riadi mikrokontrolér. Tu som použil typ ATtiny 2313, lebo som ho mal v zásobe a nechcel som kupovať nový (lepší by bol ATtiny 26, ten má aj ADC, čo by umožňovalo lepšie sledovanie Uaku).
Tento mikrokontrolér obsahuje časovače, ktoré umožňujú jednoducho merať vstupný signál z prijímača a generovať šírkovo modulovaný signál pre riadenie motora.
Na sledovanie napätia
používam analógový komparátor. MCU je taktovaný vnútorným RC
oscilátorom s frekvenciou 1 MHz.
Po zapnutí regulátora program
nenabehne hneď, ale počká 2 s aby sa obvod určite ustálil (U,
signál z Rx). Potom si zmeriam, akú má
šírku impulz pri plyne v polohe vypnuté. Túto
hodnotu používam pre výpočet výstupu. Keď sa kalibrácia
úspešne skončila, regulátor to oznámi pípnutím motorom.
Ako
zmerať šírku impulzu? Pomocou 16b časovača s funkciou Input
Capture. Časovač voľne beží, taktujem
ho 1 MHz, teda 1 krok je 1 µs, na jeho vstup prichádzajú impulzy z
Rx. Keď príde nábežná hrana, Input
Capture uloží aktuálnu hodnotu časovača.
Ja si ju v prerušení odložím a zmením
nastavenie, aby čakal na dobežnú hranu. Potom keď príde dobežná
hrana, udeje sa podobná akcia. Odčítaním času kedy prišla
nábežná, od času keď prišla dobežná získam šírku impulzu.
Pokiaľ by som chcel poznať aj periódu impuzlov, za každou
dobežnou hranou časovač vynulujem a čas dobežnej hrany je aj
dĺžkou periódy.
Po zmeraní impulzu na začiatku program
pokračuje do nekonečného cyklu, kde meria vstupný signál a podľa
neho a Uaku sa vypočítava výstupný signál. Keď sa akumulátor
vybíja, klesá jeho napätie a komparátor mi hlási, či je vyššie
ako porovnávacia referencia, alebo nižšie. Pokiaľ by bolo nižšie,
motor nemôže ďalej bežať - treba ho odpojiť. Zvolil som
jednoduché vypnutie, bez možnosti opätovného zapnutia.
V
spomínanom nekonečnom cykle sa výstup nepočíta neustále, ale
len za každým impulzom z Rx, po výpočte CPU spí a zobudí ho
prerušenie, keď na vstup Input Capture
príde hrana signálu. Treba vybrať taký režim spánku, kedy
periférie ďalej bežia.
Na generovanie PWM signálu pre spínanie
motora používam 8 bitový časovač s funkciou Output Compare.
Pomocou tejto funkcie je generovanie PWM jednoduché, stačí zapnúť
časovač, Output Compare
a nastaviť šírku impulzu. Po výpočte potom už len mením
hodnotu registra určujúceho šírku impulzu. O celé generovanie
signálu sa stará časovač, program doňho zasahuje len keď chcem
niečo zmeniť.
Ešte sa vrátim k výpočtu. Zmeriam
šírku vstupného impulzu, zistím o koľko je dlhší ako pri
zapnutí (vypnutý motor) a z tejto hodnoty priamo úmerne
vypočítavam výstup. Tu by sa dala vyrobiť podstatná časť
inteligencie regulátora, napr. zisťovanie aj maximálnej polohy
plynu, hysteréza vstupu (aby nereagoval na
príliš malé zmeny vstupu), pomalší rozbeh motora, ale to záleží
od požiadaviek. Jedna podľa mňa dôležitá vec je, aby regulátor
nereagoval na akýkoľvek vstupný signál (príliš úzky alebo
široký impulz) - odolnosť proti chybnému vstupu. Reakcia môže
byť rôzna, buď je takýto vstup ignorovaný, alebo vykonám nejakú
akciu, závisí od závažnosti chyby. Po výpočte šírky
výstupného impulzu túto hodnotu vložím do časovača
generujúceho výstup. Po nastavení výstupu procesor spí a zobudí
ho prerušenie, keď príde impulz z Rx.
Po odskúšaní prvej verzie som musel nejaké funkcie doladiť. Najväčšie problémy som mal s vypínaním pri poklese Uaku. Zistil som, že nie je dobré vypnúť motor pri prvom náznaku poklesu napätia, ale treba zistiť či to akumulátor myslí s vybitím vážne a až vtedy vypnúť motor. Ináč povedané, až keď je U pod hranicou po určitý čas.
Ďalším problémom bolo rušenie spôsobované mikrokontrolérom. Prejavovalo sa pri slabšom alebo žiadnom signále z vysielača. Bolo spôsobené tým, že MCU odoberá prúd v dosť ostrých špičkách a tie sa cez napájanie dostávali až do Rx, ktorý rušili.
Riešením bolo pridať
kondenzátor paralelne k napájacím vývodom (čo najbližšie).
Týmto bolo rušenie odstránené. Regulátor je umiestnený na
lietadle zvonka, takže chladenie je dostatočné a použitý chladič
z hliníkového plechu je studený. Prechádzajúci prúd je okolo
12A (na zemi), s týmto chladením by (myslím si) zvládol aj 20
A.
Regulátor lieta v tejto podobe a reguluje k spokojnosti. To by
bolo všetko čo som chcel o mojom regulátore povedať z pohľadu zapojenia, v ďalšej časti bude popis najdôležitejších častí programu.