1
~K.
Data wykonania: 25.05.2010
Data oddania: 08.06.2010
Mikronapędy w systemach komputerowych
Laboratorium
Ćwiczenie 6
Regulatory cyfrowe w układach sterowania silników prądu stałego.
2 FDI Grupa: L-04
Cel ćwiczenia
Napisanie programu który będzie sterował silnikiem prądu stałego. Będzie można mierzyć prędkość
obrotową silnika która będzie wyświetlana na ekranie.
Kod programu
#include
<reg515.sfr>
#include
<lcd.h>
//Biblioteki z funkcjami obsługuj
ą
cymi wy
ś
wietlacz i
//klawiatur
ę
unsigned
char
x;
unsigned
int
var = 50, delta, e=0, e_1=0, e_2=0;
float
odp, tmp;
void
opoznienie(
int
x){
int
j;
for
(j = 1; j < x; j++);
}
_interrupt 1
void
int_T0 (
void
){
unsigned
int
aktualna;
DAPR = 8;
while
(BSY);
aktualna = ADDAT;
e = var - aktualna;
tmp = CCL1;
odp = tmp + 0.9 * e + 0.45 * e_1 + 0.45 * e_2;
//Równanie regulatora na podstawie którego wyznaczamy odpowied
ź
czasu
e_2 = e_1;
e_1 = e;
CCL1 = var;
if
(CCL1 < 30)
CCL1 = 30;
if
(CCL1 > 250)
CCL1 = 250;
else
CCL1 = odp;
}
int
main(){
//deklaracje liczników i zegarów
init();
EAL=1;
ET0=1;
TMOD=1;
TR0=1;
T2R1=1;
T2I0=1;
CRCH=0xFF;
2
CRCL=0x00;
CCH1=0xFF;
CCL1=var;
CCEN = 8;
CLK=1;
P3_5=0;
while
(1){
int
a, b;
if
(var < 30)
//je
ż
eli obroty <30
var = 30;
// to utrzymuj na poziomie 30
if
(var > 250)
//je
ż
eli obroty>250
var = 250;
//to utrzymuj na poziomie 250
x = get_char();
if
(x >=
'0'
&& x <=
'9'
){
liczba = 10*liczba+(x-48);
put_char(x);
}
x=get_char();
if
(x ==
'e'
){
if
(liczba < 30)
liczba = 30;
if
(liczba > 250)
liczba = 250;
put_instr(0x02);
opoznienie(2000);
x = get_char();
if
(x ==
'g'
){
// spr. czy wci
ś
ni
ę
to strzałk
ę
w gór
ę
if
(var < 250)
// spr. czy warto
ść
pr
ę
dko
ś
ci jest mniejsza od max. dopuszczalnej
CCL1 = ++var;
// je
ś
li, to zwiekszenie odpowiedzi regulatora
put_instr(0x02);
delta = CCL1 * 100 / 255;
// wyliczanie wspołczynnika wypełnienia
a = delta / 10;
// wyłuskanie warto
ś
ci dziesi
ą
tnych
b = delta % 10;
// wyłuskanie warto
ś
ci jedno
ś
ci
put_char(a + 48);
put_char(b + 48);
opoznienie(2000);
}
if
(x ==
'd'
){
// spr. czy wci
ś
ni
ę
to strzałk
ę
w dół
if
(var > 0)
// spr. czy warto
ść
pr
ę
dko
ś
ci jest wi
ę
ksza od 0
CCL1 = --var;
// je
ś
li, to zmniejszenie odpowiedzi regulatora
put_instr(0x02);
delta = CCL1 * 100 / 255;
a = delta / 10;
b = delta % 10;
put_char(a + 48);
put_char(b + 48);
opoznienie(2000);
3
}
}
}
opoznienie(2000);
return
0;
}
Wnioski
Na zajęciach dowiedzieliśmy się jak mierzyć prędkość obrotową silnika prądu stałego, które liczniki i
zegary powinny być uruchomione i jakie blokady wprowadzone, aby nie przeciążyć silnika i go nie
spalić. Niestety pomimo wielu prób i ocenie naszego programu przez prowadzącego na zajęciach
okazało się, że silnik nie działa tak płynnie jak w innych zespołach, tzn. co chwile zwiększał i
zmniejszał swoją prędkość w obrębie określonych wartości. Program reagował poprawnie na
wciskanie przycisków strzałka w górę i w dół – odpowiednio zwiększał prędkość obrotów lecz praca
silnika wciąż nie była stabilna.