Sistemi realnega časa

Praktičnem del tega predmeta  predstavlja nadaljevanje projekta iz programskega inženirstva. Tukaj se mora v programskem inženirstvu napisana specifikacija realizirati. Realizira se torej krmilni sistem za vodenje in regulacijo servopogona.

Tukaj bomo predstavili protokol, ki spremlja takšno načrtovanje. V njem je celotna C koda za krmilni sistem, ki teče na PC računalniku.


1. Definicija (kratek opis) projekta 

Naloga projekta je načrtovanje, gradnja, izvedba in testiranje krmilnega sistema za nadzor, vodenje in regulacijo položaja ter vrtilne hitrosti (vrtljajev) servopogona, izvedenega s servomotorjem s permanentnimi magneti in pripadajočim napajalnikom.

 

2. Zahteve (projektni cilji) 

3. Načrt (shema) sistema 

Pri realizaciji smo uporabili enosmerni motor nizke moči ESCAP 28 DT 12 -219. Njegove lastnosti so podane v sledeči tabeli:

 

 
 
DC motor ESCAP 28 DT 12 -219
nazivna hitrost 15 V  
nazivni vrtljaji 6900 o/min PI - tokovni regulator
nazivni navor 0.111 Nm AMP - linearni močnostni ojačevalnik v AB razredu
moč 20 W tahogenerator (enak motor) povezan z zobatim jermenom
mehanska
konstanta
12 ms inkrementalni dajalnik 144 p/obrat
  Krmilni sistem je prikazan na sliki 1.

slika 1 krmilni sistem

4. Opis krmilnega sistema 

Osnova krmilnega sistema je Miniaturni krmilnik MPU v1.1 z mikrokrmilnikom H8/532, ter kontrolnim panelom z osmimi LED diodami in stikalom S1. MPU v1.1 je povezan z osebnim računalnikom preko serijskih vrat RS 232, s procesom pa komunicira s pomočjo signalne prilagoditve preko treh 8-bitnih PWM izhodov, osmih 10-bitnih AD vhodov ter 24-bitnega ID števca.

Hitrostna in položajna regulacija se vršita na mikrokrmilniku H8/532 v povezavi z osebnim rečunalnikom, preko katerega poteka vnos parametrov regulacije v "off-line" ter vnos referenčnega položaja servomotorja v "on-line" režimu delovanja.

Kot servopogon je v našem primeru uporabljen enosmerni motor ESCAP 28DT 12-219P. Motor je krmiljen s signalom, pripeljanim preko signalne linije z MPU v1.1. Na motorju je inkrementalni dajalnik pulzov za določitev pozicije motorja, ter tahogenerator, ki kot izhod daje napetost v mejah -10V do +10V, ki je proporcionalna hitrosti vrtenja motorja.

Napost na izhodu tahogeneratorja se preko signalne prilagoditve pretvori v analogni signal napotosti od 0V do 5V, ki se preko AD pretvornika pretvorijo v digitalni signal 210 delcev, ki predstavlja digitalno vrednost trenutne hitrosti vrtenja servomotorja. 

Vrednost dobljena na ikrementalnem dajalniku se s pomočjo 24-bitnega ID števca pretvori v digitalni signal razpona od -223 do 223 delcev, ki predstavlja digitalno vrednost trenutnega položaja servomotorja.

Digitalni izhod iz mikrokrmilnika H8/532 v razponu od 0 do 250 delcev se na PWM izhodu pretvorijo v analogni signal napetosti od 0V do 5V, ki se preko signalne prilagoditve pretvori v analogni signal napetosti od -10V do 10 V, ki predstavlja krmilni signal (izhod iz regulatorja) servopogona.

 

5. Opis delovanja programa za regulacijo v realnem času Regulacijo v realnem času smo realizirali s prekinitvenim (interruptnim) programom. Glavni program sproži inicializacijo prekinitvenega programa, ki se od tega trenutka naprej odvija neodvisno (vzporedno) od izvajanja glavnega programa.

Glavni program najprej izvrši inicializacijo spremenljivk, s tipkovnice prebere parametre regulacije, izrši potrebne pretvorbe spremenljivk in izvrši incializacijo prekinitvenega programa, nakar se sproži neskončna zanka, znotraj katere se vrši sprotni prikaz dejanskega položaja, hitrosti, reference ter odstopanja v številski obliki na zaslonu osebnega računalnika ter morebiten vnos referenčne pozicije med delovanjem pogona. 

V prekinitvenem programu se odvija meritev hitrosti vrtenja in položaja servomotorja, izračun izhodnih paramterov s pomočjo računanja s fiksno vejico (fix point) ter pošiljanje rezultata preko PWM izhoda na vhod servomotorja.

6. Glavni program V glavnem programu najprej preberemo željene parametre regulatorja v zahtevanem formatu in nastavimo vrednost položaja na 0 (nastavimo ničelno točko): void main(void)

// vnos parametrov PI regulatorja

printf("Vpisi vrednost za Ts v ms (int):");

scanf("%d",&Ts);

printf("Vpisi vrednost za Ti v ms (float):"); 

scanf("%f",&Ti);

printf("Vpisi vrednost za Kp (float):");

scanf("%f",&Kp);

printf("Vpisi vrednost za Kpp (int):");

scanf("%d",&Kpp);

printf("Vpisi polozajno referenco xp (longint):");

scanf("%ld",&xp);

set_id(0); // nastavitev položaja motorja na 0

Nato glavni program opravi preračunavanje parametrov regulacije v potrebno obliko. Mikroprocesor v krmilniku je 16-bitem in hitro računa le s 16-bitnimi števili (tipa integer), zato se računanju s 32-bitnimi števili (tipa float in long integer) izognemo, saj čas izvajanja prekinitvenega programa ne sme biti dalji od časovnega intervala proženja prekinitvenih impulzov Ts. To dosežemo s tem, da namesto pračunanja z drsečo vejico (float point) uporabimo računanje s fiksno vejico (fix point). Spremenljivke pomnožimo s faktorjem 28 oz. 256, jim prištejemo 0.5 ter jih pretvorimo v integer. 0.5 smo prišteli zato, da smo izvedli pravilno zaokroževanje (sprememba v integer poreže vsa decimalna mesta). Kpp_int=Kpp*256.+0.5; // Kpp potrbujemo v int formatu

Kpkor=Kp/(512./125.); // Zaradi razlicnih napetosti

c1=Kpkor*(1.+Ts/Ti);

c2=-Kpkor; //c1 in c2 moramo skalirat (z 2^8 oz 256)

c1int=(long)(c1*256+0.5); //Pretvorba v int long in pristejemo 0.5, da zaokrozimo 

c2int=(long)(c2*256+0.5); //Pretvorba v int long in pristejemo 0.5, da zaokrozimo 

Glavni program nato sprosti tokovni PI regulator v procesu ter inicializira prekinitveni program. set_digi(1,7,1); //sprostitev regulaturja KPO7, deblokada napajalnega dela

init_int(Ts); //zacetek izvajanja prekinitvenega programa

Zatem se začne izvajati neskončna zanka, znotraj katere se na zaslonu osebnega računalnika izpisujejo trenutne vrednosti hitrosti in položaja procesa ter referenčne vrednosti. Pri izpisu le-teh prihaja do določenega časovnega zamika, saj ima prekinitveni program višjo prioriteto kakor glavni program, zaradi česar se lahko med izvajanjem enega cikla zanke glavnega programa večkrat izvrši prekinitveni program. V tej zanki je realizirana tudi morebitna "on-line" sprememba referenčega položaja motorja. while(1) 

{

hitad=hitrost;

printf(" Ref: %ld Hitr: %d Pol: %ld Hitr_ref: %d Razlika: %ld \r",xp,hitad,id,xz,e); 

if (kbhit()==1)

{

printf("\n Vpisi vrednost za referenco xp (longint):");

scanf("%ld",&xp);

}

//delay(1);

}

}

 

7. Prekinitveni program Prekinitveni program pri vsakem izvajanju vključi LED diodo ter začne izvrševati regulacijo položaja (zunanja regulacijska zanka) in regulacijo hitrosti vrtenja servomotorja (notranja regulacijska zanka). interrupt [FRT2_OCIA] void ime(void)

{

set_digi(0,3,1); // prizgemo led diodo

FRT2_TCSR&=0xdf; /* to mora biti !!! - brisanja prekinitvenega

statusnega registra */

Regulacija položaja je realizirana s pomočjo P regulatorja po enačbi, kjer je e pogrešek med dejansko vrednostjo xp in željeno vrednostjo id, xz pa vrednost izhoda iz položajnega regulatorja:
e = xp - id
xz = e × Kpp

Ker računamo s fiksno vejico, namesto konstante Kpp uporabimo njeno ekvivalentno vrednost v fix point-u Kpp_int, xz pa po koncu računanja spremenimo v float point število, tako da ga delimo s 28 oz. 256. Prekinitveni program omeji tudi izhod iz regulatorja.

// Regulacija polozaja

id=get_id(); // inkrementalni dajalnik 

e=xp-id; // vhod v polozajni regulator

xz=e*Kpp_int; // izhod polozajnega regulatorja

xz=xz>>8; // deljenje s 256

 

if(xz>32000) xz=32000; // omejitev izhoda

if(xz<-32000) xz=-32000;

 

Regulacija hitrosti je realizirana s pomočjo PI regulatorja. Algoritem izračuna PI regulatorja je rekurzivni algoritem 1. reda, za izračun uporablja le vrednosti trenutnega in vrednosti preteklega koraka. Parametre regulatorja za rekurzivni izračun smo izračunali v glavnem programu po formulah:
c1 = Kp × ( 1 + Ts/Ti)
c2 = - Kp
Ts ... čas tipanja (interval prekinitvenega programa)

Ti ... časovna konstanta PI regulatorja

Kp ... ojačanje PI regulatorja

 

// Regulacija hitrosti

hitrost=-(get_ad(0)-512); // nastavitev nicle za meritev hitrosti

// tahogenerator daje obrnjeno vrednost 

xk=xz-hitrost; // racunanje regulacijskega odstopanja

yk=yk_1+c1int*xk+c2int*xk_1; // PI diskretni regulator

if (yk>125*256) yk=125*256; // omejimo vrednost 

if (yk<-125*256) yk=-125*256; // z 256 mnozimo zaradi ...

Tudi tu omejimo izhod, ter podobno kakor pri regulaciji položaja izhod iz regulatorja delimo s 28 oz. 256. Za izračun v naslednjem koraku shranimo trenutne vrednosti xk ter yk v pomožni spremeljivki. Na koncu izvajanja prekinitveni program še isključi LED diodo. yk_1=yk; // shranimo vrednost iz predhodnega koraka

yk=yk>>8; // deljenje z 256, ker smo c1int & c2int 

// racunali v long int formatu

set_pwm(1,(unsigned char)(yk+125)); // nastavitvena velicina za PWM izhod

xk_1=xk; // shranimo vrednost iz predhodnega koraka

set_digi(0,3,0); // ugasnemo led diodo

}

Avtor: Boštjan Štumberger


V kolikor želite sodelovati z nami, vas vljudno vabimo, da se nam pridružite, pošljete članke, ali pa samo izrazite vaša mnenja.