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