Szervo kalibralasa

Huszti Andras kyrk at villamvadasz.hu
Wed Dec 20 14:40:36 CET 2006


Hali!

> Tudom mi az, legalábbis a definícióját:) Olvastam is, de nem láttam még uC-n megvalósítva. Az analógot meg úgysem értem. Ezért lett volna jó, lett volna egy sanszom megérteni.

Megprobalom leirni, hogy en , hogyan valositottam meg PIC-ben durva
kozelitessel egy PID szabalyozot.

Tulajdonkeppen a PID szabalyozo harom reszbol all.

P -tag. O a bemeneti jellel aranyos jelet kepez a kimeneten. uC-ben ez
sima szorzaskent realizalodik.

I-tag. A bemeneti jelet integralja. Tehat a kimeneti jelhez mindig
hozzadja az eppen aktualis bemeneti erteket. uC-ben ez tobbfelekeppen
valosulhat meg. Altalban kell hozza egy FIFO regiszter. Alapbol
nullakkal feltoltve. Egyik vegen tomkodod be a szamokat. A masik vegen
meg egy ido utan ezek kipotyognak. Ami a FIFO-ban van azt osszeadod
mindig es ez lesz a kimenet. Tehat regiszterek osszeadasarol van szo.
Lehet tetezni a dolgot ugy is, hogy egy regiszterhez hozzaadod az eppen
berakott szamot es a kipotyogo szamot meg kivonod. Igy 2 muvelettel
elvegzed az egeszet, es nem kell a FIFO osszes elemet osszeadni. Az
integratornak van egy integralasi ideje. Ez az az ido ami alatt a
kimeneti jel eleri a bemeneti jel erteket, ha a bemeneti jel egysegugras
fuggveny. Ez uC-ben tulajdonkeppen az I-tag lefutasanak gyakorisagat
jelentni, pl. Interrupt timer.

D-tag. Ez a bemeneti jel diferencialtjat adja a kimenetre. Azaz a
bemeneti jel valtozasat. Legegyszerubb megvalositasa ket regiszterrel
lehetseges. Az egyik a bemenet mostani(n<=BE) erteket tarolja a masik
pedig az elozojet (n, n-1). Kivonod a kettot egymasbol es meg is van
valtozas. Illetve ezt meg el kell osztani az idokulonbseggel (ami lehet
1) Ezutan pedig a mostani erteket at kell masolni az elozo ertek
regiszterebe (n-1<=n). "A differenciáló tag jellemzője a differenciálási
idő (Td), ami azt jelenti, mekkora idő alatt kell egységnyit változni a
bemenő jelnek ahhoz, hogy egységnyi kimenő jelet produkáljon."
http://www.part-ner.hu/szakcikk/pidsuli2/index.html

Hirtelen csak a PI szabalyozo megvalositasat talaltam meg:
Timer0 hivogatja meg a PI szabalyozo rutinjat
if ((INTCONbits.TMR0IF)&&(INTCONbits.TMR0IE))
{ //check for TMR0 overflow
 INTCONbits.TMR0IF = 0;            //clear interrupt flag
 TMR0L = 100; 
// szabalyozo bemeneti jelenek a kepzese egy egyszeru kivonassal:
//innentol elojeles szamokkal kell dolgozni!!!!
 rendelkezo = alap-ellenorzo;
//alap jel-et soros porton kapja
//ellenorzo jel pedig az ADkonverterrol jon egy masik interruptreszben
 if (rendelkezo > 0) 
 {//itt beallitom a motor iranyat
  LATCbits.LATC1=0;  
 }
 if (rendelkezo < 0) 
 {
  LATCbits.LATC1=1;  
 }
//tulajdonekeppen a P_I rutin az egesz lelke a dolognak.
// bemeneti jele a rendelkezo jel.
//abs azert kell az elojelre nincs szukseg. hiszen az elojel a motor
//iranyat allitja, azaz a H-hidat. Ezert a P_I szabalyozo kimeneti
//jelenek csak az abszolut ertekere vagyunk kivancsiak
 pwm_reg = si2uc(abs(P_I(rendelkezo)));

 PWM_DUTY =  pwm_reg;
}

A P_I szabalyozo rutin:

signed int P_I(signed int in)
{
signed int temp;
unsigned char i;
integrator_num = 0;
//int_be egy globalis valtozo
integrator[int_be++] = in;
// fifo regiszter osszeadasa (lassu valtozat)
for (i=0;i<LEN;i++)
{
 integrator_num += integrator[i];
}
//ha betelt a fifo akkor ujra kezdi feltolteni. korbe-korbe tolti
if (int_be == LEN)
{
 int_be = 0;
}
//P tag!
temp = (in * (AP/100));
//I tag integralasi idot nem a timer interrupt hatarozza meg hanem az AI
//erteke. Ez igy egyszerubb.
temp = temp + (integrator_num/AI);
return temp;
}

En a programomban soha nem szamoltam vissza az AI erteket konkret
masodperc ertekre. Tehat Ai= 100 erteke nem 100s-s integralasi idot
jelent. Jelen esetben a probalgatas hive vagyok.



More information about the Elektro mailing list