Với các bài toán điều khiển, ngôn ngữ C/C++ d-ờng nh- là lựa chọn bắt
buộc, bởi ngôn ngữ này cho phép viết các ch-ơng trình mạnh, nhanh, nhỏ gọn,
truy nhập sâu vào phần cứng (về mặt này thì không bằng hợp ngữ). Tuy nhiên,
để tối -u phần mã điều khiển, một số đoạn trình hợp ngữ sẽ đ-ợc sử dụng thêm
vào đoạn mã C/C++.
Về công cụ và mội tr-ờng phát triển: hiện nay có hai công cụ phát triển rất
mạnh dùng ngôn ngữ C/C++, đó là Visual C++ của Microsoft và CBuilder của
Inprise (tên mới của Borland). Trong khi Visual C++ -u tiên khả năng can thiệp
sâu vào hệ thống và chỉ đóng gói đơn giản các thành phần (đồ hoạ, file,.) của
hệ thống thì CBuilder lại tận dụng tối đa khả năng h-ớng đối t-ợng trong C++
để đóng gói các thành phần hệ thống, giúp lập trình viên càng ít phải can thiệp
chi tiết vào hệ thống càng tốt. Tất nhiên CBuilder sẽ có chút hạn chế khi lập
trình viên muốn lập trình cấp thấp. Với mục đích nhanh chóng tạo ra ch-ơng
trình với giao diện phù hợp, dễ sử dụng mà vẫn đảm bảo yêu cầu về tốc độ, tính
hiệu quả, công cụ CBuilder đ-ợc chọn để thực hiện phần mềm cho bài tập này.
66 trang |
Chia sẻ: baoanh98 | Lượt xem: 1113 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Đề tài Nghiên cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ng
đ-ợc bộ -ớc l-ợng trạng
thái cho đối t-ợng.
Bộ -ớc l-ợng trạng thái đ-ợc xây dựng theo mô hình bên.
Ta có:
)1(~)1()(
)()..()1(
))(~)(.(.))(~)(.()1(~)1(
))(~)((.)(.)(~.
))(~.)(..()(.)(~.
))(~)(.()(.)(~.)1(~
)(.)(.)1(
kxkxke
keCKeAke
kxkxCKekxkxAkxkx
kxkxCKekuBkxA
kxCkxCKekuBkxA
kykyKekuBkxAkx
kuBkxAkx
Mục đích của bộ -ớc l-ợng trạng thái là phải làm sao cho e(k) tiến đến 0.
Nhận thấy hệ ph-ơng trình trên có dạng giống nh- hệ (3.2.2). Vì vậy ta có
thể áp dụng ph-ơng pháp đặt điểm cực để tìm Ke.
)1(~ kx )(~ kx y~
z-1 C B
A
Ke
Đối t-ợng
y
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
33
Với đối t-ợng cụ thể của bài tập này, ta chọn điểm cực theo Bessel cho
hệ bậc hai sao cho thời gian quá độ là T = 0.005s, suy ra điểm cực cần thiết
là:
p1,2 = (- 4.0530 2.3400i) / 0.005
và trong miền Z thì điểm cực là:
zp1,2 = exp(0.005.p1,2) = - 0.0121 0.0125i
Suy ra ph-ơng trình đặc tính mới phải là:
det(z.I – A + Ke.C) = (z – zp1)(z – zp2)
= (z + 0.0121 + 0.0125i)( z + 0.0121 - 0.0125i)
= z
2
+ 0.024164.z + 0.000302
Ta lại có:
).28473.0.13311.07408.0().73.1.23311.0.1.3705.0(
)
.23311.0.2.3705.01
.13311.07408.0.1.3705.073.1
det(
)3311.03705.0
2
1
01
7408.073.1
10
01
.det(
)..det(
2
dcdcdcdc
dcdc
dcdc
dcdc
KKeKKezKKeKKez
KKezKKe
KKeKKez
KK
Ke
Ke
z
CKeAIz
Cân bằng hai vế của ph-ơng trình đặc tính ta có hệ ph-ơng trình sau:
000302.0.28473.0.13311.07408.0
024164.073.1.23311.0.1.3705.0
dcdc
dcdc
KKeKKe
KKeKKe
Giải ra ta có nghiệm:
Ke1 = 2.9302/Kdc
Ke2 = 2.0191/Kdc
hay:
0191.2
9302.21
dcK
Ke
Đó chính là dạng tổng quát của Ke áp dụng cho bộ -ớc l-ợng trạng thái.
Thay số Kdc = 9 ta có:
22434.0
32557.0
Ke
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
34
Để tiện lợi khi khảo sát và tổng hợp hệ thống sau này, ta sẽ xây dựng
một khối con (sub-system) trên Simulink chứa bộ -ớc l-ợng trạng thái và
đặt mặt nạ (Mask) cho nó rồi đ-a vào th- viện. Sơ đồ cấu trúc của bộ -ớc
l-ợng trạng thái trên Simulink nh- hình sau:
1
xk
z
1
Unit Delay1
K
Matrix
Gain6
K
Matrix
Gain5
K
Matrix
Gain4
K
Ke
2
yk
1
uk
3.2.5. Tổng hợp hệ thống dùng hồi tiếp trạng thái:
Sơ đồ khối của hệ thống có hồi tiếp trạng thái đã đ-ợc trình bày trong
mục 2. Một thành phần đ-ợc thêm vào sơ đồ trên là bộ -ớc l-ợng trạng thái.
Tuy nhiên, nếu thuần tuý chỉ hồi tiếp trạng thái qua bộ hồi tiếp K nh- vậy
thì hệ thống sẽ có sai lệch tĩnh rất lớn. Điều này đ-ợc giải thích do trong đối
t-ợng và cả trong hệ kín đều không có khâu tích phân, ngoài ra đối t-ợng có
hệ số khuếch đại rất lớn (lên đến hơn 500). Không những thế, khi có nhiễu
tác động vào hệ thống (chủ yếu là nhiễu ở đối t-ợng) thì hệ thống sẽ bị ảnh
h-ởng rất lớn và sai lệch tĩnh sẽ có thể rất lớn. Để khắc phục đ-ợc vấn đề
này, có hai giải pháp có thể đ-ợc sử dụng:
Dùng các khâu bù đầu vào và bù song song để giảm sai lệch tĩnh
của hệ thống và hạn chế ảnh h-ởng của nhiễu nh- hình d-ới. Thực
tế, ph-ơng pháp này không thể triệt tiêu hẳn đ-ợc sai lệch tĩnh và
vẫn chịu ảnh h-ởng không nhỏ của nhiễu. Sở dĩ nh- vậy là vì khi
thiết kế bộ bù, ta không thể tính chính xác đ-ợc các thông số mà
luôn có sự làm tròn, và bản thân các thông số của đối t-ợng cũng
sẽ bị thay đổi trong quá trình hoạt động.
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
35
Đ-a thêm khâu tích phân vào vị trí thích hợp trong hệ thống (xem
hình d-ới). Khâu tích phân có đặc điểm là nó có khả năng triệt tiêu
hoàn toàn đ-ợc sai lệch tĩnh và giảm ảnh h-ởng của nhiễu đến hệ
thống. Với hệ xung – số khâu tích phân đ-ợc lựa chọn có hàm
truyền đạt số là:
1
)(
z
K
zW II
Sơ đồ khối của hệ thống đã bù bằng khâu tích phân nh- sau:
Sau khi điểm qua hai ph-ơng pháp trên, ta thấy ph-ơng pháp thêm khâu
tích phân (ph-ơng pháp 2) có nhiều -u điểm hơn, bởi vậy trong bài tập này
sẽ sử dụng ph-ơng pháp thêm khâu tích phân.
Tr-ớc hết cần tìm ph-ơng trình trạng thái của khâu tích phân. Theo sơ đồ
trên ta có:
)(.)(
)()()1(
1)(
)(
kxKky
kukxkx
z
K
zU
zY
III
III
I
I
I
Ước l-ợng
trạng thái
Đối t-ợng K Nx
Nu
y u r
yI
Ước l-ợng
trạng thái
Đối t-ợng
K
1z
K I
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
36
Ta thấy khâu tích phân này chỉ có một biến trạng thái duy nhất và đầu ra
của khâu tích phân tỉ lệ với biến trạng thái này.
Đặt
)(
)(
)(
kx
kx
kX
I
ta có:
)(.
01
0
)1(
)(.)(
)(
0
)(
1
0
)1(
)()(.)()()1(
)(.)(.)1(
)(.)(
)(.)(.)(.)(
kXKK
B
C
A
kX
kXKKku
ku
B
kX
C
A
kX
kxkxCkukxkx
kuBkxAkx
kxCku
kXKKkxKkxKku
I
I
IIII
I
III
Đặt e(k)=X(k) – X( ) là sai lệch tĩnh ta có:
)(..
01
0
)1( keKK
B
C
A
ke I
Mục đích của ta là phải làm cho e(k) tiến đến 0 càng nhanh càng tốt để
triệt tiêu đ-ợc sai lệch tĩnh. Đến đây ta lại thấy dạng quen thuộc của (3.2.2)
và do đó có thể áp dụng ph-ơng pháp tìm bộ hồi tiếp trạng thái (đã trình bày
ở phần 2) để tìm [K –KI].
Hệ mới bây giờ có bậc là 3 chứ không còn là 2 nữa. Sử dụng bảng điểm
cực chuẩn của Bessel cho hệ bậc 3 và chọn thời gian quá độ là T = 20ms =
0.02s ta có điểm cực mới là:
ieezpeezp
i
i
pp
ipp 3009.02169.0;2858.0
23.18934.198
02.0
7845.39668.3
;46.250
02.0
0093.5
)23.18934.198(005.03,2.005.0
3,2
)46.250(005.01.005.0
1
3,21
Ph-ơng trình đặc tính mới là:
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
37
K2-0.7408-.K0.3311.K+K2)z+.K0.3705K+K1-(2.4708+K1)z+(-2.73+z
13311.03705.0
01
27408.0173.1
det
21.
0
0
1
13311.03705.0
001
07408.073.1
00
00
00
det
.
01
0
.det
dcIdcI
23
zKK
z
KKKz
KKK
KKz
z
z
KK
B
C
A
Iz
dcdc
I
I
dcdc
I
Mặt khác ta lại có:
0.0393-0.2616z+0.7196.z-z
)3009.02169.0)(3009.02169.0)(2858.0(
))()((
.
01
0
.det
23
321
izizz
zpzzpzzpz
KK
B
C
A
Iz I
Cân bằng hai vế của hai ph-ơng trình trên ta có:
dc
I
K
K
K
K
7163.0
4643.02
0103.21
-0.0393K2-0.7408-.K0.3311.K
0.2616K2+.K0.3705K+K1-2.4708
-0.7196K1+2.73-
dcI
dcI
Vậy ta đã tìm đ-ợc các hệ số cần thiết một cách tổng quát. Nhận thấy giá
trị của K1, K2 không phụ thuộc vào Kdc nghĩa là các giá trị đó phù hợp với
mọi Kdc. Trong bài tập này, chọn Kdc = 9 ta có: KI = 0.0796.
Thực hiện mô hình hệ thống trên trong Simulink ta có sơ đồ sau:
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
38
Zero-Order
Hold1
Zero-Order
Hold
Step
K
Phan hoi
trang thai K
0.002s +0.12s+12
65*9
Doi tuong
Ki
z-1
Discrete
Transfer Fcn
uk
y k
xk
Discrete
State Estimator
Dau ra
Với các giá trị K1, K2, KI đã tính ở trên, thay vào mô hình ta có quá
trình quá độ nh- sau:
0 0 .0 1 0 .0 2 0 .0 3 0 .0 4 0 .0 5 0 .0 6 0 .0 7 0 .0 8 0 .0 9 0 .1
0
0 .2
0 .4
0 .6
0 .8
1
1 .2
1 .4
Nhận xét thấy quá trình quá độ rất tốt, thời gian quá độ khoảng 20ms, độ
quá điều chỉnh rất nhỏ và không có sai lệch tĩnh.
Xét ảnh h-ởng của một nhiễu ở đầu vào của đối t-ợng ta có:
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
39
0 0 .0 2 0 .0 4 0 .0 6 0 .0 8 0 .1 0 .1 2 0 .1 4 0 .1 6 0 .1 8 0 .2
0
0 .2
0 .4
0 .6
0 .8
1
1 .2
1 .4
Có thể thấy ngay là hệ thống rất ít bị ảnh h-ởng của nhiễu.
3.2.6. So sánh hai bộ điều khiển tìm đ-ợc:
Qua so sánh kết quả mô phỏng với hai bộ điều khiển: bộ điều khiển PID
số và bộ hồi tiếp trạng thái ta có nhận xét:
Hệ thống với bộ hồi tiếp trạng thái có thời gian quá độ nhanh hơn,
tuy nhiên hơi có quá điều chỉnh nh-ng rất nhỏ.
Hệ thống với bộ hồi tiếp trạng thái ít chịu ảnh h-ởng của nhiễu
hơn, tức là nó bền vững hơn.
Qua các kết luận trên, em quyết định chọn bộ hồi tiếp trạng thái (có khâu
tích phân) để xây dựng hệ thống điều khiển số cho động cơ không đồng bộ
ba pha.
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
40
Ch-ơng III
THIẾT KẾ PHẦN CỨNG HỆ THỐNG ĐIỀU KHIỂN SỐ
ĐỘNG CƠ KĐB 3 PHA
4. SƠ ĐỒ KHỐI VẦ í TƯỞNG THIẾT KẾ
Cho đến nay, có nhiều ph-ơng pháp khác nhau để điều khiển động cơ không
đồng bộ pha (nh- đã trình bày ở trên). Mỗi ph-ơng pháp có những -u, nh-ợc
điểm riêng và tuỳ từng ứng dụng cụ thể mà cần lựa chọn một ph-ơng pháp thích
hợp. Hiện nay, ph-ơng pháp tốt nhất và đ-ợc ứng dụng nhiều nhất là ph-ơng
pháp điều chỉnh tần số nguồn cung cấp cho động cơ bằng các bộ biến tần.
Ph-ơng pháp này có những -u điểm so với các ph-ơng pháp khác nh- cho phép
điều chỉnh trong một dải tốc độ rộng, hiệu suất cao, cho phép thực hiện các
ph-ơng pháp điều chế khác nhau với độ chính xác (trong điều khiển) và chất
l-ợng cao,... Tuy nhiên, so với các ph-ơng pháp khác, ph-ơng pháp này có
nh-ợc điểm là phức tạp, phần cứng đắt tiền, đòi hỏi hệ thống phải có tốc độ
nhanh và năng lực xử lý cao. Tuy nhiên, với xu thế phát triển hiện nay của kĩ
thuật và sự xuất hiện của nhiều loại biến tần chế tạo sẵn của các hãng khác
nhau, việc sử dụng ph-ơng pháp điều chỉnh tần số nguồn cung cấp cho động cơ
đã trở thành một lựa chọn tất yếu. Vì lí do đó, trong bài tập này, em quyết định
chọn ph-ơng pháp điều chỉnh tần số nguồn cung cấp để điều khiển động cơ
không đồng bộ ba pha.
Sơ đồ khối cơ bản của hệ thống điều khiển động cơ không đồng bộ ba pha
dùng máy tính bằng ph-ơng pháp điều chỉnh tần số nguồn cung cấp nh- sau:
Nguyên lý hoạt động của sơ đồ khối trên nh- sau:
Encoder đo tốc độ quay của động cơ (ĐC) d-ới dạng các xung gửi về bộ
đếm. Bộ đếm đếm số xung, từ đó xác định đ-ợc tốc độ quay của động cơ.
Tốc độ này đ-ợc hồi tiếp về bộ điều khiển mềm (soft - controller, d-ới
dạng ch-ơng trình điều khiển trong máy tính). Bộ điều khiển mềm tính
Encoder
ĐC
u~
udk
Máy tính
DAC
Biến tần
Bộ đếm
(đo tốc độ)
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
41
toán theo một thuật toán xác định (sẽ đ-ợc trình bày cụ thể ở ch-ơng IV
và V) dựa trên đầu vào là tốc độ đặt (do ng-ời sử dụng đặt) và tốc độ
thực của động cơ hồi tiếp về, từ đó có đ-ợc tín hiệu điều khiển thích hợp.
Tín hiệu điều khiển này đ-ợc máy tính đ-a qua bộ biến đổi Số - T-ơng tự
(DAC), biến đổi thành điện áp điều khiển (udk) để điều khiển biến tần.
Căn cứ theo điện áp điều khiển, biến tần cung cấp cho động cơ một điện
áp xoay chiều ba pha có tần số nh- mong muốn. Do tần số điện áp cung
cấp đ-ợc thay đổi, đặc tính cơ của động cơ cũng thay đổi theo (nh- đã
trình bày ở ch-ơng I), làm thay đổi tốc độ của động cơ với momen tải
xác định.
Nh- vậy, để điều khiển động cơ không đồng bộ ba pha bằng máy tính, vấn
đề chủ yếu còn lại là xây dựng mạch ghép nối vào/ra với máy tính. Mạch ghép
nối đ-ợc thiết kế trên cơ sở ý t-ởng sau:
Để đo tốc độ quay của động cơ, ta dùng Encoder. Nguyên tắc hoạt động của
Encoder là dùng một đĩa tròn có nhiều lỗ bố trí theo mép đĩa gắn với trục quay
của động cơ. Số lỗ có thể thay đổi, tuỳ thuộc vào độ phân giải cần thiết. Hai bên
đĩa có lắp LED và cảm biến quang học đối diện nhau. Khi có một lỗ đi qua chỗ
gắn cảm biến thì cảm biến quang học sẽ nhận đ-ợc ánh sáng từ LED và tạo ra
một xung. Căn cứ vào xung đó và số lỗ (hay số xung, hay độ phân giải) trong
một vòng quay của Encoder, có thể tính đ-ợc tốc độ quay của động cơ. Có hai
cách để xác định tốc độ quay từ Encoder:
- Cách 1: đếm số xung do Encoder gửi về trong một khoảng thời gian T
xác định. Giả sử Encoder có N xung/một vòng quay và trong thời gian T
đếm đ-ợc k xung phát ra từ Encoder. Khi đó, tốc độ quay của động cơ
đ-ợc tính theo công thức sau:
NT
k
n
.
.60
(vòng/phút). Sai số tốc độ quay là:
k
NT
n
.
60
. Với sai số l-ợng tử của k thì
NT
n
.
60
là hằng số và chỉ phụ
thuộc vào thời gian đếm xung T và độ phân giải N của Encoder.
- Cách 2: đếm số xung phụ tần số cao trong một chu kì xung của Encoder.
Đồ thị sau giúp thể hiện rõ hơn cách này.
Giả sử xung phụ có tần số f, và số xung phụ đếm đ-ợc trong một chu kì
xung của Encoder là q. Khi đó, tốc độ quay của động cơ đ-ợc tính theo
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
42
công thức sau:
qN
f
n
.
.60
(vòng/phút). Sai số tốc độ quay ứng với sai số
l-ợng tử của q là:
)1(
1.60
qqN
f
n . Rõ ràng sai số tốc độ quay trong
tr-ờng hợp này không cố định mà thay đổi theo q. Khi q càng lớn, nghĩa
là tốc độ quay càng chậm, thì sai số càng nhỏ và ng-ợc lại. Bởi vậy cách
này chỉ thích hợp khi đo tốc độ quay chậm.
Trong bài tập này, căn cứ theo yêu cầu cụ thể của việc điều chỉnh tốc độ
động cơ, em chọn cách đo tốc độ quay thứ nhất. Nh- sẽ trình bày sau này, thời
gian trích mẫu (chu kì điều khiển) đ-ợc chọn là TS = 5ms = 0,005s. Encoder
đ-ợc chọn có N = 2000 (xung/vòng) (xem phần sau). Do đó, sai số đo tốc độ
quay sẽ là n = 6 vòng. Sai số này không nhỏ, nh-ng là chấp nhận đ-ợc với bài
tập. Để giảm sai số đo tốc độ quay, có thể chọn loại Encoder khác có N lớn hơn
(có thể lên tới 4096, 8000 hay hơn nữa), khi đó sai số sẽ đ-ợc giảm đi đáng kể.
Một giải pháp khác là xây dựng mạch đo theo cả hai ph-ơng pháp trên, và lựa
chọn cách đếm một cách linh hoạt căn cứ theo tốc độ hiện thời là nhanh hay
chậm: khi tốc độ cao thì dùng cách 1, khi tốc độ thấp thì dùng cách 2. Tuy
nhiên, trong bài tập này không cần thiết phải xây dựng mạch đo nh- vậy.
Để đếm số xung từ Encoder gửi về, bộ đếm đ-ợc sử dụng là vi mạch 8254.
Đây là vi mạch đếm - thời gian lập trình đ-ợc với khả năng rất mạnh và linh
hoạt. Vi mạch có ba kênh (đ-ợc đánh số từ 0 đến 2) có thể hoạt động hoàn toàn
độc lập với nhau. Tần số hoạt động tối đa là 4MHz, hoàn toàn đáp ứng đ-ợc yêu
cầu của bài tập. Để tạo ra thời gian đếm chuẩn T, một vi mạch thời gian LM555
đ-ợc sử dụng để tạo ra xung đồng hồ chuẩn tần số 10Khz. Xung này đ-ợc chia
tần bởi một kênh của 8254, tạo ra một xung khác có chu kì là 2*T. Xung này
đ-ợc đ-a vào chân Gate của kênh đếm xung Encoder (có xung Encoder đ-a vào
chân Clock) để tạo ra thời gian đếm chuẩn T. Giải pháp đơn giản là chỉ dùng
một kênh để đếm xung Encoder. Tuy nhiên, giải pháp này có nh-ợc điểm là
mỗi khi cần đo tốc độ, ch-ơng trình cần phát tín hiệu bắt đầu đếm và phải chờ
đến khi đếm xong mới đọc đ-ợc tốc độ quay. Một giải pháp khác đ-ợc lựa chọn
là dùng cả hai kênh còn lại của 8254 để đếm xung Encoder nh-ng đếm lệch
nhau, nghĩa là khi kênh này đếm thì kênh kia ngừng và chốt số đếm, và ng-ợc
lại. Nh- vậy, khi cần đọc tốc độ quay, chỉ việc xác định kênh nào đang đếm và
đọc số đếm từ kênh kia. Việc xác định kênh đang đếm có thể đ-ợc thực hiện dễ
dàng nhờ khả năng đọc ng-ợc trạng thái (Readback command) của 8254. Vì
đầu ra OUT của bộ đếm chia tần của 8254 có hai giá trị là 0 và 1 t-ơng ứng với
hai tr-ờng hợp hoạt động khác nhau của hai bộ đếm còn lại, do đó, để thuận
tiện khi lập trình xác định địa chỉ cổng của bộ đếm đang chốt số đếm (bộ đếm
đang không hoạt động), ta sẽ dùng bộ đếm 2 để chia tần và hai bộ đếm 0 và 1
để đếm xung Encoder. Khi đầu ra OUT2 = 0 thì bộ đếm 0 ngừng đếm (chốt số
đếm) còn bộ đếm 1 sẽ đ-ợc phép đếm, và ng-ợc lại. Nh- vậy việc xác định địa
chỉ cổng của bộ đếm đang chốt số đếm (để đọc số đếm) sẽ đơn giản chỉ là vài
lệnh dịch bit và OR số học.
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
43
Để phát ra điện áp điều khiển biến tần, một bộ biến đổi số - t-ơng tự (DAC)
đ-ợc sử dụng. Một nguyên tắc cần đ-ợc đảm bảo là điện áp đầu ra của DAC
phải luôn đ-ợc giữ ổn định (không đổi) trong suốt chu kì điều khiển cho đến
khi có tín hiệu mới xuất ra. Nh-ng dữ liệu trên bus dữ liệu lại luôn luôn thay
đổi. Bởi vậy, cần phải có một bộ chốt ở tr-ớc DAC để chốt dữ liệu cũ lại cho
DAC cho đến khi máy tính ghi một dữ liệu mới ra đó. Nh- vậy, ch-ơng trình sẽ
không thao tác trực tiếp với DAC mà thông qua một bộ chốt. Bộ chốt đ-ợc sử
dụng ở đây là vi mạch 74LS373.
Có thể tóm tắt lại ý t-ởng trên qua sơ đồ sau:
Phần trên đã trình bày ý t-ởng thiết kế cơ bản của mạch điều khiển động cơ
không đồng bộ ba pha. Phần sau đây sẽ trình bày sơ đồ mạch cụ thể để hiện
thực hoá ý t-ởng trên.
5. SƠ ĐỒ MẠCH GHẫP NỐI VÀO RA
Sơ đồ mạch điện (xem cuối ch-ơng) trình bày sơ đồ nguyên lý của mạch
ghép nối vào/ra với máy tính thông qua slot ISA của máy tính. Ngoại trừ biến
tần và Encoder, toàn bộ các thành phần còn lại của hệ thống điều khiển động cơ
không đồng bộ ba pha đều đ-ợc đặt trên card ghép nối này. Giữa card và các
thiết bị ngoài (bộ biến tần và Encoder) đ-ợc nối với nhau thông qua một jack
cắm loại DB-9. Mục 3 sau đây sẽ trình bày cụ thể hơn về các linh kiện, các trị
số đ-ợc dùng trong mạch.
3. GIẢI THÍCH SƠ ĐỒ MẠCH NGUYấN Lí
Sơ đồ mạch nguyên lý có các thành phần cơ bản sau đây:
Vi mạch giải mã địa chỉ 74LS138: đây là vi mạch giải mã 3-8 với ba đầu
vào lựa chọn A,B,C. Tám đầu ra có mức tích cực thấp: có mức điện áp
thấp khi tích cực và ng-ợc lại. Có ba đầu vào cho phép, trong đó có hai
đầu tích cực thấp ( G2B,G2A ) và một đầu tích cực cao (G1). Sơ đồ chân và
bảng chân lý của vi mạch giải mã đ-ợc trình bày ở hình sau:
udk
Encoder
ISA
Slot
Giải mã
địa chỉ
DAC
Chốt
tạo xung 555
8254
Kênh 0
Kênh 1
Kênh 2
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
44
Vào Ra
EN C B
A
7 6 5 4 3
2 1 0
0 x x
x
1 1 1 1 1
1 1 1
1 0 0
0
1 1 1 1 1
1 1 0
1 0 0
1
1 1 1 1 1
1 0 1
1 0 1
0
1 1 1 1 1
0 1 1
1 0 1
1
1 1 1 1 0
1 1 1
1 1 0
0
1 1 1 0 1
1 1 1
1 1 0
1
1 1 0 1 1
1 1 1
1 1 1
0
1 0 1 1 1
1 1 1
1 1 1
1
0 1 1 1 1
1 1 1
122 GBGAGEN
Bộ đệm 74LS245 (Bus Transceiver, Octal Bus, 3 states): vi mạch này
gồm tám bộ đệm ba trạng thái hai chiều, th-ờng đ-ợc dùng làm đệm hai
chiều cho Bus dữ liệu. Các chân A0-A7 và B0-B7 là các chân vào/ra hai
chiều. Chân DIR xác định chiều đi của dữ liệu: DIR=1 thì chiều từ A
sang B, DIR=0 thì chiều từ B sang A. Chân E tích cực thấp sẽ cho phép
hay không cho phép đ-a dữ liệu qua. Khi E=0, các đầu dữ liệu ra sẽ
giống các đầu dữ liệu vào t-ơng ứng (nh-ng có khả năng chịu tải tăng
lên, tức là công suất tăng lên). Khi E=1, các đầu ra đều bị treo ở trạng
thái cao trở. Sơ đồ chân của vi mạch này đ-ợc trình bày ở hình sau.
Bộ chốt hexa 74LS373: vi mạch gồm tám flip-flop loại D ba trạng thái,
th-ờng đ-ợc dùng để chốt dữ liệu. Khi chân LE ở mức cao, dữ liệu từ các
đầu vào (Dx) đ-ợc chốt vào trong flip-flop, sẵn sàng để đ-a ra ở các đầu
ra t-ơng ứng (Qx). Khi chân LE ở mức thấp, các đầu vào không ảnh
Vcc Y0 Y1 Y2 Y3 Y4 Y5 Y6
A B C G2A G2B G1 Y7 GND
Vcc E B1 B2 B3 B4 B5 B6 B7 B8
DIR A1 A2 A3 A4 A5 A6 A7 A8 GND
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
45
h-ởng gì đến các đầu ra. Khi chân /OE (tích cực thấp) ở mức thấp, các
đầu ra đ-ợc đ-a dữ liệu ra. Khi chân /OE ở mức cao, các đầu ra đ-ợc đặt
lên trạng thái cao trở, cách li khỏi bus. Sau đây là sơ đồ chân và bảng
chân lý của 74LS373.
EN LE Vào
Dx
Ra Qx
1 x x High
Z
0 1 1 1
0 1 0 0
0 0 x Qx
Vi mạch 74LS02: đây là vi mạch gồm bốn cổng NOR hai đầu vào.
Vi mạch DAC0808: là vi mạch chuyển đổi số - t-ơng tự (DAC) 8-bit.
Thời gian chuyển đổi tối đa là 150 ns.
Tiêu thụ công suất 33 mW với nguồn
nuôi 5V. Đầu ra là dòng điện có giá trị
phụ thuộc vào mã nhị phân đ-a vào.
DAC0808 t-ơng thích và giao tiếp đ-ợc
với các mức logic TTL, DTL hay CMOS.
Nguồn nuôi của vi mạch cho phép trong
khoảng từ -18V đến +18V. Dòng vào so
sánh là 2-5 mA. Nhiệt độ làm việc bình
th-ờng là 0-75 C. Trong các ứng dụng
thông th-ờng, chân 14 đ-ợc nối lên điện áp so sánh Vref thông qua điện
trở R14 có giá trị sao cho Vref/ R14 = 2 mA. Một khuếch đại thuật toán
đ-ợc sử dụng để chuyển dòng điện đầu ra (chân 4) thành điện áp ra thích
hợp. Sơ đồ chân của DAC0808 đ-ợc trình bày ở hình bên.
Bộ đếm - thời gian khả trình 8254: đây là vi mạch đếm - thời gian khả
trình rất mạnh của Intel. Vi mạch này đ-ợc ứng dụng rộng rãi để: đếm
thời gian, đếm sự kiện, chia tần số, tạo xung,... Có thể thấy vi mạch này
rất hữu dụng trong mạch đếm xung
Encoder. So với vi mạch 8253, vi
mạch 8254 có tần số làm việc tối
đa lớn hơn (đến 4 MHz), có thêm
lệnh đọc ng-ợc (Read-back
command) sẽ đ-ợc dùng đến trong
bài tập này. Trong 8254 có ba bộ
đếm độc lập với nhau, đ-ợc đánh
số từ 0 đến 2. Ngoài ra trong 8254
còn có một thanh ghi từ điều khiển
(CWR – Control Word Register)
dùng để lập trình cho hoạt động
Vcc E B1 B2 B3 B4 B5 B6 B7 B8
DIR A1 A2 A3 A4 A5 A6 A7 A8 GND
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
46
của vi mạch. Nh- vậy, 8254 cần 4 địa chỉ cổng để giao tiếp, bao gồm 3
địa chỉ cho 3 bộ đếm và 1 địa chỉ cho CWR. Mỗi bộ đếm có 6 chế độ làm
việc. Trong bài tập này có sử dụng 2 chế độ là: chế độ 3 (tạo xung vuông)
và chế độ 2. Với chế độ 3, khi đã nạp số đếm và GATE=0, bộ đếm bắt
đầu đếm lùi theo b-ớc 2 (mỗi nhịp Clock giảm số đếm đi 2); khi về 0,
chân OUT đảo trạng thái và số đếm đ-ợc nạp lại để đếm lại từ đầu. Nh-
vậy tín hiệu ở OUT là xung vuông với tần số fCLK/N. Với chế độ 2, khi đã
nạp số đếm và GATE=1, bộ đếm bắt đầu đếm lùi; khi đếm hết hoặc khi
GATE có s-ờn lên thì số đếm đ-ợc nạp lại và đếm lại từ đầu; nếu đang
đếm mà GATE=0 thì ngừng đếm và chốt số đếm lại. Nh- vậy, chế độ 3
đ-ợc dùng với bộ đếm chia tần, còn chế độ 2 đ-ợc dùng với các bộ đếm
đếm xung Encoder.
Dạng thức thanh ghi từ điều khiển (CWR):
SC1 SC0 RW1 RW0 M2 M1 M0 BCD
Trong đó:
SC1, SC0 để chọn bộ đếm hoặc lệnh đọc ng-ợc (11)
RW1, RW0 để chọn chế độ ghi/đọc. Chế độ 11 là chế độ đọc /
ghi LSB rồi đến MSB
M2, M1, M0 để chọn chế độ đếm: 010 cho chế độ 2 và 011 cho
chế độ 3.
BCD bằng 0 nếu đếm theo Binary, bằng 1 nếu đếm theo BCD
Dạng thức thanh ghi từ điều khiển ở lệnh đọc ng-ợc:
1 1 CNT STS C2 C1 C0 0
Trong đó:
CNT = 0 nếu chốt số đếm
STS = 0 nếu chốt trạng thái
C2,C1,C0: để chọn bộ đếm nào đ-ợc chốt (cho bằng 1)
Khi đọc ng-ợc trạng thái, bit 7 (MSBit) là trạng thái chân OUT của bộ
đếm t-ơng ứng. Hình trên là sơ đồ của 8254.
Vi mạch LM555: đây là vi mạch thời gian rất hữu dụng. Sử dụng LM555
có thể tạo ra các xung vuông, xung One-shot, tạo trễ thời gian,... với độ
chính xác rất cao và rất linh hoạt. Không chỉ tạo đ-ợc các xung đều đặn,
LM555 còn có thể tạo ra các xung phức tạp nếu điều khiển chân CV.
LM555 hoạt động với giải điện áp rộng (3V-15V). Trong bài tập này,
LM555 đ-ợc dùng để tạo xung đếm chuẩn 10KHz.
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
47
Encoder OMRON E6B2-CWZ3E: đây là loại Encoder đa mục đích
(General Purpose) của OMRON. Chỉ tiêu kĩ thuật:
Khả năng chịu tải lớn.
Điện áp nguồn: từ 5V đến 24V.
Độ phân giải: 2000 xung/vòng.
Dòng tiêu thụ tối đa: 100mA.
Tần số làm việc tối đa: 100KHz.
Tốc độ quay tối đa: 6000 vòng/phút.
Đầu ra: điện áp trực tiếp, không cần điện trở treo.
Kết nối trực tiếp đ-ợc với các thiết bị TTL, LSTTL, CMOS mà
không cần cách li.
Giải thích sơ đồ nguyên lý:
Hai vi mạch 74LS138 làm nhiệm vụ giải mã địa chỉ. Vi mạch 8254 đ-ợc
chọn theo dải địa chỉ 310h-313h, với các chân địa chỉ A0, A1 đ-a thẳng vào
8254 để chọn bộ đếm và CWR. Vi mạch DAC0808 đ-ợc chọn (gián tiếp thông
qua bộ đệm 74LS373) ở một trong các địa chỉ 314h-317h. Vi mạch này đ-ợc
giải mã không đầy đủ, nghĩa là khi ghi vào bất kì cổng nào trong dải 314h-317h
đều là giao tiếp với DAC0808. Tr-ớc DAC0808 có một bộ chốt 74LS373 để
chốt dữ liệu hiện thời cho DAC, và nó chỉ cập nhập giá trị mới khi ghi (IOW=0)
vào một trong các cổng 314h-317h. Một vi mạch đệm hai chiều 74LS245 đ-ợc
dùng để đệm Bus dữ liệu cho cả card.
Vi mạch 8254: chân GATE2 đ-ợc nối xuống đất để bộ đếm 2 luôn đếm khi
đã đ-ợc nạp số đếm. Chân CLK2 đ-ợc nối với đầu ra của vi mạch LM555, cung
cấp xung đếm chuẩn. Bộ đếm 2 sẽ đ-ợc lập trình để chia xung này ra thành
xung có tần số nhỏ hơn để cung cấp thời gian đếm cho hai bộ đếm còn lại. Đầu
ra OUT2 đ-ợc đ-a vào chân GATE của 2 bộ đếm còn lại để cho phép hay
không cho phép hai bộ đếm này đếm. Tr-ớc khi đi vào GATE1, tín hiệu này
đ-ợc đảo đi để hai bộ đếm 0 và 1 luôn làm việc lệch nhau. Tín hiệu xung từ
Encoder đ-ợc đ-a vào CLK0 và CLK1.
Vi mạch LM555 đ-ợc thiết lập ở chế độ tạo xung vuông với tần số đ-ợc tính
4)423(
44.1
CVRVR
f . Chọn C = 0,01 F thì để có f = 10KHz phải chỉnh VR3 và
VR4 sao cho VR3 + 2VR4 = 14,4K . Tụ C3 = 10nF đ-ợc sử dụng để lọc nhiễu
khỏi chân CV, giúp ổn định xung đầu ra.
Vi mạch DAC0808: điện áp so sánh d-ơng (chân Vref(+)) đ-ợc nối lên
nguồn +12V thông qua điện trở R1 (1K ) và biến trở VR1 (5K ). Điều chỉnh
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
48
biến trở để dòng điện I14 = Vref(+) / (R1 + VR1) nằm trong khoảng 2-5mA.
Th-ờng điều chỉnh sao cho I14 = 2mA. Tụ điện C2 (0,1 F) đ-ợc dùng để lọc các
nhiễu tần số cao trong nguồn xuống đất, giúp ổn định điện áp so sánh. Chân
Vref(-) đ-ợc nối xuống điện áp -12V. Đầu ra (dòng điện) của DAC0808 đ-ợc
đ-a qua một khuếch đại thuật toán (LM358) để biến đổi dòng điện thành điện
áp điều khiển đầu ra. Giả sử số đặt vào DAC0808 là n (n = 0..255) thì dòng điện
đầu ra đ-ợc tính theo công thức
25511
n
VRR
V
I
ref
out . Điện áp đầu ra đ-ợc tính
theo công thức refoutdkout V
n
VRR
VRR
IVRRuu
255
)(
11
22
22 . Nếu điều chỉnh sao
cho R2+VR2=R1+VR1 thì refdkout V
n
uu
255
.
Cổng nối DB-9 đ-ợc dùng để kết nối giữa Card và các thiết bị bên ngoài.
Các chân 1 và 2 đ-ợc dùng để đ-a điện áp Vcc ra ngoài. Chân 3 dùng để đ-a
điện áp điều khiển ra biến tần. Các chân 4, 5 là các chân đ-a tín hiệu xung
Encoder vào trong máy tính. Các chân 6,7,8,9 đ-ợc dùng để nối chung đất giữa
mạch ngoài và trong máy tính.
Bên mạch ngoài, biến tần đ-ợc nối chung đất với mạch trong (chân 6) và đầu
Control đ-ợc nối với điện áp điều khiển từ máy tính ra (chân 3). Encoder đ-ợc
nối chung đất với mạch trong máy tính (chân 9) và đ-ợc cấp nguồn qua chân 2.
Các chân tín hiệu xung ra của Encoder đ-ợc nối với chân 4 và 5 của DB-9.
ch-ơng iii
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
49
THIẾT KẾ PHẦN MỀM HỆ THỐNG ĐIỀU KHIỂN SỐ ĐỘNG
CƠ KĐB 3 PHA
1. PHƯƠNG TRèNH SAI PHÂN CỦA BỘ ĐIỀU KHIỂN
Nh- đã trình bày ở ch-ơng 1, phần 3, bộ điều khiển PID có hàm truyền đạt
nh- sau:
2
( )
( 1)
pid
Az Bz C
W z
z z
trong đó:
2
2
( 2 2 )
2
( 2 4 )
2
i d p
i p d
d
KT K K T
A
T
KT K T K
B
T
K
C
T
Từ hàm truyền đạt này, chuyển thành ph-ơng trình sai phân:
)2(.)1(.)(.)1()(
)1()()2(.)1(.)(.
)1)(()..).((
1
..
)(
)(
)(
121
1
21
2
2
keCkeBkeAkuku
kukukeCkeBkeA
zzUzCzBAzE
z
zCzBA
zz
CBzAz
zE
zU
zWpid
Từ ph-ơng trình sai phân trên có đ-ợc thuật toán xây dựng bộ PID số nh-
sau:
Khai báo 1 biến để l-u giá trị cũ của u và 1 mảng để l-u các giá trị cũ
của e :
float u_old;
float e_old[2];
Các giá trị này đều đ-ợc khởi đầu bằng 0.
Tính A,B,C theo Kp, Ti, Td đã chọn.
Các b-ớc tính cho bộ PID số:
o Đọc giá trị hồi tiếp về y và giá trị đặt w. Tính sai lệch e = w - y.
o Tính giá trị tín hiệu điều khiển hiện thời:
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
50
u = u_old + A*e + B*e[0] + C*e[1];
o Xuất tín hiệu điều khiển ra.
o Cập nhập lại các biến l-u:
u_old = u;
e[1]=e[0];
e[0]=e;
o Lặp lại từ đầu.
2. PHƯƠNG ÁN XÂY DỰNG CHƯƠNG TRèNH ĐIỀU KHIỂN.
Ch-ơng trình điều khiển và giao diện bao gồm hai phần độc lập: phần giao
diện ng-ời dùng và phần thực hiện thuật toán điều khiển.
Phần giao diện ng-ời dùng:
o Hiển thị kết quả quá trình điều khiển, ở đây là hiển thị tốc độ
của động cơ d-ới dạng số và đồ thị.
o Nhận tốc độ đặt (tốc độ mong muốn) từ ng-ời dùng.
o Nhận các thông số thiết lập cho hệ thống từ ng-ời dùng.
o Yêu cầu của phần này là giao diện phải dễ dùng, thuận tiện cho
ng-ời sử dụng. Giao diện phải hợp lý. Một phong cách chung
trong giao diện điều khiển là mô phỏng các bàn điều khiển thiết
bị (Instrument Panel).
Phần thực hiện thuật toán điều khiển:
o Thực hiện thuật toán điều khiển (nh- đã trình bày ở phần trên).
o Giao tiếp với phần cứng để điều khiển đối t-ợng cũng nh- nhận
các kết quả đo đạc từ các Sensor.
o Nhận thông số hệ thống và giá trị đặt từ ng-ời dùng thông qua
phần giao diện.
o Cung cấp các số liệu cho phần giao diện (tốc độ).
o Yêu cầu của phần này là tốc độ phải nhanh, đáp ứng đ-ợc yêu
cầu về thời gian của hệ thống điều khiển. Ngoài ra, việc thực
hiện thuật toán điều khiển phải chính xác.
Căn cứ vào các yêu cầu trên, để thuận tiện cho phần giao diện, ch-ơng trình
sẽ đ-ợc viết trên môi tr-ờng Windows. Môi tr-ờng hệ điều hành Windows là
một môi tr-ờng đồ hoạ hoàn thiện, cung cấp rất nhiều các công cụ phát triển
cũng nh- các thành phần đồ hoạ cơ bản (menu, cửa sổ, hộp thoại, ...) giúp cho
việc phát triển các ứng dụng đ-ợc dễ dàng và nhanh chóng. Mặc dù môi tr-ờng
Windows luôn hạn chế việc truy nhập cấp thấp với phần cứng, tuy nhiên trên
Windows 9x thì việc thực hiện các vào ra cơ bản với phần cứng là đ-ợc phép.
Điều này hoàn toàn đáp ứng đ-ợc yêu cầu trong bài tập này.
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
51
Môi tr-ờng Windows là môi tr-ờng đa nhiệm, nghĩa là các ch-ơng trình
chạy trên đó đ-ợc thực hiện gần nh- là đồng thời và chia sẻ tài nguyên với
nhau. Bởi lẽ đó, khi thực hiện phần điều khiển, phần ch-ơng trình yêu cầu tốc
độ nhanh và đáp ứng kịp thời, cần phải tăng mức -u tiên (priority) cho phần mã
đó lên mức cao hơn bình th-ờng. Mức -u tiên High tỏ ra là phù hợp, tuy nhiên
nếu cần thiết có thể tăng lên mức -u tiên Real-time. Ngoài ra, việc sử dụng
Thread cho riêng phần điều khiển là cần thiết để tránh bị ảnh h-ởng bởi phần
giao diện. Nh- vậy, ch-ơng trình sẽ có hai phần chính t-ơng ứng với hai Thread
khác nhau của cùng một Process.
3. CHỌN CễNG CỤ LẬP TRèNH
Với các bài toán điều khiển, ngôn ngữ C/C++ d-ờng nh- là lựa chọn bắt
buộc, bởi ngôn ngữ này cho phép viết các ch-ơng trình mạnh, nhanh, nhỏ gọn,
truy nhập sâu vào phần cứng (về mặt này thì không bằng hợp ngữ). Tuy nhiên,
để tối -u phần mã điều khiển, một số đoạn trình hợp ngữ sẽ đ-ợc sử dụng thêm
vào đoạn mã C/C++.
Về công cụ và mội tr-ờng phát triển: hiện nay có hai công cụ phát triển rất
mạnh dùng ngôn ngữ C/C++, đó là Visual C++ của Microsoft và CBuilder của
Inprise (tên mới của Borland). Trong khi Visual C++ -u tiên khả năng can thiệp
sâu vào hệ thống và chỉ đóng gói đơn giản các thành phần (đồ hoạ, file,...) của
hệ thống thì CBuilder lại tận dụng tối đa khả năng h-ớng đối t-ợng trong C++
để đóng gói các thành phần hệ thống, giúp lập trình viên càng ít phải can thiệp
chi tiết vào hệ thống càng tốt. Tất nhiên CBuilder sẽ có chút hạn chế khi lập
trình viên muốn lập trình cấp thấp. Với mục đích nhanh chóng tạo ra ch-ơng
trình với giao diện phù hợp, dễ sử dụng mà vẫn đảm bảo yêu cầu về tốc độ, tính
hiệu quả, công cụ CBuilder đ-ợc chọn để thực hiện phần mềm cho bài tập này.
4. MÃ NGUỒN CỦA CHƯƠNG TRèNH
Ch-ơng trình nguồn đ-ợc viết d-ới dạng một project trong CBuilder. Hệ
thống module trong project đ-ợc tổ chức nh- sau:
Tên file Chú thích
ACMotor.bpr File Project
ACMotor.cpp,
ACMotor.res
File module chính và file resource
UMain.* Các file nguồn cho module của form chính
UAbout.* Các file nguồn cho module của hộp thoại
About
USettings.* Các file nguồn cho module của hộp thoại
Settings
common.h, common.cpp Module chứa các đinh nghĩa biến chung
UControl.* Module chứa Thread Class để điều khiển hệ
thống
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
52
Nội dung mã nguồn cụ thể nh- sau:
a. Module chính:
File ACMotor.cpp
#include
#pragma hdrstop
USERES("ACMotor.res");
USEFORM("UMain.cpp", frmMain);
USEUNIT("UControl.cpp");
USEFORM("UAbout.cpp", AboutBox);
USEFORM("USettings.cpp", dlgSettings);
USEUNIT("common.cpp");
USEUNIT("..\..\userlib\GraphScope.cpp");
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->Title = "Three-phase Motor Digital
Controller";
Application->CreateForm(__classid(TfrmMain), &frmMain);
Application->CreateForm(__classid(TAboutBox), &AboutBox);
Application->CreateForm(__classid(TdlgSettings),
&dlgSettings);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//-----------------------------------------------------------
-----
b. Module của form chính:
File UMain.h
//------------------------------------------------------
---------------------
#ifndef UMainH
#define UMainH
//------------------------------------------------------
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
53
----------
#include
#include
#include
#include
#include
#include
#include "GraphScope.h"
#include "UControl.h"
//------------------------------------------------------
----------
class TfrmMain : public TForm
{
__published: // IDE-managed Components
TPanel *pnlitle;
TLabel *lblTitle;
TPanel *pnlSystem;
TPanel *pnlButtons;
TButton *btnSettings;
TButton *btnControl;
TButton *btnExit;
TButton *btnAbout;
TPanel *pnlControlPanel;
TPanel *pnlGraph;
TTimer *timSpeedUpdate;
TPanel *pnlParams;
TRadioButton *PController;
TRadioButton *PIController;
TRadioButton *PDController;
TRadioButton *PIDController;
TLabel *Label1;
TEdit *KpEdit;
TEdit *TiEdit;
TEdit *TdEdit;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TPanel *Panel1;
TLabel *btnDefault;
TLabel *Label5;
TLabel *curSpeed;
TLabel *Label7;
TLabel *Label6;
TLabel *desiredSpeed;
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
54
TButton *SetNewSpeed;
void __fastcall FormCreate(TObject *Sender);
void __fastcall btnAboutClick(TObject *Sender);
void __fastcall btnExitClick(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
void __fastcall btnControlClick(TObject *Sender);
void __fastcall timSpeedUpdateTimer(TObject *Sender);
void __fastcall PControllerClick(TObject *Sender);
void __fastcall btnDefaultClick(TObject *Sender);
void __fastcall btnSettingsClick(TObject *Sender);
void __fastcall SetNewSpeedClick(TObject *Sender);
private:
TControlThread *CtrlThread;
public: // User declarations
TGraphScope *SpeedScope;
__fastcall TfrmMain(TComponent* Owner);
void __fastcall ChangeControlState();
__fastcall ~TfrmMain();
protected:
};
//------------------------------------------------------
----------
extern PACKAGE TfrmMain *frmMain;
#endif
File UMain.cpp
//------------------------------------------------------
----------
#include
#pragma hdrstop
#include
#include "UMain.h"
#include "UAbout.h"
#include "common.h"
#include
#include "USettings.h"
//------------------------------------------------------
----------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
55
//------------------------------------------------------
----------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
::randomize();
ThreadProtect = new TCriticalSection;
}
//------------------------------------------------------
----------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
btnDefault->Caption = "D\nE\nF\nA\nU\nL\nT";
SpeedScope = new TGraphScope(this);
SpeedScope->Parent = pnlGraph;
SpeedScope->Align = alClient;
}
//------------------------------------------------------
----------
void __fastcall TfrmMain::btnAboutClick(TObject *Sender)
{
AboutBox->Show();
}
//------------------------------------------------------
----------void __fastcall TfrmMain::btnExitClick(TObject
*Sender)
{
if (bControlling)
{
CtrlThread->Terminate();
timSpeedUpdate->Enabled = false;
lblTitle->Caption = "Terminating...";
Cursor = crHourGlass;
CtrlThread->WaitFor();
}
Close();
}
//------------------------------------------------------
----------
void __fastcall TfrmMain::FormDestroy(TObject *Sender)
{
delete SpeedScope;
}
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
56
//------------------------------------------------------
----------
void __fastcall TfrmMain::ChangeControlState()
{
if (!bControlling)
btnControl->Caption = "&Control";
else
btnControl->Caption = "Stop &Control";
btnControl->Enabled = true;
}
void __fastcall TfrmMain::btnControlClick(TObject
*Sender)
{
if (bControlling)
{
CtrlThread->Terminate();
timSpeedUpdate->Enabled = false;
pnlParams->Enabled = true;
btnSettings->Enabled = true;
btnDefault->Enabled = true;
}
else
{
SpeedScope->NumValue = 0;
SpeedScope->AddValue(0.0, 0.0);
Kp = StrToFloat(KpEdit->Text);
Ki = StrToFloat(TiEdit->Text);
Kd = StrToFloat(TdEdit->Text);
CtrlThread = new TControlThread(false);
StartControlTime = time(NULL);
timSpeedUpdate->Enabled = true;
pnlParams->Enabled = false;
btnSettings->Enabled = false;
btnDefault->Enabled = false;
}
btnControl->Enabled = false;
}
//------------------------------------------------------
----------
void __fastcall TfrmMain::timSpeedUpdateTimer(TObject
*Sender)
{
double myspeed;
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
57
ThreadProtect->Acquire();
myspeed = dSpeed;
ThreadProtect->Release();
SpeedScope->AddValue(difftime(time(NULL),
StartControlTime), myspeed);
curSpeed->Caption = FloatToStr(dSpeed);
}
//------------------------------------------------------
----------
__fastcall TfrmMain::~TfrmMain()
{
delete ThreadProtect;
}
void __fastcall TfrmMain::PControllerClick(TObject
*Sender)
{
TiEdit->Enabled = false;
TdEdit->Enabled = false;
if (PIDController->Checked || PIController->Checked)
TiEdit->Enabled = true;
if (PIDController->Checked || PDController->Checked)
TdEdit->Enabled = true;
}
//------------------------------------------------------
----------
void __fastcall TfrmMain::btnDefaultClick(TObject
*Sender)
{
if (PIDController->Checked)
{
KpEdit->Text = "0.01767";
TiEdit->Text = "0.15";
TdEdit->Text = "0.00026";
}
else if (PIController->Checked)
{
KpEdit->Text = "1";
TiEdit->Text = "0.1";
}
else if (PDController->Checked)
{
KpEdit->Text = "1";
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
58
TdEdit->Text = "0.01";
}
else
KpEdit->Text = "1";
}
//------------------------------------------------------
----------
void __fastcall TfrmMain::btnSettingsClick(TObject
*Sender)
{
if (dlgSettings->ShowModal() == mrOk)
{
NumPulse = StrToInt(dlgSettings->EncNumPulse->Text);
TSamp = dlgSettings->SampTime->Value / 1000.0;
}
}
//------------------------------------------------------
----------
void __fastcall TfrmMain::SetNewSpeedClick(TObject
*Sender)
{
AnsiString value;
double newSpeed, oldSpeed;
ThreadProtect->Acquire();
oldSpeed = desSpeed;
ThreadProtect->Release();
value = FloatToStr(oldSpeed);
if (InputQuery("Set Desired Speed", "Enter the desired
speed", value))
{
newSpeed = StrToFloat(value);
if (newSpeed >= 0 && newSpeed <= 3000 && newSpeed !=
oldSpeed)
{
ThreadProtect->Acquire();
desSpeed = newSpeed;
ThreadProtect->Release();
desiredSpeed->Caption = FloatToStr(newSpeed);
}
}
}
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
59
c. Module của hộp thoại About:
File UAbout.h
#ifndef UAboutH
#define UAboutH
//------------------------------------------------------
----------
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//------------------------------------------------------
----------
class TAboutBox : public TForm
{
__published:
TPanel *Panel1;
TLabel *ProductName;
TLabel *Copyright;
TButton *OKButton;
TMemo *Memo1;
TLabel *Notice;
void __fastcall FormClose(TObject *Sender,
TCloseAction &Action);
void __fastcall OKButtonClick(TObject *Sender);
private:
public:
virtual __fastcall TAboutBox(TComponent* AOwner);
};
//------------------------------------------------------
----------
extern PACKAGE TAboutBox *AboutBox;
//------------------------------------------------------
----------
#endif
File UAbout.cpp
//------------------------------------------------------
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
60
----------
#include
#pragma hdrstop
#include "UAbout.h"
//------------------------------------------------------
----------
#pragma resource "*.dfm"
TAboutBox *AboutBox;
//------------------------------------------------------
----------
__fastcall TAboutBox::TAboutBox(TComponent* AOwner)
: TForm(AOwner)
{
}
//------------------------------------------------------
----------
void __fastcall TAboutBox::FormClose(TObject *Sender,
TCloseAction &Action)
{
Action = caHide;
}
//------------------------------------------------------
----------
void __fastcall TAboutBox::OKButtonClick(TObject
*Sender)
{
Close();
}
//------------------------------------------------------
----------
d. Module chứa Thread Class điều khiển:
File UControl.h
//------------------------------------------------------
----------
#ifndef UControlH
#define UControlH
//------------------------------------------------------
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
61
----------
#include
#include "GraphScope.h"
//------------------------------------------------------
----------
class TControlThread : public TThread
{
private:
__int64 SmplCnt; //Sampling Time Count Value
protected:
void __fastcall Execute();
void __fastcall RunWhenTerminate(TObject *Sender);
void __fastcall ChangebControlling();
public:
__fastcall TControlThread(bool CreateSuspended);
};
//------------------------------------------------------
----------
#endif
File UControl.cpp
//------------------------------------------------------
----------
#include
#pragma hdrstop
#include
#include "UControl.h"
#include "common.h"
#include "UMain.h"
#pragma package(smart_init)
//------------------------------------------------------
----------
// Important: Methods and properties of objects in VCL
can only // be
// used in a method called using Synchronize, for
example:
//
// Synchronize(UpdateCaption);
//
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
62
// where UpdateCaption could look like:
//
// void __fastcall Unit1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//------------------------------------------------------
----------
__fastcall TControlThread::TControlThread(bool
CreateSuspended)
: TThread(CreateSuspended)
{
Priority = tpHighest;
FreeOnTerminate = true;
OnTerminate = RunWhenTerminate;
//Khoi tao phan cung
//So dem cho 8254
unsigned short int Count8254 = TSamp * 20000;
asm {
MOV DX, 0x313
MOV AL, 0xB6
OUT DX, AL
MOV DX, 0x312
MOV AX, Count8254
OUT DX, AL
XCHG AH, AL
OUT DX, AL
//Counter0: mode 2, 16bit, value=FFFF
MOV DX, 0x313
MOV AL, 0x34
OUT DX, AL
MOV DX, 0x310
MOV AL, 0xFF
OUT DX, AL
NOP //delay
OUT DX, AL
//Counter1: mode 2, 16bit, value=FFFF
MOV DX, 0x313
MOV AL, 0x74
OUT DX, AL
MOV DX, 0x311
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
63
MOV AL, 0xFF
OUT DX, AL
NOP //delay
OUT DX, AL
}
}
//------------------------------------------------------
----------
void __fastcall TControlThread::Execute()
{
double u_old, e_old[2];
double y, w, u, e;
double A,B,C;
Synchronize(ChangebControlling);
u_old = 0.0;
e_old[0] = e_old[1] = 0.0;
A = (Ki*TSamp*TSamp + 2*Kd + 2*Kp*TSamp)/2/TSamp;
B = (Ki*TSamp*TSamp - 2*Kp*TSamp - 4*Kd)/2/TSamp;
C = Kd/TSamp;
_LARGE_INTEGER freq;
if (!(::QueryPerformanceFrequency(&freq)))
{
MessageDlg("No high-accuracy timer found.", mtError,
TMsgDlgButtons() << mbOK, 0);
return;
}
_LARGE_INTEGER lastTime;
::QueryPerformanceCounter(&lastTime);
_LARGE_INTEGER curTime = lastTime;
SmplCnt = TSamp * freq.QuadPart;
register unsigned short int PulsesCounted;
double heso = 60.0/(NumPulse*TSamp);
double heso_u = 255.0/12;
unsigned char udk;
while (!Terminated)
{
while (curTime.QuadPart - lastTime.QuadPart <
SmplCnt)
::QueryPerformanceCounter(&curTime);
//Doc toc do
asm {
//Read-back command, latch Counter 2 status
MOV DX, 0x313
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
64
MOV AL, 0xE8
OUT DX, AL
//Read status
MOV DX, 0x312
IN AL, DX
MOV AH, AL //save status2 to AH
//Read-back command, latch Counter 0 & 1
MOV DX, 0x313
MOV AL, 0xD6
OUT DX, AL
MOV AL, AH //restore status2
MOV CL, 7 //Shift Right to get OUT2
SHR AL, CL
XOR AH, AH //now, AX contains the offset of the
latch counter
MOV DX, 0x310
ADD DX, AX //now DX contains the port addr of
the latch counter
//And read count value now
IN AL, DX
MOV AH, AL
IN AL, DX
XCHG AH, AL
//FFFF-AX = number of pulses counted
NOT AX
MOV PulsesCounted, AX
}
y = PulsesCounted*heso;
ThreadProtect->Acquire();
dSpeed = y;
w = desSpeed;
ThreadProtect->Release();
//Thuat toan dieu khien
e = w - y;
u = u_old + A*e + B*e_old[0] + C*e_old[1];
//Va xuat tin hieu dieu khien ra
u_dk = u*heso_u;
asm {
MOV DX, 0x314
MOV AL, u_dk
OUT DX, AL
}
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
65
u_old = u;
e_old[1] = e_old[0];
e_old[0] = e;
lastTime = curTime;
}
}
//------------------------------------------------------
----------
void __fastcall TControlThread::RunWhenTerminate(TObject
*Sender)
{
Synchronize(ChangebControlling);
}
void __fastcall TControlThread::ChangebControlling()
{
bControlling = !bControlling;
frmMain->ChangeControlState();
}
e. Module của hộp thoại Settings:
File USettings.h
//------------------------------------------------------
----------
#ifndef USettingsH
#define USettingsH
//------------------------------------------------------
----------
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "CSPIN.h"
//------------------------------------------------------
----------
class TdlgSettings : public TForm
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
66
{
__published:
TButton *OKBtn;
TButton *CancelBtn;
TGroupBox *GroupBox1;
TLabel *Label1;
TEdit *EncNumPulse;
TButton *Button1;
TGroupBox *GroupBox2;
TLabel *Label4;
TCSpinEdit *SampTime;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private:
public:
virtual __fastcall TdlgSettings(TComponent* AOwner);
};
//------------------------------------------------------
----------
extern PACKAGE TdlgSettings *dlgSettings;
//------------------------------------------------------
----------
#endif
File USettings.cpp
//------------------------------------------------------
----------
#include
#pragma hdrstop
#include "USettings.h"
//------------------------------------------------------
----------
#pragma link "CSPIN"
#pragma resource "*.dfm"
TdlgSettings *dlgSettings;
//------------------------------------------------------
----------
__fastcall TdlgSettings::TdlgSettings(TComponent*
AOwner)
: TForm(AOwner)
{
}
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
67
//------------------------------------------------------
----------
void __fastcall TdlgSettings::Button1Click(TObject
*Sender)
{
EncNumPulse->Text = "2000";
}
//------------------------------------------------------
----------
void __fastcall TdlgSettings::Button2Click(TObject
*Sender)
{
SampTime->Value = 5;
}
//------------------------------------------------------
----------
f. Module chứa các định nghĩa biến chung:
File common.h
#ifndef COMMONH
#define COMMONH
#include
#include
//bControlling: is the computer controlling the Motor ?
extern bool bControlling;
//dSpeed: current speed (rpm)
extern double dSpeed;
//StartControlTime: the time at which controlling starts
extern time_t StartControlTime;
//ThreadProtect: protect thread crisis
extern TCriticalSection *ThreadProtect;
//NumPulse: Number of Pulse per Rotate
extern unsigned int NumPulse;
//TSamp: Sampling Time
extern double TSamp;
//desSpeed: desired speed
extern double desSpeed;
//Kp, Ki, Kd: parameters of PID controller
extern double Kp, Ki, Kd;
#endif COMMONH
Nghiờn cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha
68
File common.cpp
#include "common.h"
bool bControlling = false;
double dSpeed = 0.0;
double desSpeed = 0.0; //desired speed
time_t StartControlTime;
TCriticalSection *ThreadProtect;
unsigned int NumPulse = 2000;
double TSamp = 0.005;
double Kp, Ki, Kd;
Các file đính kèm theo tài liệu này:
- 70.NguyenDuyBach.pdf