background image

 

~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; 

background image

 

  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); 

background image

 

      } 
    } 
  } 
  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.