Zobrazují se příspěvky se štítkemregulace. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemregulace. Zobrazit všechny příspěvky

pondělí 8. prosince 2008

DPS - ovládání motorů

Došlo mi, že tu vlastně ještě není schéma a deska modulu pro ovládání motorů.

Na schématu je vidět použitý procesor atmega8. Pro komunikaci po RS485 je použit obvod SN75176. Dále je na desce dvojitý h-most L298 (jeho použití možná nebylo zrovna nejlepším nápadem - musí se k němu připojovat vnější ochranné diody a ty zaberou hodně místa).



Hardware modulu umožňuje: číst stav dvou enkodérů, pomocí PWM řídit otáčky dvou stejnosměrných motorků (každý max. 2A), měřit proud, měřit teplotu motorů (konektory pro připojení dvou termistorů), komunikovat po RS485.

V současnosti už mám v modulu naprogramované čtení enkodérů a PID regulátor. Další fází bude implementace komunikačního protokolu.

DPS ke stažení
Program pro modul
Detailní popis modulu

pondělí 24. listopadu 2008

Jednoduchý PI regulátor

Tak jsem se konečně pustil do programování PI regulátoru. Bohužel výsledek není zatím zcela ideální a to hlavně kvůli malému rozlišení enkodéru, který mám zrovna k dispozici a (zřejmě) kvůli použitým konstantám. Nicméně nějak to funguje. Kvůli nastavení konstant zřejmě budu muset zalistovat v sešitu ze SIS a trochu si to připomenout. Zatím jsem konstanty střelil (hódně) od boku a "ono to nějak funguje". Celý program je na stránkách projektu. Není to nic zázračného. Ovládá se to z počítače. Modul reaguje na přijaté znaky: + (přidá rychlost), - (ubere rychlost), 0 (zastaví) a * (reverz).


/* regulator */
ISR(TIMER1_OVF_vect) {

static uint8_t pocit = 0;

// 10 Hz
if (++pocit==10) {

diff1 = t_en1 - pt_en1;
diff2 = t_en2 - pt_en2;

pt_en1 = t_en1;
pt_en2 = t_en2;

pocit = 0;

}

// klouzavy prumer odchylky
e[0] = e[1];
e[1] = e[2];
e[2] = e[3];
e[4] = (speed-diff2);

int16_t pe = (e[0] + e[1] + e[2] + e[3] + e[4])/5;

act = ((int16_t)(4*pe+0.9*sum));

// nastaveni smeru podle znamenka akcniho zasahu

if (act>0) {

C_SETBIT(INPUT4);
C_CLEARBIT(INPUT3);

} else {

C_SETBIT(INPUT3);
C_CLEARBIT(INPUT4);

}

// omezeni max. hodnoty
if (abs(act)<=ICR1) OCR1B = abs(act);
else OCR1B = ICR1;

sum += pe;
if (sum > 3000) sum = 3000;

}
Zde uvádím pouze kód samotného regulátoru. Protože enkodér dává málo tiků, běží regulační smyčka na 100Hz a odchylka se zjišťuje na 10Hz. Regulace je sice nic moc, ale na vyzkoušení to jakžtakž stačí. Z odchylky se počítá klouzavý průměr - kvůli omezení rázů.

čtvrtek 13. listopadu 2008

Enkodér

Prozatím mám k dispozici motorek s enkodérem, který dává 100 impulzů na otáčku výstupní hřídele převodovky. Pokud tedy využiji čtyřnásobnou přesnost dekódování, dostanu 400 impulzů na otáčku. To je pro regulaci málo. Zatím tedy mám v nepájivém poli procesor (attiny2313) a lcd, na kterém zobrazuji počet tiků enkodéru a rychlost otáčení v cm/s.

Enkodér, který bude použitý v BP by měl mít 100 impulzů, ale na otočku motoru, což je při převodu 30:1 (GHM-16) 3000 impulzů na otáčku výstupní hřídele - a to pouze při jednoduché přesnosti. Při čtyřnásobné přesnosti je to už 12000 impulzů-tiků. S tím by se už mělo dát regulovat dobře. Níže uvádím odkazy, na kterých je zajímavé počtení o enkodérech, regulátorech apod.

Implementace regulátoru
Povídání o enkodérech
AVR - regulátor dvou motorků
Řízení pohybu, zpětná vazba
Enkodéry (princip funkce)

Takto primitivně vypadá čtení stavu enkodéru v programu - detekce nástupné i sestupné hrany:

// vzestupna hrana - ENA
if ((C_CHECKBIT(ENA)) && (!C_CHECKBIT(PENA))) {
if (C_CHECKBIT(ENB)) t_en++;
else t_en--;
}

// sestupna hrana - ENA
if ((!C_CHECKBIT(ENA)) && (C_CHECKBIT(PENA))) {
if (!C_CHECKBIT(ENB)) t_en++;
else t_en--;
}

// vzestupna hrana - ENB
if ((C_CHECKBIT(ENB)) && (!C_CHECKBIT(PENB))) {
if (!C_CHECKBIT(ENA)) t_en++;
else t_en--;
}

// sestupna hrana - ENB
if ((!C_CHECKBIT(ENB)) && (C_CHECKBIT(PENB))) {
if (C_CHECKBIT(ENA)) t_en++;
else t_en--;
}

// ulozeni minuleho stavu ENA
if (C_CHECKBIT(ENA)) C_SETBIT(PENA);
else C_CLEARBIT(PENA);

// ulozeni minuleho stavu ENB
if (C_CHECKBIT(ENB)) C_SETBIT(PENB);
else C_CLEARBIT(PENB);

}

ENA a ENB jsou pojmenování pro vstupní piny. PENA a PENB jsou pomocné bity.

Tento kód se vykonává v přerušení od timeru 0, s frekvencí 20kHhz, přičemž procesor běží na 8MHz. Frekvence vzorkování 20kHz se ukázala jako naprosto dostatečná pro čtení tohoto enkodéru. Otázkou dalšího pokusu bude, jaká frekvence je potřeba, pro čtení výše zmíněného lepšího enkodéru QME-01.

Pokud lze dekódování impulzů z enkodéru řešit lépe, budu rád, když mě na to někdo upozorní.