PSD regulátor se zvukovou kartou
Nedávno jsem zahlédl na jednom fóru zmínku o regulátoru pro DC motor realizovaném
přes zvukovou kartu. To mě docela zaujalo, protože jsem si chtěl už nějakou dobu vyzkoušet diskrétní regulaci
na reálném systému, ale nechtělo se mi řešit nějaký komplikovaný analogový vstupně-výstupní interface k PC.
Použít k tomuto účelu zvukovou kartu mě skutečně nenapadlo,
ale ukázalo se to jako docela použitelné řešení. Varování: Následující text místy předpokládá alespoň základní znalost pojmů z oblasti teorie signálů a systémů a teorie řízení. ;-)
1. Vstupní interface Základ regulátoru na PC je samozřejmě nějaký vstupní interface pro senzor zpětné vazby. V případě řízení motoru, který jsem si pro ladění vybral, je pro zvukovku nejvhodnější rotační enkodér. Kvadraturní signál enkodéru lze po vhodné úpravě úrovní připojit přímo k line-in vstupu zvukovky: Nejedná se o nic jiného, než tvarvač signálu a úpravu amplitudy na cca 700mV, což je u mé zvukovky asi tak 70% fullscale signálu. 2. Výstupní interface Druhou nezbytnou součástí je výstupní interface pro regulovaný systém. V mém případě jsem se rozhodl ladit algoritmus na malém DC motorku s PWM regulací. Ze stolních sedimentů jsem sestavil následující tvarovač a výkonový stupěň:
Použité řešení není zrovna optimální, ale vhodnější komponenty nebyly po ruce. :-)
Konkrétní hodnoty součástek vychází z toho, co bylo zrovna na stole. Zapojení docela uspokojivě fungovalo v
rozsahu 100Hz až 1kHz, což je pro malé DC motorky asi tak optimum (laděno na 480Hz). Princip funkce je jednoduchý: Zesílit
signál zvukovky a derivačním členem C2, R5||R6 vytvořit zapínací a vypínací impulzy pro schmittův KO. Na výstupu IC1 by už měl být čistý PWM signál.
Drobný problém je, že při výpadku PWM signálu může KO zůstat viset v libovolném stavu. Z toho důvodu je výstupní střída z PC
omezena tak, aby vždy minimálně jeden vzorek na periodu měl opačnou hodnotu, tj. střída nikdy není 0 ani plných 100%. 3. Časování vstupu a výstupu zvukové karty Docela zásadní problém při řešení real-time řízení je vyřešit správně časování. Je zjevné, že od začátku vzorkování výstupu enkodéru (1) až ke skutečné změně výstupního signálu zvukovky (4) uplyne docela dost času. Grafické znázornění časování je na následujícím obrázku:
Přinejmenším je třeba vzít v úvahu, že zpracováním právě navzorkovaného úseku z enkodéru se získá průměrná hodnota za celý interval (1) až (2),
tj. dopravní zpoždění cca Ts/2. Dále se musí počítat s tím, že výstup musí být minimálně dvojitě bufferovaný (střídavě se do jednoho bufferu zapisuje a z druhého se přehrává), takže než se
nově naplněný buffer v okamžiku (3) dostane na DAC zvukovky (4) uplynulo by dalších Ts. Kvůli zkrácení tohoto zpoždění jsem zvolil
délku výstupních bufferů na jednu polovinu vstupních, takže i toto zpoždění dělá Ts/2. 4. Struktura programu Blokovou strukturu celého prográmku ukazuje následující diagram:
Aby bylo dodržené časování audio vstupu i výstupu, je program rozdělen na tři vlákna.
Hlavním vláknem je uživatelské rozhraní v Borland VCL. Tím jsou ovládány všechny ostatní moduly programu. 5. Něco teorie Následujících pár odstavců je zjednodušená teorie, popisující algoritmy a matematiku použitou pro jednotlivé funkce testovacího programu. 5.1 Regulátor Původní záměr byl zkusit jen obyčejný PSD regulátor (číslicová obdoba PID), ale docela pěkně to fungovalo, takže jsem nakonec implementoval tzv. beta-S-PD topologii s dynamickým omezením integrační složky, která umožňuje podstatně lépe tvarovat odezvu uzavřené smyčky. Blokové znázornění topologie ukazuje následující schéma:
Derivační složka je samozřejmě filtrovaná, nefiltrovanou nemá cenu používat, protože obvykle nadělá více škody, než užitku. S pomalým vzorkováním
je její amplituda malá a téměř se neuplatní, s rychlým by musela být pro dosažení stejné energie obrovská a takové jehlové pulzy
zrovna nesvědčí mechanické části systému. Navíc by výrazně zesílila šum. Proto je vždy rozumné použít filtrovanou verzi, která
impulz "protáhne" v čase.
Pro její diskrétní aproximaci je zde použita metoda Impulse-Area-Invariant. Tuto celkem novou metodu vyvinuli před pár lety
na VUT Brno (FEKT, ÚAMT) a pokud je mi známo, tak se jedná o jediný přímý ekvivalent spojité filtrované derivace. Korekční koeficient amplitudy je
zde vypočten tak, aby derivátor dodal systému energii identickou jako spojitá verze bez ohledu na vzorkovací periodu. Díky této příjemné
vlastnosti lze pro návrh regulátoru použít stejné metody jako pro spojitý PID regulátor. 5.2 Online identifikace systému
Po odladění vlastního audio vstupu, výstupu a regulátoru jsem si řekl, že by nebylo od věci přidat online identifikaci procesu (regulovaného systému) s automatickým
nastavováním regulátoru.
Metod online identifikace je celá řada. Nejrozšířenější je zřejmě runtime varianta metody nejmenších čtverců, ale do toho se mi moc nechtělo, takže jsem raději zrecykloval
jeden svůj starší školní projekt, kde jsem měl implementovaný neuronový ARX model třetího řádu s minimalizační metodou Steepest-Descent (déle SD). Zní to možná trochu složitě,
ale ve skutečnosti je to jedna z nejsnažších metod. kde koeficienty a1,2,3 až b1,2,3 jsou hledané paramtery systému. Třetí řád je sice pro motor zbytečně mnoho, ale na druhou stranu je třeba počítat s uvedeným dopravním zpožděním, které "spotřebuje" celý jeden člen z čitatele (b1) a výpočetní nároky nejsou na dnešních PC podstatné. Realizace toho systému neuronovým modelem je následující: Vektor vstupních vah neuronu w obsahuje jednotlivé koeficienty hledaného systému v pořadí: Vlastní algoritmus SD potřebuje ke své funkci jen dvě věci: Matici předloh X s n vzory (zpožděné vstupy a výstupy procesu) a vektor pozorování t (požadované výstupy modelu). Matice X obsahuje vždy zpožděné vstupy u a výstupy y procesu podle vzoru: kde u-k resp. y-k jsou vstupní resp. výstupní vzorky z procesu zpožděné o k period. Jednotlivé řádky matice zde odpovídají jednotlivým vzorům, na které je neuron učen (každý rádek odpovídá jedné vzorkovací periodě). Vektor pozorování t obsahuje opět výstupy procesu, ale tentokrát bez zpoždění prvního vzorku: Vlastní minimalizační algoritmus SD s tzv. optimálním krokem ε je celkem jednoduchý:
Celý algoritmus obsahuje pouze základní maticové operace, inverze při výpočtu optimálního kroku ε je pouze skalární, takže není třeba řešit
docela problematickou inverzi matice. K ukončení procesu učení dojde při poklesu chyby modelu err pod nastavený práh nebo při překročení maximálního počtu iterací.
Celý SD algoritmus je díky použití optimálního kroku ε poměrně snadný na nastavení. Je třeba pouze rozumně zvolit
počet vzorů n, tj. jak daleko nazpět v čase algoritmus "vidí". Minimální délka je omezená řádem systému s stabilitou identifikovaných parametrů na minimálně
asi 20 vzorků, maximální délka je zase omezená výpočetní náročností asi na 1000 vzorků. 5.3 Auto-tuning Když už jsem odladil identifikaci, přidal jsem také funkci pro automatické nastavování regulátoru. Metod je opět celá řada, ale zřejmě nejjednodušší je starý známý Ziegler-Nichols. K tomu je nejprve třeba vypočítat kritické parametry, tj. kritické zesílení uzavřené smyčky Kk a odpovídající periodu oscilací Tk. Pomocí těchto parametrů se pak nastavují parametry PSD: K = 0.6*KkTi = 0.5*Tk Td = 0.125*Tk Alternativní varianta s potlačením kmitavé odezvy: K = 0.3*KkTi = 1.0*Tk Td = 0.125*Tk Výpočet kritických parametrů pro systém třetího řádu je poměrně zdlouhavý. Vychází se z charakteristického polynomu uzavřené smyčky s P regulátorem:
kde Fw je přenos uzavřené smyčky, Fs přenos procesu, Fr přenos regulátoru a Kk hledané kritické zesílení.
Charakteristický polynom D obsahuje tři póly. Systém se může dostat na mez stability a zároveň kmitat jen ve dvou případech. Dosazením P1 do rovnosti charakteristickému polynomu uzavřené smyčky D lze získat dvě řešení pro kritické zesílení a periodu kmitů: Jedno z řešení je použitelné pokud jsou splněny podmínky: Pokud ani jedno řešení není platné, může nastat ještě druhá varianta: jeden reálný záporný pól na jednotkové kružnici (z = -1) a zbývající dva stabilní. Dosazením P2 do rovnosti charakteristickému polynomu uzavřené smyčky D lze získat následující řešení: Kritická perioda je v tomto případě dána jen periodou vzorkování. 6. Testovací program a ovládání Prográmek je jako obvykle napsán v BDS2006 Turbo C++ a testován ve Windows XP. Odladěn byl tentokrát na Intel Core i5 (4-jádro) a zdál se být funkční i na stařičkém P3 1GHz. Fungovat by měl i ve Windows 7 (API pro zvukovku se snad neměnily). S optimalizací jsem se nijak zvlášť neobtěžoval, takže grafy jsou celkem náročné (částečně používají velmi pomalou třídu TCanvas) a online identifikace nevyužívá pro maticové operace žádné speciální instrukční sady, takže pro vyšší počet iterací si také o nějaký ten výkon řekne.
Prográmek je částečně poskládaný ze zdrojáků, které jsem psal už dříve, tkaže je poněkud nekonzistentní, ale
zase jsem dost komentoval, takže by neměl být problém se v tom vyznat. Kromě hlavního modulu (GUI) je všechno ostatní
napsáno jen pomocí standardních knihoven C/C++ a WinApi (windows.h, mmsystem.h),
takže by neměl být problém použít moduly s jiným GUI. 6.1 Licence Zdrojový kód může být použit v libovolném projektu, ale byl napsán čistě pro studijní účely, takže autor nenese zodpovědnost za jeho funčnost a za případné škody vzniklé jeho použitím. 6.2 Nastavení zvukovky
Zvukovku je třeba nastavit externě pomocí ovladačů tak, aby měl výstup maximální
hlasitost a v možnostech záznamu vstup z LINE-IN. Citlivost vstupu bude s uvedenými hodnotami součástek patrně na maximum, vhodnou hodnotu
lze určit z oscilogramu enkodéru. 6.3 Nastavení enkodéru U grafu enkodéru lze nastavit jen počet impulzů na otáčku. Enkodér je automaticky vyhodnocován jako kvadraturní (detekce směru otáčení), takže pokud je použita jen jednoduchá optozávora, měl by být její signál přiveden na oba vstupy LINE-IN! Pokud je k řízení motoru použit plný můstek (obousměrný pohon), pak je třeba u grafu "Speed" zaškrtnout možnost "Bidirect". Ta vloží do PWM výstupu offset 50%, tj. pro nulový proud motorem bude střída 50%. 6.4 Nastavení PWM Vedle grafu PWM je možné nastavit kmitočet PWM. Rozumné hodnoty jsou tak 100Hz až 1kHz. Pro nižší by bylo třeba vyhlazovat proud motoru velkou indukčností a pro vyšší už nedostačuje vzorkovací kmitočet (zvyšuje se výstupní šum). 6.5 Nastavení regulátoru
Zde lze předně vybrat režim funkce. Jednak je k dispozici manuál, kdy se ovládá přímo střída PWM (trackbar u grafu), dále pak automat (regulátor) nebo
automat s automatickým generátorem akčního zásahu (hodí se pro identifikaci a ladění). 6.6 ARX model + Auto-tuning
V této sekci lze nastavovat parametry identifikačního algoritmu (viz popis algoritmu
5.2) a dále pak lze
provést jednorázové nastavení PSD nebo zapnout adaptivní režim (kontinuální dolaďování). Kritické parametry jsou zde pronásobeny
nastavitelnými koeficienty podle metody Ziegler-Nichols
(5.3),
pak je jimi přepsáno nastavení regulátoru. Ovlivňovány jsou pouze parametry K, Ti a Td,
ostatní je třeba nastavit ručně. 6.7 Kritické póly uzavřené smyčky Přes menu "View" lze zobrazit graf s rozložením pólů uzavřené smyčky při kritickém zesílení. Tento graf se může docela hodit při určení vzorkovací periody. Je vhodné, aby na jednotkové kružnici (mez stability) ležel kmitavý pár pólů, nikoliv zbývající reálný. Pak se totiž metodě Zigler-Nichols zdrovna moc nedaří. 6.8 Póly a nuly ARX modelu Přes menu "View" lze zobrazit zobrazit graf s rozložením pólů a nul ARX modelu. Hodí se ke grafickému znázornění pohybu kořenů čitatele a jmenovatele modelu v průběhu identifikace. Je zde použit celkem komplikovaný výpočet kořenů kubické rovnice, takže si nejsem zdela jist, jestli to vždy počítá správně, ale alespoň pro pár základních rovnic výsledky odpovídaly. 6.9 Odezva na jednotkový skok/impuls Přes menu "View" lze zobrazit zobrazit odezvu ARX modelu na jednotkový skok nebo impulz. Algoritmus vykreslování os není zrovna vyladěn, takže těžko říct, co to bude dělat třeba pro bipolární průběhy, ale zdálo se to být celkem funkční. 6.10 Ostatní Dvojklik na kterýkoliv z grafů nabídne možnost exportu 24-bit BMP obrázku. Při stisknutém tlačítku "REC" je vytvořen/přepsán soubor "rec.csv" ve složce programu a začnou se do něj ukládat hodnoty z grafů. Formát je standardní CSV oddělovaný středníkem. 7. Výsledky K testování programu jsem si vybral malý DC motorek. Nemá žádné dohledatelné označení a asi to ani není motor. Podle konstrukce je to pravděpodobně tachodynamo - má mnohapólové samonosné vinutí ve vzduchové mezeře magnetu (zádné jádro) a nijak se nezahřívá ani při 30V. Na hřídel jsem přidal malý setrvačník pro zvýšení dynamiky. Pro zpětnou vazbu jsem použil nějakou reflexní optozávoru z videa s 24 pulzy na otáčku.
Systém má poměrně rychlou odezvu (dominantní časová konstanta cca 800ms), takže jsem nastavil vzorkování na maximum (70ms).
Vzorkovací kmitočet jsem kvůli šumu nastavil na maximum (96kHz).
Akční zásah je sice trochu zašuměný, ale to je způsobeno zpětnou vazbou. S vyšší dynamikou motoru se to neprojeví,
ale asi by to chtělo nějakou lepší metodu vyhodnocovaní otáček (momentálně používám počítání pulzů a jejich celkové délky). Reakce na aditivní chybu na vstupu systému (odečtení/přistění malého proudu k PWM výstupu): Takže na závěr: Použití zvukovky jako vstupně/výstupního rozhraní k regulaci zřejmě možné je, ale dobře to bude fungovat jen za přepokladu větší dynamiky systému. Použitý přístup neumožňuje zkrátit dopravní zpoždění pod cca 80ms. (c) 2012, Stanislav Mašláň - Všechna práva vyhrazena.
|