Tải bản đầy đủ - 0 (trang)
Hình 4.16 Lưu đồ giải thuật VĐK

Hình 4.16 Lưu đồ giải thuật VĐK

Tải bản đầy đủ - 0trang

Kp=4.1

Ki=0.09

Kd=17



Kp=4.8

Kd=0.2

Kd=15



Kp=5

Ki=0.1

Kd=17



Kp=0.1

Ki=0.02

Kd=1



42



Kp=0.2

Ki=0.002

Kd=2



Kp=0.1

Ki=0.02

Kd=1



 BẢNG KHẢO NGHIỆM VỊ TRÍ:

Số lần

khảo

nghiệm

1

2

3

4

5

6

7

8

9

10



Thời

gian

Số xung Vị trí tính Số xung dò Vị trí

% POT xác

tính tốn tốn (độ)

được

thực tế

lập

(ms)

234

234

209,7

209

11,4

1200

234

234

209,7

210

10,95 600

234

234

209,7

211

11,42 600

234

234

209,7

210

11,9

1500

234

234

209,7

210

10,95 500

234

234

209,7

209

14,28 1000

234

234

209,7

211

11,42 700

234

234

209,7

210

10,95 600

234

234

209,7

211

17,4 1200

234

234

209,7

210

12,38 900



PID



3.4 0.2 30

3.4 0.2 29

3.4 0.2 30

3 0,2 30

3,01 0,2 30

3 0,2 30

3,01 0,2 30

3 0,2 30

4 0,2 30

3 0,2 30



 BẢNG THÍ NGHIỆM VẬN TỐC



STT



Số xung

đặt



Giá trị vận

Giá trị vận Số xung dò

Vận tốc

tốc lý

tính tốn

được

thực tế

thuyết

(vòng\phút) (xung\giây) (vòng\phút)

(xung\giây)



43



Bộ PID



1

2

3

4

5

6

7

8

9

10



30

30

30

30

30

30

30

30

30

30



450

450

450

450

450

450

450

450

450

450



1800

1800

1800

1800

1800

1800

1800

1800

1800

1800



44



32.4

24.3

23.4

33.3

31.5

29.7

31.5

32.4

32.4

30.6



2160

1620

1560

2220

2100

1980

2100

2160

2160

2040



Kp=0,5

Ki=0.0001

Kd=18



Chương 5

KẾT LUẬN VÀ ĐỀ NGHỊ

5.1 Kết luận

Sau thời gian 12 tuần thực hiện, đề tài đã hoàn tất với kết quả như sau:

-



Phần cứng:

o Hoàn thành mạch điện điều khiển cho tồn hệ thống.



-



Phần mềm:

o Hồn thành chương trình điều khiển của vi điều khiển PIC16F877A.

o Hồn thành chương trình điều khiển giám sát trên máy tính.



Tuy nhiên đề tài vẫn còn một số hạn chế:

-



Việc điều khiển vẫn chưa hồn tồn chính xác, vẫn tồn tại sai số.



Chương trình giám sát vẫn còn ở dạng thử nghiệm, chưa hồn thiện các chức năng cần

có.

5.2



Đề nghị

 Nâng cấp phần cứng:

 Thay thế vi điều khiển những dòng PIC cao hơn để có đạt độ chính xác cao

hơn và chức năng xử lý hiệu quả hơn.

 Sử dụng IC cầu H chun dụng để giảm kích thước mạch điện và có tốc độ

đáp ứng cao hơn.

 Sử dụng encoder thẳng để có thể điều khiển vị trí chính xác.

 Nâng cấp phần mềm:

 Phát triển thêm phần điều khiển vị trí độ lên điều khiển trên bàn máy.

 Hoàn thiện chương trình điều khiển trên máy tính.



45



TÀI LIỆU THAM KHẢO

[1] Ngơ Diên Tập. Vi Điều Khiển với Lập Trình C. Nhà xuất bản Khoa Học và Kỹ

Thuật. 2006.

[2] Nguyễn Đức Thành. Điều Khiển và đo lường bằng máy tính. Nhà xuất bản đại

học quốc gia TPHCM

Một số website:



[1] http://www.picvietnam.com/forum/showthread.php?t=612

[2] http://vi.wikipedia.org.com

[3] http://www.pduytech.com/ProductsBurnerBurn-E.html



[4] www.msdn.com

[5] Các diễn đàn cơ điện tử, google+datasheet.



46



PHỤC LỤC

Phục lục 1: Chương trình vi điều khiển PIC

bit chieu =0,kt_t,tx,mode; //chay thuan

char IN,k=0,str_count=0,re_char,nhan,count_send;

char RxBuf[32], RdPtr=0, RwPtr = 0;

unsigned long send;

int count,sp, pos,vel,v,s_vel,pos_old,vel_old,TMR_temp,b = 0;

int

old_xung,err,err_vel,sum_err,sum_err_vel,old_err,d_err,old_err_vel,d_err_vel,pid_int,

pid_int_vel,h,m,n;

float kp,ki,kd,pid_out,pid_out_vel;

char str[7];

void init ();

char uart_getc();

void uart_putc(char c);

void delay_ms(unsigned int x);

void pid();

void pid_vel();

void get_str();

void reset_counter();

void pid();

void xoa_mang();

interrupt ngat();

//#define sp 300

void main(){

char d;

init();

while(1){

if(RdPtr != RwPtr) //tao kho chua du lieu nhan

{

d = RxBuf[RdPtr];

RdPtr++;

RdPtr &= 0x1F;

}

}

}

interrupt ngat(){

if (T0IF&&T0IE){

T0IF= 0;

k++;

if(k==9)TMR0 = 60;// DINH 2ms



if(mode==0){

if(k==10){

k =0;

TMR_temp = TMR1;

if(chieu==0)

pos = (TMR_temp+old_xung);

else pos = (old_xung-TMR_temp);

pos_old = pos;

if((count_send++)==5){

count_send = 0;

IN= 0;

if(tx==1)printf("\f%d\n",pos);

TMR_temp = TMR1; // cap nhat lai position

if(chieu==0)

pos_old = (TMR_temp+old_xung);

else pos_old = (old_xung-TMR_temp);

}

pid();

}

}

else {//mode==1:velocity

if(k==10){

k =0;

TMR_temp = TMR1;

TMR1=0;

vel=TMR_temp;

vel_old = vel;

pid_vel();

if((count_send++)==5){

count_send = 0;

IN= 0;

if(tx==1)printf("\f%d\n",vel);

TMR_temp = TMR1; // cap nhat lai velocity

}

}

}

}

if(RCIF&&RCIE){

get_str();

}

//ngat onchange

if (INTF&&INTE){

INTF = 0;

TMR_temp = TMR1;

if(chieu==0){old_xung +=TMR_temp;RA3=1;}

else {old_xung-=TMR_temp; RA3=0;}



INTEDG =~INTEDG;

chieu =~chieu;

reset_counter();

}

}

void pid(){

err = sp - pos;

sum_err +=err;

if(sum_err>32000) sum_err=32000;

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

d_err = err - old_err;

old_err = err;

pid_out = kp*(float)err+ki*(float)sum_err +kd*(float)d_err;

if(pid_out>0){RA1 =0;RA2 = 1;} //QUAY THUAN

if(pid_out<0){RA1 = 1;RA2 = 0;}

if(pos==sp){

sum_err=0;

RA1 = 1;RA2 = 1;}

if(pos>(sp*0.9)&&pos
kt_t=0;

RA1 = 1;RA2 = 1;

}

if(pid_out<0)pid_int = -((int)pid_out);

else pid_int = (int)pid_out;

if(pid_int>6000)pid_int = 6000;//6165

//

if(pid_int <4000) pid_int = 4000;

TMR2ON = 0;

CCPR1L = pid_int/80;

TMR2ON = 1;

}

void pid_vel(){

err_vel = s_vel - vel;

sum_err +=err_vel;

if(sum_err_vel>32000) sum_err_vel=32000;

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

d_err_vel = err_vel - old_err_vel;

old_err_vel = err_vel;

pid_out_vel += kp*(float)err_vel+ki*(float)sum_err_vel +kd*(float)d_err_vel;

//if(pid_out_vel>6000)pid_out_vel= 6000;//6165

TMR2ON = 0;

CCPR1L = pid_out_vel/45;

TMR2ON = 1;

}

void init(){



ANSEL = ANSELH = 0;

//khai bao Counter1

TMR1CS=1;//clock ngoai

T1OSCEN = 0;

T1CKPS1=0;//scale la 1

T1CKPS0=0;

T1SYNC=0; //k dong bo

TMR1ON=0;

TMR1IE=1;

TMR1IF=0;

TMR1=0;

PEIE=1;

// khai bao RS232

TXSTA = 0x24;

RCSTA = 0x90;

BRG16 = 1; //chon baund rate 20MhZ/(20*(520+1))~9600

SPBRGH = 2;

SPBRG = 8;

RCIF=0;

RCIE=1;

PEIE=1;

GIE=1;

// khai bao timer0 dinh thoi

INTEDG = 1; // ngat tren canh len cua INT

T0CS = 0;

PSA = 0;

PS2 = 0;

PS1 = 0;

PS0 = 1;

TMR0 = 0;// dinh thoi 2ms

T0IF = 0;

T0IE = 0;

//KHAI BAO PWM

TRISC2=0;

TRISC1=0;

PR2=249;//TAN SO PWM LA 10K

T2CKPS0=0;

T2CKPS1=0;//PRESCALE=16;

CCP1CON=0X0C;

TMR2IF=0;

TMR2ON=0;//tat timer2 roi moi thay doi do rong xung

CCPR1L=0;//PWM

TMR2ON=1;//bat timer2 lai

// khoi tao ngatINT

TRISA1 = TRISA2 =TRISA3= 0;



RA1 = RA2 =RA3= 0;

TRISB0=1;

ANS12=0;

INTEDG=0; // NGAT CANH XUONG

INTF=0;

INTE=1;

GIE = 1;

//lcd_init();

_delay(100);

}

void get_str(){

RCIF=0;

RxBuf[RwPtr] = RCREG;

RwPtr++;

RwPtr &= 0x1F;

//dulieu=RCREG;

re_char = RCREG;

if(re_char == 'p'){

str_count = 0;

kp = atof(str);

_delay(10);

xoa_mang();

}

else if(re_char =='i' ){

str_count = 0;

ki = atof(str);

_delay(10);

xoa_mang();

}

else if(re_char == 'd'){

str_count = 0;

kd = atof(str);

_delay(10);

xoa_mang();

}

else if(re_char == 'v'){

str_count = 0;

s_vel = atoi(str);

_delay(10);

xoa_mang();

}

else if(re_char == 'o'){

str_count = 0;

sp = atoi(str);

_delay(10);



//p



//i



//d



//velocity



//position



xoa_mang();

}

else if(re_char == 'm'){

//mode

str_count = 0;

mode=1;

_delay(10);

xoa_mang();

}

else if(re_char == 'n'){

//mode

str_count = 0;

mode=0;

_delay(10);

xoa_mang();

}

else if(re_char=='l'){

str_count = 0;

tx=0;

_delay(10);

xoa_mang();

}

else if(re_char=='k'){

str_count = 0;

tx=1;

_delay(10);

xoa_mang();

}

else if(re_char =='s'){

// s : start

old_xung =vel=vel_old= pos = pos_old = 0;

kt_t=1;

TMR2ON = 0;

CCPR1L =150;

TMR2ON = 1;

RA1 = 0; // quay thuan

RA2 = 1;

TMR1ON=0;

T0IE = 0;

TMR1 = 0;

TMR0 = 0;

TMR_temp=0;

chieu = 0;

INTEDG=0; // NGAT CANH XUONG

err = 0;

sum_err = 0;

d_err = 0;

count_send = 0;



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Hình 4.16 Lưu đồ giải thuật VĐK

Tải bản đầy đủ ngay(0 tr)

×