Đề tài Nghiên cứu, thiết kế hệ thống điều khiển số cho động cơ KĐB 3 pha

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.

pdf66 trang | Chia sẻ: baoanh98 | Lượt xem: 1001 | Lượt tải: 0download
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:

  • pdf70.NguyenDuyBach.pdf
Tài liệu liên quan