Zobrazují se příspěvky se štítkemregulátor. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemregulátor. Zobrazit všechny příspěvky

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