Professional Documents
Culture Documents
Lời mở đầu
Lời cảm ơn
1.2.3/ Thiết kế phần mềm điều khiển và giám sát trên máy tính………….…10
2.1.1/Thông số kỹ thuật……………………………………………………... 12
2.2.1/Nhận dạng mô hình động học của động cơ điện một chiều……………15
2.2.2/Thu thập dữ liệu vào/ra của động cơ điện một chiều từ thực nghiệm….21
2.2.3/Nhận diện động cơ một chiều bằng Toolbox Identification của Matlab..23
Có thể nói trong lĩnh vực điều khiển và trong công nghiệp thì bộ điều khiển PID có
ứng dụng kha rộng rãi, một giả pháp đa năng cho các ứng dụng cả Analog cũng
như Digital. Thống kê cho thấy có tới hơn 90% các bộ điều khiển sử dụng trong
thực tế là PID. Rõ ràng nếu có thiết kế và chọn lựa các thông số hợp lý cho bộ điều
khiển PID thì việc đạt được các chỉ tiêu chất lượng mong muốn là khả thi Bộ điều
khiển PID cũng giúp người sử dụng dễ dàng tích hợp cũng như chọn các luật điều
khiển như : tỉ lệ(P), tích phân(I), tỉ lệ tích phân(PI), tỉ lệ vi phân(PD)… sao cho
phù hợp đối với các đối tượng điều khiển. Nhiều quá trình trong công nghiệp việc
sử dụng bộ điều khiển PID là không thể thay thế như khống chế nhiệt độ, mức, tốc
độ…? Ngay cả những lý thuyết điều khiển hiện đại cũng không cho ta những hiệu
quả cao như bộ điều khiển PID mang lại.Ngoài ra bộ điều khiển PID còn ứng dụng
nhiều trong điều khiển thích nghi,bền vững vẫn mang lại hiệu quả cao trong các cơ
cấu chỉnh định.
Bài toán thiết kế và điều khiển động cơ một chiều là bài toán cơ bản và quen thuộc
trong ngành cơ điện tử. Có thể thiết kế điều khiển cho đối tượng độngcơ điện một
chiều theo nhiều phương pháp như :dùng PLC & biến tần, điện tử công suất, vi
điều khiển… Mỗi phương pháp có ưu và nhược điểm khác nhau nhưng đều có mục
đích ổn định và điều khiển được tốc độ động cơ. Ngày nay vi điều khiển phát triển
sâu rộng và ngày càng ứng dụng nhiều trong cài đặt thiết kế bộ điều khiển cho các
đối tượng công nghiệp. Trên cơ sở muốn tìm hiểu về lĩnh vực điều khiển tự động
chúng em chọn đề tài: Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC. Vì
khả năng và thời gian có hạn nên không thể tránh khỏi những thiếu sót trong
project. Do vậy chúng em rất mong được thầy cô và bạn bè đóng góp xây dựng để
đồ án của chúng em được hoàn thiện hơn.
Lời cảm ơn
Đầu tiên chúng em xin chân thành gửi lời cảm ơn tới nhà truờng, khoa Cơ Khí
Máy, bộ môn Cơ Điện tử, các thầy cô đã dạy dỗ và dìu dắt chúng em trong suốt 3
năm học vừa qua để có được những kiến thức chuyên môn cơ sở sau này chúng em
có thể vào đời làm việc, sử dụng có ích cho xã hội.
Để thực hiện thành công project là sự hướng dẫn, chỉ bảo tận tình của TS Trương
Nguyễn Vũ, Người đã hướng dẫn tận tình , giúp chúng em định hướng, góp ý và
cung cấp ý tưởng cũng như chỉ dẫn tài liệu và các tiến trình thực hiện project .Sự
hướng dẫn của thầy là một yếu tố quan trọng để chúng em có thể hoàn thành
project này .
Cuối cùng chúng em xin chân thành gửi những lời cảm ơn sâu sắc đến cha mẹ và
gia đình, những người luôn sát cánh cùng chúng em, nuôi dưỡng chăm sóc chúng
em tạo điều kiện tốt nhất cho chúng em học tập để có kết quả như ngày hôm nay.
+Máy tính.
c/Khối động lực điều khiển-Sử dụng L298D-Thay thế mạch cầu H
L298D Datasheet:
Chương1:Thiết kế bộ PID số
-Truyền dữ liệu máy tính lên thông qua cổng truyển thông RS232.
-Tính toán đầu ra cho bộ điều khiển thiết kế,trong đề tài là bộ PID số.
1.2.3/ Thiết kế phần mề m điều khiển và giám sát trên máy tính.
2.1.1/Thông số kỹ thuật:
-Có gắn liền với encoder quang tương đối 200 xung.
Encoder:
Chương 2 : Điều khiển động cơ điện 1 chiều
Để điều khiển số vòng quay hay vận tốc động cơ thì chúng ta nhất thiết phải đọc
được góc quay của motor. Một số phương pháp có thể được dùng để xác định góc
quay của motor bao gồm tachometer (thật ra tachometer đo vận tốc quay), dùng
biến trở xoay, hoặc dùng encoder. Trong đó 2 phương pháp đầu tiên là phương
pháp analog và dùng optiacal encoder (encoder quang) thuộc nhóm phương pháp
digital. Hệ thống optical encoder bao gồm một nguồn phát quang (thường là hồng
ngoại – infrared), một cảm biến quang và một đĩa có chia rãnh. Optical encoder lại
được chia thành 2 loại: encoder tuyệt đối (absolute optical encoder) và encoder
tương đối (incremental optical encoder). Trong đa số các DC Motor, incremental
optical encoder được dùng và mô hình động cơ servo trong bài này cũng không
ngoại lệ. Từ bây giờ khi tôi nói encoder tức là incremental encoder. Hình 2 là mô
hình của encoder loại này.
Encoder thường có 3 kênh (3 ngõ ra) bao gồm kênh A, kênh B và kênh I
(Index). Trong hình 2 bạn thấy hãy chú ý một lỗ nhỏ bên phía trong của đĩa quay
và một cặp phat-thu dành riêng cho lỗ nhỏ này. Đó là kênh I của encoder. Cữ mỗi
lần motor quay được một vòng, lỗ nhỏ xuất hiện tại vị trí của cặp phát-thu, hồng
ngoại từ nguồn phát sẽ xuyên qua lỗ nhỏ đến cảm biến quang, một tín hiệu xuất
hiện trên cảm biến. Như thế kênh I xuất hiện một “xung” mỗi vòng quay của
motor. Bên ngoài đĩa quay được chia thành các rãnh nhỏ và một cặp thu-phát khác
Chương 2 : Điều khiển động cơ điện 1 chiều
dành cho các rãnh này. Đây là kênh A của encoder, hoạt động của kênh A cũng
tương tự kênh I, điểm khác nhau là trong 1 vòng quay của motor, có N “xung” xuất
hiện trên kênh A. N là số rãnh trên đĩa và được gọi là độ phân giải (resolution) của
encoder. Mỗi loại encoder có độ phân giải khác nhau, có khi trên mỗi đĩa chĩ có vài
rãnh nhưng cũng có trường hợp đến hàng nghìn rãnh được chia. Để điều khiển
động cơ, bạn phải biết độ phân giải của encoder đang dùng. Độ phân giải ảnh
hưởng đến độ chính xác điều khiển và cả phương pháp điều khiển. Không được vẽ
trong hình 2, tuy nhiên trên các encoder còn có một cặp thu phát khác được đặt
trên cùng đường tròn với kênh A nhưng lệch một chút (lệch M+0,5 rãnh), đây là
kênh B của encoder. Tín hiệu xung từ kênh B có cùng tần số với kênh A nhưng
lệch pha 90o. Bằng cách phối hợp kênh A và B người đọc sẽ biết chiều quay của
động cơ. Hãy quan sát hình 3.
2.2.1/Nhận dạng mô hình động học của động cơ điện một chiều
Cấu trúc mô hình động học được đề xuất tham khảo các tài liệu điều khiển tự động
có dạng:
Cơ sở lý thuyết:
2.2.2/ Thu thập dữ liệu vào/ra của động cơ điện một chiều từ thực nghiệm
Đồ thị trên thể hiện vận tốc của động cơ theo thời gian tuân theo qui tắc:
-Động cơ chạy với 80% PWM trong thời gian 3s sau đó dảo chiều.
ح
J = = 0.680272 ∗ 10
k
Phương pháp xác định J’,B’: 1
B = = 0.01088
k
∆w 73.5
k= = = 91.875
0.8 0.8
w=72.5(rad/s)
=ح41.6667(ms)
k = 90.625
=> J = 0.000459
B = 0.1103
Vì đáp ứng của động cơ ở phần chạy thuận và chạy nghịch là gần như giống nhau
nên ta tính 2 thông số J’,B’.Nếu như đáp ứng chạy thuận và chạy nghịch của động
cơ là khác nhau ,chúng ta phải tìm 4 thông sô J’,B’ và J”,B”.
Mô phỏng Matlab:
Chương 2 : Điều khiển động cơ điện 1 chiều
2.2.3/Nhận diện động cơ một chiều bằng Toolbox Identification của Matlab:
Chương 2 : Điều khiển động cơ điện 1 chiều
Xuất số liệu từ mô phỏng ra bảng excel: Số liệu từ thực nghiệm:
Chương 2 : Điều khiển động cơ điện 1 chiều
>>ident
Chương 2 : Điều khiển động cơ điện 1 chiều
Tính toán:
>>sysc=d2c(pss1,'zoh');
>>step(sysc);
>>[a,b,c,d]=ssdata(sysc);
>>[num,den]=ss2tf(a,b,c,d);
>>ss=tf(num,den);
>>step(sysc);
= 2ѡ −
= ′ѡ
= 0.0138
=>
= 0.1836
2.3.2/Giải thuật chương trình
{v=(count*3.14/2)/2;
err = setpoint - v;
up=kp*err;
ui=ui + ki*err*0.02;
pid = up + ui ;
if(pid>=256.0)pid=256.0;
if(pid<=0.0)pid=0.0;
pwm((int)pid);}
Chương 2 : Điều khiển động cơ điện 1 chiều
2.3.3/Ảnh hưởng của wn đến hệ thống
Nhiễu là các biến mà nó không chứa trong mô hình hệ thống nhưng ảnhhưởng đến
đáp ứng của hệ thống. Chúng có thể được xác định, chẳng hạn nhưmômen tải trong
hệ thống điều khiển vị trí, cũng như các nhiễu từ các cảm biến hay từ cơ cấu chấp
hành.
Chương 2 : Điều khiển động cơ điện 1 chiều
Điều khiển động cơ với bộ PI chưa có lọc nhiễu:
v=(count*3.14/2);
vf=vf+3.18*0.02*(v-vf);
err = setpoint - vf;
up=sp*err;
ui=ui + si*err*0.02;
pi = up + ui ;
if(pi>=256.0)pid=256.0;
if(pi<=0.0)pid=0.0;
pwm((int)pi);
Chương 2 : Điều khiển động cơ điện 1 chiều
ii. Đồ thị vận tốc :
Bộ điều khiển PI có bộ lọc nhiễu trung bình với vận tốc ѡ =30rad/s
Ở tốc độ này cũng với cách lọc nhiễu trung bình,mặc dù đã được loại bỏ nhưng
động cơ vẫn bị ảnh hưởng nhiều.
Do đó,độ mịn của đồ thị còn rất thấp.
Chương 2 : Điều khiển động cơ điện 1 chiều
Bộ điều khiển PI có bộ lọc nhiễu trung bình với vận tốc ѡ =50rad/s
Chạy ở tốc độ cao hơn,động cơ ít bị ảnh hưởng bởi nhiễu hơn do đó độ mịn của đồ
thị được tăng lên.
Chương 2 : Điều khiển động cơ điện 1 chiều
Bộ điều khiển PI có bộ lọc nhiễu trung bình với vận tốc ѡ =100rad/s
Chạy ở tốc độ cao động cơ ít chịu ảnh hưởng của nhiễu vì thế độ răng cưa đã giảm
bớt đáng kể.
Chương 2 : Điều khiển động cơ điện 1 chiều
2.4/Điều khiển vị trí
Các hệ số:
K2 = 2J‘ѡ –B’
K1 k2 =J‘ѡ 2
= 0.00068027
= 0.01088
Giải thuật:
v=count*3.14/2.0;
vf=vf+3.18*0.02*(v-vf);
err = setpoint - post;
u2=k2*(k1*err-vf);
u2=abss(u2);
CCPR2L=(int)u2;
Chương 2 : Điều khiển động cơ điện 1 chiều
ѡ =50
Hệ thống chỉ đáp ứng được với những vị trí có góc >=60(rad),còn đối với những
góc nhỏ hơn thì không thể đáp ứng được.
Xung PWM được điều chế không đủ điện áp cho động cơ chạy với những góc nhỏ
ѡ =80
Hệ thống có thể đáp ứng được với góc nhỏ khoảng 30(rad).
ѡ =100
ѡ =200
Động cơ có thể quay được với các góc nhỏ hơn 10(rad)
ѡ =250
Với những vị trí có góc càng lớn thì độ chính xác càng cao.
Vẫn chưa khắc phục được sai số ở các vị trí có số đo góc thấp.
Kết luận:
ѡ càng nhỏ hệ thống đáp ứng càng lâu,đồng thời không đáp ứng được những vị
trí có góc nhỏ.
Chương 2 : Điều khiển động cơ điện 1 chiều
ѡ nhỏ sai số càng lớn.
ѡ càng lớn,thời gian đáp ứng nhanh,sai số nhỏ đồng thời đáp ứng được các vị trí
có góc nhỏ.
Giải thích:
Khi ѡ nhỏ,các hệ số K1 và K2 nhỏ nên tín hiệu hồi tiếp về cho vi điều khiển cấp
xung PWM nhỏ nên không đủ điện áp cho động cơ chạy.
Ngoài ra,động cơ có độ “trì hoãn” ban đầu nên ít nhiều đã ảnh hưởng đến sai số.
Một nguyên nhân khác có thể là các hệ số J’,B’-rất quan trọng-chúng ta tìm chưa
chính xác hoặc chưa hợp lý.
Muốn điều khiển chính xác các vị trí có góc nhỏ chúng ta cũng cần có thuật toán
lọc nhiễu,xác định mô hình toán của động cơ thật chính xác đồng thời cách điều
chế xung PWM cũng phải hợp lý,chính xác và nhanh.
Chương 2 : Điều khiển động cơ điện 1 chiều
Phụ lục code phần mềm:
#include<htc.h>
#ifndef _XTAL_FREQ
#endif
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<conio.h>
char x;
char data;
bit tx;
char send;
char chuoi[20];
Chương 2 : Điều khiển động cơ điện 1 chiều
char i;
void ram();
void forward();
void backward();
void brake();
void velocity();
void reset();
void delstr(void);
int err;
float q;
float sp;//=0.070748;
float si;//;=2.44897;
float sd;//=0.1;
ANSEL=ANSELH=0;
TRISE0=TRISE1=0;
dir=0;
ham=0;
TRISC2=1;
TRISC1=0;
T2CKPS1=0;
T2CKPS0=0;
CCP2CON = 0X0C;
DC2B0 = 0;
DC2B1 = 0;
TMR2ON=1;
TXSTA = 0x24;
RCSTA = 0x90;
SPBRGH = 2;
Chương 2 : Điều khiển động cơ điện 1 chiều
SPBRG = 8;
RCIF=0;
RCIE=1;
PEIE=1;
GIE=1;
TRISA4=1;
T0CS=1;
T0SE=0;
PSA=1;
TMR0=0;
//NGAT TIMER0
T0IE=1;
T0IF=0;
//THIET LAP TIMER1 LAM TIMER DINH THOI GIAN LAY MAU 20ms
TMR1CS=0;
T1CKPS0=1;
T1CKPS1=0;
T1SYNC=1;
//T1OSCEN=1;
TMR1L=0Xb0;
TMR1H=0X3c;
Chương 2 : Điều khiển động cơ điện 1 chiều
TMR1ON=1;
TMR1IF=0;
TMR1IE=1;
tx=0;
while(1)
//Ngat Uart
if(RCIE&&RCIF)
RCIF=0;
data=RCREG;
switch(data)
//setpoint
case 'v':
Chương 2 : Điều khiển động cơ điện 1 chiều
setpoint=atoi(chuoi);
i=0;
delstr();
break;
case 't':
tx=1;
RE1=1;
RE0=0;
break;
//stop
case 's':
brake();
pwm(0);
break;
//gui kp
case 'p':
sp=atof(chuoi);
i=0;
delstr();
break;
//gui ki
Chương 2 : Điều khiển động cơ điện 1 chiều
case 'i':
si=atof(chuoi);
i=0;
delstr();
break;
//gui kd
case 'd':
sd=atof(chuoi);
i=0;
delstr();
break;
case 'z':
reset();
break;
default:
chuoi[i++]= data;
break;
}
Chương 2 : Điều khiển động cơ điện 1 chiều
//Ngat T1 10ms
if(TMR1IE&&TMR1IF)
TMR1IF=0;
TMR1ON=0;
TMR1L=0Xb0;
TMR1H=0X3c;
TMR1ON=1;
count=x*256+TMR0;
x=0;
TMR0=0;
velocity();
//ram();
if(tx)
//k++;
printf("%d\n",vf);
}
Chương 2 : Điều khiển động cơ điện 1 chiều
//Ngat T0
if(T0IE&&T0IF)
T0IF=0;
x++;
void guikytu(char c)
while(TXIF==0);
TXREG=c;
while(*s){
guikytu(*s++);
guikytu(c);
void delstr(void)
chuoi[i]='\0';
return;
int pwm(int a)
int n;
if (a>=100)
n=100;
CCPR2L=125;
TMR2ON=1;
Chương 2 : Điều khiển động cơ điện 1 chiều
}
else
n = (a*125)/100;
CCPR2L = n ;
TMR2ON=1;
return;
void forward()
dir=1;
ham=0;
void backward()
dir=0;
ham=1;
}
Chương 2 : Điều khiển động cơ điện 1 chiều
void brake()
ham=1;
pwm(0);
TMR2ON=0;
pid=0;
double abss(double a)
double b;
if (a<0){
b=-a;
else {
b=a;
return b;
void velocity()
vf=count*3.14/2;
up=sp*err;
ui=ui + si*err*0.02;
//der=(err-errold)/0.02;
pid = up + ui ;
pid=abss(pid);
if(pid>=256.0)pid=256.0;
if(pid<=0.0)pid=0.0;
pwm((int)pid);
void reset()
setpoint=v=count=TMR0=x=0;
sp=si=0;
err=0;
pid=0.0;
dir=0;
ham=0;
}
Chương 2 : Điều khiển động cơ điện 1 chiều