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ů.

Žádné komentáře:

Okomentovat