| |
|
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)
-
delovno območje spreminjanja vrtljajev
od 0 do nazivni (na osi motorja) v obe smeri
-
dovoljeno regulacijsko odstopanje +- 5%
od nazivnih vrtljajev (v stacionarnem stanju)
-
sprotni prikaz dejanskega položaja, hitrosti,
reference in odstopanja v številski ali grafični obliki na zaslonu osebnega
računalnika
-
Start/Stop regulacije preko stikala "S1"
na kontrolnem panelu
-
signalizacija odstopanja vrtljajev za
več kot 10% (LED indikator na kontrolnem panelu)
-
signalizacija vrtenja v levo ali desno
(LED)
-
signalizacija odstopanja položaja za več
kot +-5 delcev (LED3)
-
vnos parametrov regulatorja (v "Off-line"
režimu) preko tipkovnice osebnega računalnika
-
vnos referenčne pozicije in maksimalne
hitrosti (v "On-line" režimu oz. med delovanjem pogona)
-
možnost kasnejše dopolnitve krmilnega
sistema s funkcijami: regulacija položaja, vodenje hitrosti po izbranem
profilu, nadzor toka, temperature,
-
kot testni model servomotorja z napajalnikom
in vključenim tokovnim regulatorjem uporabite enosmerni motor nizke moči
(20W) s krmilnim vhodom -10V do +10V, tahogeneratorjem in inkrementalnim
dajalnikom (144 p/obrat)
-
kot krmilni sistem uporabite Miniaturni
krmilnik MPU in osebni računalnik (PC)
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
}