Phần nội dung
Chương 1: Giới thiệu về động cơ không đồng bộ 
Chương 2: Lý thuyết về phương pháp điều khiển.
Chương 3 : Cấu tạo v¿ c£c th‘ng số phần cứng
chương 4 : Sơ đồ cấu tạo mạch điều khiển 
chương 5: Giới thiệu về dspic 6010 
Chương 6: Sơ đồ khối về giải thuật điều khiểnchương 7 : Kết quả đạt được
phần kết luận
                
              
                                            
                                
            
 
            
                 121 trang
121 trang | 
Chia sẻ: banmai | Lượt xem: 2515 | Lượt tải: 1 
              
            Bạn đang xem trước 20 trang tài liệu Điều khiển động cơ không đồng bộ ba pha theo phương pháp sinpwm, sử dụng vi điều khiển dspic 30f6010, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
odule PWM được sử dụng để tạo ra các tín hiệu xung đồng bộ có khả năng đều chỉnh 
được độ rộng ( Synchronized Pulse Width Modulated) . Được ứng dụng trong các mục đích 
điều khiển chuyển động và điều khiển công suất 
Module PWM có các ứng dụng phổ biến sau: 
Sử dụng phổ biến trong điều khiển động cơ xoay chiều 3 pha ( Three Phase AC Induction 
Motor) 
Sử dụng trong các thiết bị dùng để lưu trữ điện năng dùng để cung cấp năng lượng khi mất 
điện (Uninterruptable Power Supply ) 
Sử dụng trong điều khiển động cơ một chiều không chổi than ( Brushless DC Motor) 
5.5.3.1 Các đặc điểm của module PWM 
Có 8 ngõ tín hiệu ra PWM với 4 bộ tạo chu kì PWM 
Có độ phân giải lên đến 16 bit 
Có khà năng thay đổi tần số tín hiệu PWM khi module đang hoạt động 
Có các chế độ canh giữa ,canh cạnh ( Edgle and Center Aligned output) 
Có thể vận hành ở chế độ độc lập, nghĩa là tín hiệu ở mỗi kênh PWM sẽ hoàn toàn độc lập với 
nhau 
Sơ đồ cấu tạo 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
63 
Hình 5.16: Sơ đồ cấu tạo bên trong module PWM 
5.5.3.2 Giải thích hoạt động của module PWM 
Module PWM có thể được cấu hình để hoạt động ở 4 chế độ vận hành khác nhau gồm: 
Free Running Mode 
Single Shot Mode 
Continous Up/Down Counting Mode 
Double Update Mode 
Bốn chế độ hoạt động này được lựa chọn bởi bit PTMOD trong thanh ghi PTCON 
Các sự kiện ngắt được tạo ra bởi bộ đếm thời gian PWM phụ thuộc vào bit (PTMOD) 
và bit Postscaler (PTOPS) trong thanh ghi PTCON 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
64 
Các chế độ hoạt động của module PWM: 
Chế độ tự do(Free Running Mode) 
Trong chế độ Free Running bộ đếm thời gian trong module PWM( PWM time base) sẽ 
đếm lên cho đếm khi nào bằng với giá trị trong thanh ghi PTPER. Thanh ghi PTMR sẽ reset 
vào lần xung clock kế tiếp và bộ đếm thời gian sẽ tiếp tục đếm lên nếu bit PTEN vẫn còn 
được set 
Trong khi bộ đếm thời gian của module PWM trong chế độ Free Running 
(PTMOD=00), một sự kiện ngắt sẽ được tạo ra mỗi lần giá trị của bộ đếm trùng với giá 
trị trong thanh ghi PTPER và thanh ghi PTMR sẽ được reset về 0. Bit lựa chọn Postscaler nên 
được chọn trong chế độ này để giảm bớt số lần sự kiện ngắt xảy ra 
Hình 5.17 : Cập nhật giá trị PWM trong chế độ tự do 
Chế độ đơn (Single Shot Mode) 
Trong chế độ Single Shot , bộ đếm thời gian của module PWM sẽ đếm lên khi bit PTEN 
được set. Khi giá trị trong thanh ghi PTMR bằng với giá trị trong thanh ghi PTPER, thanh ghi 
PTMR sẽ được reset reset tron lần xung clock kế tiếp,và thanh ghi PTEN sẽ bĩ xóa bởi phần 
cứng để tạm dừng lại bộ đếm thời gian. 
Trong khi bộ đếm thời gian của module PWM trong chế độ Single Shot (PTMOD=01), 
một sự kiện ngắt sẽ được tạo ra mỗi lần giá trị của bộ đếm trùng với giá trị trong thanh ghi 
PTPER và thanh ghi PTMR sẽ được reset về 0 , bit PTEN cũng sẽ được reset. Bit lựa chọn 
Postscaler không có tác dụng trong chế độ này 
Chế độ đếm lên xuống (Continous Up/Down Counting Mode ) 
Trong chế độ Continous Up/Down Counting bộ đếm thời gian trong module PWM( 
PWM time base) sẽ đếm lên cho đếm khi nào bằng với giá trị trong thanh ghi PTPER. Sau đó 
Timer sẽ bắt đầu đếm xuống trong lần xung clock tiếp theo. Bit PTDIR trong thanh ghi 
PTCON cho biết Timer đang đếm lên hay đếm xuống. Bit PTDIR sẽ được set khi timer bắt 
đầu đếm xuống. 
Trong chế độ này (PTMOD=10) một sự kiện ngắt sẽ xãy ra mỗi khi giá trị của thanh ghi 
PTMR bằng 0 và bộ đếm thời gian PWM bắt đầu đếm lên. Bit lựa chọn Postscaler nên được 
chọn trong chế độ này để giảm bớt số lần sự kiện ngắt xảy ra 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
65 
Hình 5.18 : Cập nhật giá trị PWM trong chế độ đếm lên xuống 
Chế độ cập nhật kép(Double Update Mode ) 
Trong chế độ Double Update ( PTMOD=11) một sự kiện ngắt sẽ xảy ra mỗi khi 
giá trị trong thanh ghi PTMR bằng 0, và mỗi khi bằng với giá trị trong thanh ghi 
PTPER.Trong chế độ này chu kỳ PWM sẽ được cập nhật 2 lần trong một chu kỳ. Bit lựa chọn 
Postscaler không có tác dụng trong chế độ này 
Hình 5.19 : Cập nhật giá trị PWM trong chế độ cập nhật kép 
Chế độ hoạt động hổ trợ(Complementary PWM Operation) 
Trong chế độ hoạt động hổ trợ (Complementary mode) , mỗi cặp tín hiệu PWM thu 
được từ một tín hiệu PWM hổ trợ ( Comolementary PWM signal) . Khoảng thời gian nghĩ 
(Dead Time) có thể được lựa chọn để đưa vào trong quá trình đóng ngắt các khoá , khi cả hai 
tín hiệu có cùng trạng thái tích cực trong một thời gian ngắn 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
66 
Hình 5.20: Tín hiệu PWM trong chế độ hoạt động hổ trợ 
Trong chế độ hoạt động hổ trợ này, các thanh ghi so sánh được phân chia như sau: 
Thanh ghi PDC1 điều khiển tín hiệu PWM1H/PWM1L 
Thanh ghi PDC2 điều khiển tín hiệu PWM2H/PWM2L 
Thanh ghi PDC3 điều khiển tín hiệu PWM3H/PWM3L 
Thanh ghi PDC4 điều khiển tín hiệu PWM4H/PWM4L 
Xung PWM dạng Edge Aligned 
Tín hiệu Center Aligned PWM được tạo ra bởi module PWM khi bộ đếm thời gian 
PWM được cấu hình hoạt động ở chế độ Free Running hoặc Single Shot 
Đối với tín hiệu Edgle PWM, có thời gian ( Period) được xác định bởi giá trị trong thanh ghi 
PTPER và có chu kì ( Duty cycle) được xác định bởi thanh ghi PDCx tương ứng . Tín hiệu 
PWM được chuyển sang tích cực vào thời điểm bắt đầu của chu kì ( PTMR=0) và chuyển 
sang không tích cực khi giá trị trong thanh ghi PDCx bằng với giá trị trong thanh ghi PTMR. 
Nếu giá trị trong thanh ghi PDCx tương ứng bằng 0 , thì tín hiệu ra trên chân PWM tương ứng 
sẽ không tích cực trong suốt toàn bộ chu kì PWM. Tín hiệu ra trên chân PWM tương ứng sẽ 
tích cực trong suốt toàn bộ chu kì PWM nếu giá trị trong thanh ghi PDCx lớn hơn giá trị được 
lưu trong thanh ghi PTPER 
 Quá trình hoạt động được thể hiện trong hình 
Hình 5.21: Xung PWM dạng Edge Aligned 
Xung PWM dạng Center Aligned 
Tín hiệu Center Aligned PWM được tạo ra bởi module PWM khi bộ đếm thời gian 
PWM được cấu hình hoạt động ở chế độ Up/Down Counting 
Tín hiệu PWM (PWM compare output) được chuyển sang trạng thái tích cực khi giá trị trong 
thanh ghi PTMR bằng với giá trị trong thanh ghi PTPER và bộ đếm thời gian PWM đang 
đếm xuống . Tín hiệu PWM được chuyển sang trạng thái không tích cực khi bộ đếm đang 
đếm lên và giá trị trong thanh ghi PTMR bằng với giá trị trong thanh ghi PTPER 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
67 
Quá trình hoạt động được thể hiện trong hình 
Hình 5.22: Xung PWM dạng Center Aligned 
5.5.3.3 Các bộ đếm tỉ lệ trong module PWM: 
PWM Timer Base Prescaler 
Xung clock đưa vào thanh ghi PTMR (FOSC/4) được tỉ lệ 1:1 , 1:4 , 1:16 hoặc 1:64 , 
được lựa chọn bởi các bit điều khiển PTCKPS trong thanh ghi PTCON. Việc tỉ lệ sẽ bị 
xoá khi xảy ra các trường hợp sau: 
Ghi vào thanh ghi PTMR 
Ghi vào thanh ghi PTCON 
Các reset CPU 
Hình 5.23: Bộ đếm tỉ lệ trong module PWM 
PWM Timer Base Postscaler 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
68 
Sự trùng lập giữa thanh ghi PTPER và thanh ghi PTMR có thể được lựa chọn theo các 
tỉ lệ từ 1:1 đến 1:16 thông qua 4-bit postscaler để tạo ra tín hiệu ngắt. Việc tỉ lệ này được sử 
dụng trong trường hợp không cần thay đổi duty cycile của xung PWM ở mỗi chu kì PWM 
Bộ đếm postscaler sẽ bị xóa bởi các tác động sau: 
Ghi vào thanh ghi PTMR 
Ghi vào thanh ghi PTCON 
Các reset CPU 
Thanh ghi PTMR sẽ không bị xoá khi thanh ghi PTCON được ghi vào 
5.5.3.4 Các thanh ghi làm việc trong module PWM 
Thanh ghi PTPER (PWM Period) 
PTPER là một thanh ghi 15 bit và được sử dụng để cài đặt việc đếm thời gian cho 
module PWM . PTPER là một thanh ghi đệm kép . Nội dung trong thanh ghi đệm PTPER 
được nạp vào thanh ghi PTPER như sau: 
Ở chế độ Free Running và Single Shot : Khi thanh ghi PTMR được reset về 0 sau khi bằng giá 
trị trong thanh ghi PTPER 
Chu kì PWM trong chế độ Free Running được tính bởi công thức sau: 
1
*( Pr )
cy
PWM
F
PTPER
F PTMR escaler
= − 
Ví dụ: 
 FCY = 20 MHz 
FPWM = 20,000 Hz 
PTMR Prescaler = 1:1 
PTPER =20000000/(1**20000)-1=999 
Ở chế độ Up/Down Counting : Khi thanh ghi PTMR bằng 0 
Giá trị được lưu giữ trong bộ đệm PTPER sẽ tự động được nạp vào thanh ghi PTPER khi bộ 
đếm thời gian PWM bị vô hiệu hoá (PTEN=0) 
Chu kì PWM trong chế độ Up/Down Counting được tính bởi công thức sau: 
1
*( Pr )*2
cy
PWM
F
PTPER
F PTMR escaler
= − 
Ví dụ: 
 FCY = 20 MHz 
FPWM = 20,000 Hz 
PTMR Prescaler = 1:1 
PTPER =20000000/(1*2*20000)-1=499 
Các thanh ghi so sánh: (PWM Duty Cycle Comparison Units) 
Module PWM có 4 thanh ghi 16 bit ( PDC1, PDC2, PDC3, PDC4(Duty cycle register)) 
được dùng để xác định chu kì của module này 
Giá trị trong mổi thanh ghi định nghĩa khoảng thời gian mà tín hiệu PWM (PWM output) ở 
trạng thái tích cực. Bit ở vị trí thấp nhất (LSB) cho biết bắt đầu xuất hiện cạnh của PWM. 
 Các thanh ghi đệm (Duty Cyle Register Buffer): 
4 thanh ghi PDCx là các bộ đệm kép cho phép cập nhật tín hiệu PWM. Trong mổi chu 
kỳ, có một thanh ghi đệm được truy cập bởi người dùng và thanh ghi còn lại lưu trữ giá trị so 
sánh thực tế sử dụng trong chu kì PWM hiện tại 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
69 
Đối với tín hiệu Edge Aligned PWM , giá trị chu kì mới sẽ được cập nhật mỗi khi giá trị 
trong thanh ghi PTMR bằng với giá trị trong thanh ghi PTPER và thanh ghi PTMR được 
reset. Nội dung trong thanh ghi đệm sẽ tự động nạp vào thanh ghi dùng để so sánh khi bộ đếm 
thời gian PWM bị vô hiệu hóa ( PTEN=0) và bit UDIS trong thanh ghi PWMCON2 sẽ bị xóa 
Trong chế độ Up/Down Counting , giá trị chu kì mới sẽ được cập nhật khi giá trị trong thanh 
ghi PTMR bằng 0, và bộ đếm thời gian bắt đầu đếm lên. Nội dung trong thanh ghi đệm sẽ tự 
động được nạp vào thanh ghi dùng để so sánh khi bộ đếm thời gian PWM bị vô hiệu hóa ( 
PTEN=0) 
Trong chế độ Up/Down Counting với đặc điểm cập nhật hai lần ( Double Update), PWM , giá 
trị chu kì mới sẽ được cập nhật mỗi khi giá trị trong thanh ghi PTMR bằng với giá trị trong 
thanh ghi PTPER và khi giá trị trong thanh ghi PTMR bằng 0, Nội dung trong thanh ghi đệm 
sẽ tự động được nạp vào thanh ghi dùng để so sánh khi bộ đếm thời gian PWM bị vô hiệu hóa 
( PTEN=0) 
Bảng 5.8 : Bảng thanh ghi điều khiển module PWM 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
70 
5.6 GIỚI THIỆU VỀ TẬP LỆNH CỦA MCU DSPIC-6010 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
71 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
72 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
73 
CHƯƠNG 5: GIỚI THIỆU VỀ dsPIC6010 
74 
Bảng 5.9: Bảng tập lệnh MCU 6010
CHƯƠNG 6: SƠ ĐỒ KHỐI VÀ GIẢI THUẬT ĐIỀU KHIỂN 
75 
CHƯƠNG 6 
 SƠ ĐỒ KHỐI VÀ GIẢI THUẬT ĐIỀU KHIỂN 
CHƯƠNG 6: SƠ ĐỒ KHỐI VÀ GIẢI THUẬT ĐIỀU KHIỂN 
76 
CHƯƠNG 6: SƠ ĐỒ KHỐI VÀ GIẢI THUẬT ĐIỀU KHIỂN 
6.1 Sơ đồ khối chương trình : 
ADC V/F
STEP SIN TABLE
OFFSET
120 
DEGREE
OFFSET
PWMINVERTERMOTOR
Ua
Ub
Uc
UaUdk
K
U1
Ua
Ub
Uc
F_req
CHƯƠNG 6: SƠ ĐỒ KHỐI VÀ GIẢI THUẬT ĐIỀU KHIỂN 
77 
6.2 Sơ đồ giải thuật chương trình : 
ADC_CONFIG
PWM_CONFIG
MODE_CONFIG
RUN = 1 ?
MODE = 1 MODE = 2 MODE = 3 MODE = 4
F_req = READ_ADC F_req = VALUE_1 CHANGE = 0 ?
CHANGE_FLAG = 
! CHANGE_FLAG
CHANGE_FLAG= 1
F_req = VALUE_2 F_req = VALUE_3
F_req = VALUE_4
WRITE_UART ( )
MAIN
F_req = 0
YES
YES YES YES
YES
YES
YES
NO NO NO
NO
NO
NO
CHƯƠNG 6: SƠ ĐỒ KHỐI VÀ GIẢI THUẬT ĐIỀU KHIỂN 
78 
IF=0
F < F_req
TANG T? N S?
PWM_ISR
F > F_req
F = F_req
GI? M T? N S?
F < F_req
F = F_req
F = 0 ?
REV=1
RUN=1
REV=0
DIRECTION=! DIRECTION
TÍNH TOÁN K
Ð? C GIÁ TR? T? B? NG SIN
TÍNH TOÁN GIÁ TR? UPDATE
DIRECTION = 1
UPDATE THU? N UPDATE NGH?CH
RETFIE
NO
YES
NO
NO
NO
NO
YES
YES
YES
YES
YES
NO
CHƯƠNG 6: SƠ ĐỒ KHỐI VÀ GIẢI THUẬT ĐIỀU KHIỂN 
79 
INT3_ISR ( RUN 
BUTTON)
RUN = 1
DIRECTION = 1
RETFI
E
INT4_ISR ( STOP 
BUTTON)
RUN = 0
RETFI
E
INT0_ISR ( CHANGE 
DIRECTION BUTTON)
RUN = 0
REV=1
RETFI
E
UART1_ISR 
VALUE_4 = READ_UART1 ( )
RETFI
E
VALUE_4 = 70
REV=1
VALUE_4 = 0
YES
NO
CHƯƠNG 7 : KẾT QUẢ ĐẠT ĐƯỢC 
80 
CHƯƠNG 7 
 KẾT QUẢ ĐẠT ĐƯỢC 
CHƯƠNG 7 : KẾT QUẢ ĐẠT ĐƯỢC 
81 
CHƯƠNG 7 : KẾT QUẢ ĐẠT ĐƯỢC 
7.1 Phần cứng: 
7.1.1 Mạch động lực: 
Hình 7.1 : Mạch động lực 
Mạch động lực gồm ( chỉnh lưu 1 pha không điều khiển, bộ nghịch lưu 6 khoá , mạch lái 
mosfet, nguồn cung cấp 5V,12V,) hoạt động ổn định 
Mạch vận hành động cơ 2 HP ( đấu tam giác, vận hành ở chế độ không tải ) ở tất cả các chế 
độ điều khiển thông thường( RUN, STOP, đảo chiều, thay đổi tốc độ đặt 
..). 
+ Khuyết điểm: 
 -Nguồn AC(nguồn 1 pha) cung cấp không đủ yêu vầu dẩn đến động cơ không thề vận hành 
định mức 
 -Nhiệt độ các khóa công suất khá cao ( 50-60 ° C) 
 -Chưa có khâu hồi tiếp dòng ,hồi tiếp tốc độ,hồi tiếp điện áp DC 
 
. 
+ Giải pháp khắc phục: 
Sử dụng bộ chỉnh lưu cầu 3 pha 
-Nhiệt độ các khóa công suất khá cao cần thay thế các khóa công suất bằng loại chất lượng 
cao , đáp ứng tôt hơn . 
-Xây dựng giải thuật điều khiển vòng kín ( Hồi tiếp tốc độ, khâu hiệu chỉnh PID) 
CHƯƠNG 7 : KẾT QUẢ ĐẠT ĐƯỢC 
82 
7.1.2 Mạch điều khiển 
Hình 7.2: Mạch điều khiển 
Mạch điều khiển có khả năng đáp ứng các yêu cầu điều khiển động cơ trong thực tế: 
+ Các nút bấm điều khiển động cơ: 
NEXT(tới),BACK(lui),UP(lên),DOWN(xuống),ENTER(xác nhận),RUN(chạy), 
STOP(dừng), REV(đảo chiều),CHANGE(thay đổi tốc độ), MENU(quay về menu 
chính),RESET(reset phần mềm điều khiển),biến trở hiệu chỉnh tốc độ
 
+ Các nút bấm điều khiển LCD: cài đặt các thông số (thời gian tăng tốc, giảm tốc, cài 
đặt mode, cài đặt tốc độ, di chuyển giữa các menu, 
.) 
+ LCD : hiển thị trạng thái hoạt động của động cơ ( tần số, chiều quay, trạng thái hoạt 
động, menu) 
+ Giao tiếp với máy tính: nhận giá trị tốc độ đặt từ máy tính, hiển thị trạng thái hoạt 
động của động cơ lên máy tính, vẽ giản đồ trạng thái thay đổi tần số của động cơ 
CHƯƠNG 7 : KẾT QUẢ ĐẠT ĐƯỢC 
83 
7.2 Phần mềm: 
Hình 7.3: Giao diện giao tiếp máy tính 
Tương tự như chế độ điều khiển tại mạch điều khiển. Chúng ta có thể điều khiển các chế độ 
hoạt động của motor trực tiếp trên máy tính. Đông thời có thể quan sát được thông số ngõ ra 
theo thời gian thực ( Tần số , điện áp tính toán) 
7.3 Dạng sóng điện áp ngõ ra: 
Hình 7.4: Dạng điện áp pha ngõ ra 
CHƯƠNG 7 : KẾT QUẢ ĐẠT ĐƯỢC 
84 
Hình 7.5 : Dạng điện áp dây ngõ ra
PHỤ LỤC 
 PHỤ LỤC 
PHỤ LỤC 
PHỤ LỤC 
CODE TRONG CHƯƠNG TRÌNH ĐIỀU KHIỂN 
/************************************************************************* 
* Project: Dieu Khien Dong Co Khong Dong Bo * 
* Dependencies: Header (p30f6010.h) files * 
* Processor: dsPIC30F6010 * 
* Compiler: MPLAB® C30 v2.02.00 or higher * 
* IDE: MPLAB® IDE v7.50.00 or later * 
*************************************************************************/ 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "xlcd4bit.h" 
/*===========================================================================*/ 
_FOSC(CSW_FSCM_OFF & XT_PLL8); 
_FWDT(WDT_OFF); 
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN); 
_FGS(CODE_PROT_OFF); 
/*======================== VARIABLE DEFINITION ===============================*/ 
float Float_k, temp1; 
float Voltage_Value,ADC_Value; 
int Voltage_Value_A,Voltage_Value_B,Voltage_Value_C; 
int j,k,a,b,c,ADC_Result,Int_k,AD; 
float F_req; 
int First_Run,Run,Rev_Status,Stop; 
int Direction,Menu_Flag,Reset; 
float Temp_1, Temp_2, Temp_Mode_1,Temp_Value,Temp_Mode3_1,Temp_Mode3_2; 
int Step_up,Step_down,t,ADC; 
float up,down; 
int PC_Value,PC_Value_Temp; 
int int_F_req; 
float delta; 
int Mode; 
int Change_Speed; 
//=============================== Button Define=========== ====================// 
#define NEXT PORTDbits.RD8 
#define ENTER PORTDbits.RD9 
#define UP PORTDbits.RD10 
#define BACK PORTDbits.RD11 
#define DOWN PORTFbits.RF8 
#define CHANGE PORTFbits.RF7 
float const SinValue[720]={0.0 , 0.00873 ,0.01745 ,0.02618 ,0.03490 ,0.04362 ,0.05234 ,0.06105 ,0.06976 
,0.07846 ,0.08716 , 
0.09585 ,0.10453 ,0.11320 ,0.12187 ,0.13053 ,0.13917 ,0.14781 ,0.15643 ,0.16505 ,0.17365 ,0.18224 ,0.19081 
,0.19937 , 
0.20791 ,0.21644 ,0.22495 ,0.23345 ,0.24192 ,0.25038 ,0.25882 ,0.26724 ,0.27564 ,0.28402 ,0.29237 ,0.30071 
,0.30902 , 
0.31730 ,0.32557 ,0.33381 ,0.34202 ,0.35021 ,0.35837 ,0.36650 ,0.37461 ,0.38268 ,0.39073 ,0.39875 ,0.40674 
,0.41469 , 
PHỤ LỤC 
0.42262 ,0.43051 ,0.43837 ,0.44620 ,0.45399 ,0.46175 ,0.46947 ,0.47716 ,0.48481 ,0.49242 ,0.50000 ,0.50754 
,0.51504 , 
0.52250 ,0.52992 ,0.53730 ,0.54464 ,0.55194 ,0.55919 ,0.56641 ,0.57358 ,0.58070 ,0.58779 ,0.59482 ,0.60182 
,0.60876 , 
0.61566 ,0.62251 ,0.62932 ,0.63608 ,0.64279 ,0.64945 ,0.65606 ,0.66262 ,0.66913 ,0.67559 ,0.68200 ,0.68835 
,0.69466 , 
0.70091 ,0.70711 ,0.71325 ,0.71934 ,0.72537 ,0.73135 ,0.73728 ,0.74314 ,0.74896 ,0.75471 ,0.76041 ,0.76604 
,0.77162 , 
0.77715 ,0.78261 ,0.78801 ,0.79335 ,0.79864 ,0.80386 ,0.80902 ,0.81412 ,0.81915 ,0.82413 ,0.82904 ,0.83389 
,0.83867 , 
0.84339 ,0.84805 ,0.85264 ,0.85717 ,0.86163 ,0.86603 ,0.87036 ,0.87462 ,0.87882 ,0.88295 ,0.88701 ,0.89101 
,0.89493 , 
0.89879 ,0.90259 ,0.90631 ,0.90996 ,0.91355 ,0.91706 ,0.92050 ,0.92388 ,0.92718 ,0.93042 ,0.93358 ,0.93667 
,0.93969 , 
0.94264 ,0.94552 ,0.94832 ,0.95106 ,0.95372 ,0.95630 ,0.95882 ,0.96126 ,0.96363 ,0.96593 ,0.96815 ,0.97030 
,0.97237 , 
0.97437 ,0.97630 ,0.97815 ,0.97992 ,0.98163 ,0.98325 ,0.98481 ,0.98629 ,0.98769 ,0.98902 ,0.99027 ,0.99144 
,0.99255 , 
0.99357 ,0.99452 ,0.99540 ,0.99619 ,0.99692 ,0.99756 ,0.99813 ,0.99863 ,0.99905 ,0.99939 ,0.99966 ,0.99985 
,0.99996 , 
1.00000 ,0.99996 ,0.99985 ,0.99966 ,0.99939 ,0.99905 ,0.99863 ,0.99813 ,0.99756 ,0.99692 ,0.99619 ,0.99540 
,0.99452 , 
0.99357 ,0.99255 ,0.99144 ,0.99027 ,0.98902 ,0.98769 ,0.98629 ,0.98481 ,0.98325 ,0.98163 ,0.97992 ,0.97815 
,0.97630 , 
0.97437 ,0.97237 ,0.97030 ,0.96815 ,0.96593 ,0.96363 ,0.96126 ,0.95882 ,0.95630 ,0.95372 ,0.95106 ,0.94832 
,0.94552 , 
0.94264 ,0.93969 ,0.93667 ,0.93358 ,0.93042 ,0.92718 ,0.92388 ,0.92050 ,0.91706 ,0.91355 ,0.90996 ,0.90631 
,0.90259 , 
0.89879 ,0.89493 ,0.89101 ,0.88701 ,0.88295 ,0.87882 ,0.87462 ,0.87036 ,0.86603 ,0.86163 ,0.85717 ,0.85264 
,0.84805 , 
0.84339 ,0.83867 ,0.83389 ,0.82904 ,0.82413 ,0.81915 ,0.81412 ,0.80902 ,0.80386 ,0.79864 ,0.79335 ,0.78801 
,0.78261 , 
0.77715 ,0.77162 ,0.76604 ,0.76041 ,0.75471 ,0.74896 ,0.74314 ,0.73728 ,0.73135 ,0.72537 ,0.71934 ,0.71325 
,0.70711 , 
0.70091 ,0.69466 ,0.68835 ,0.68200 ,0.67559 ,0.66913 ,0.66262 ,0.65606 ,0.64945 ,0.64279 ,0.63608 ,0.62932 
,0.62251 , 
0.61566 ,0.60876 ,0.60182 ,0.59482 ,0.58779 ,0.58070 ,0.57358 ,0.56641 ,0.55919 ,0.55194 ,0.54464 ,0.53730 
,0.52992 , 
0.52250 ,0.51504 ,0.50754 ,0.50000 ,0.49242 ,0.48481 ,0.47716 ,0.46947 ,0.46175 ,0.45399 ,0.44620 ,0.43837 
,0.43051 , 
0.42262 ,0.41469 ,0.40674 ,0.39875 ,0.39073 ,0.38268 ,0.37461 ,0.36650 ,0.35837 ,0.35021 ,0.34202 ,0.33381 
,0.32557 , 
0.31730 ,0.30902 ,0.30071 ,0.29237 ,0.28402 ,0.27564 ,0.26724 ,0.25882 ,0.25038 ,0.24192 ,0.23345 ,0.22495 
,0.21644 , 
0.20791 ,0.19937 ,0.19081 ,0.18224 ,0.17365 ,0.16505 ,0.15643 ,0.14781 ,0.13917 ,0.13053 ,0.12187 ,0.11320 
,0.10453 , 
0.09585 ,0.08716 ,0.07846 ,0.06976 ,0.06105 ,0.05234 ,0.04362 ,0.03490 ,0.02618 ,0.01745 ,0.00873 ,0.00000 ,-
0.00873 , 
-0.01745 ,-0.02618 ,-0.03490 ,-0.04362 ,-0.05234 ,-0.06105 ,-0.06976 ,-0.07846 ,-0.08716 ,-0.09585 ,-0.10453 ,-
0.11320 , 
-0.12187 ,-0.13053 ,-0.13917 ,-0.14781 ,-0.15643 ,-0.16505 ,-0.17365 ,-0.18224 ,-0.19081 ,-0.19937 ,-0.20791 ,-
0.21644 , 
-0.22495 ,-0.23345 ,-0.24192 ,-0.25038 ,-0.25882 ,-0.26724 ,-0.27564 ,-0.28402 ,-0.29237 ,-0.30071 ,-0.30902 ,-
0.31730 , 
-0.32557 ,-0.33381 ,-0.34202 ,-0.35021 ,-0.35837 ,-0.36650 ,-0.37461 ,-0.38268 ,-0.39073 ,-0.39875 ,-0.40674 ,-
0.41469 , 
-0.42262 ,-0.43051 ,-0.43837 ,-0.44620 ,-0.45399 ,-0.46175 ,-0.46947 ,-0.47716 ,-0.48481 ,-0.49242 ,-0.50000 ,-
0.50754 , 
PHỤ LỤC 
-0.51504 ,-0.52250 ,-0.52992 ,-0.53730 ,-0.54464 ,-0.55194 ,-0.55919 ,-0.56641 ,-0.57358 ,-0.58070 ,-0.58779 ,-
0.59482 , 
-0.60182 ,-0.60876 ,-0.61566 ,-0.62251 ,-0.62932 ,-0.63608 ,-0.64279 ,-0.64945 ,-0.65606 ,-0.66262 ,-0.66913 ,-
0.67559 , 
-0.68200 ,-0.68835 ,-0.69466 ,-0.70091 ,-0.70711 ,-0.71325 ,-0.71934 ,-0.72537 ,-0.73135 ,-0.73728 ,-0.74314 ,-
0.74896 , 
-0.75471 ,-0.76041 ,-0.76604 ,-0.77162 ,-0.77715 ,-0.78261 ,-0.78801 ,-0.79335 ,-0.79864 ,-0.80386 ,-0.80902 ,-
0.81412 , 
-0.81915 ,-0.82413 ,-0.82904 ,-0.83389 ,-0.83867 ,-0.84339 ,-0.84805 ,-0.85264 ,-0.85717 ,-0.86163 ,-0.86603 ,-
0.87036 , 
-0.87462 ,-0.87882 ,-0.88295 ,-0.88701 ,-0.89101 ,-0.89493 ,-0.89879 ,-0.90259 ,-0.90631 ,-0.90996 ,-0.91355 ,-
0.91706 , 
-0.92050 ,-0.92388 ,-0.92718 ,-0.93042 ,-0.93358 ,-0.93667 ,-0.93969 ,-0.94264 ,-0.94552 ,-0.94832 ,-0.95106 ,-
0.95372 , 
-0.95630 ,-0.95882 ,-0.96126 ,-0.96363 ,-0.96593 ,-0.96815 ,-0.97030 ,-0.97237 ,-0.97437 ,-0.97630 ,-0.97815 ,-
0.97992 , 
-0.98163 ,-0.98325 ,-0.98481 ,-0.98629 ,-0.98769 ,-0.98902 ,-0.99027 ,-0.99144 ,-0.99255 ,-0.99357 ,-0.99452 ,-
0.99540 , 
-0.99619 ,-0.99692 ,-0.99756 ,-0.99813 ,-0.99863 ,-0.99905 ,-0.99939 ,-0.99966 ,-0.99985 ,-0.99996 ,-1.00000 ,-
0.99996 , 
-0.99985 ,-0.99966 ,-0.99939 ,-0.99905 ,-0.99863 ,-0.99813 ,-0.99756 ,-0.99692 ,-0.99619 ,-0.99540 ,-0.99452 ,-
0.99357 , 
-0.99255 ,-0.99144 ,-0.99027 ,-0.98902 ,-0.98769 ,-0.98629 ,-0.98481 ,-0.98325 ,-0.98163 ,-0.97992 ,-0.97815 ,-
0.97630 , 
-0.97437 ,-0.97237 ,-0.97030 ,-0.96815 ,-0.96593 ,-0.96363 ,-0.96126 ,-0.95882 ,-0.95630 ,-0.95372 ,-0.95106 ,-
0.94832 , 
-0.94552 ,-0.94264 ,-0.93969 ,-0.93667 ,-0.93358 ,-0.93042 ,-0.92718 ,-0.92388 ,-0.92050 ,-0.91706 ,-0.91355 ,-
0.90996 , 
-0.90631 ,-0.90259 ,-0.89879 ,-0.89493 ,-0.89101 ,-0.88701 ,-0.88295 ,-0.87882 ,-0.87462 ,-0.87036 ,-0.86603 ,-
0.86163 , 
-0.85717 ,-0.85264 ,-0.84805 ,-0.84339 ,-0.83867 ,-0.83389 ,-0.82904 ,-0.82413 ,-0.81915 ,-0.81412 ,-0.80902 ,-
0.80386 , 
-0.79864 ,-0.79335 ,-0.78801 ,-0.78261 ,-0.77715 ,-0.77162 ,-0.76604 ,-0.76041 ,-0.75471 ,-0.74896 ,-0.74314 ,-
0.73728 , 
-0.73135 ,-0.72537 ,-0.71934 ,-0.71325 ,-0.70711 ,-0.70091 ,-0.69466 ,-0.68835 ,-0.68200 ,-0.67559 ,-0.66913 ,-
0.66262 , 
-0.65606 ,-0.64945 ,-0.64279 ,-0.63608 ,-0.62932 ,-0.62251 ,-0.61566 ,-0.60876 ,-0.60182 ,-0.59482 ,-0.58779 ,-
0.58070 , 
-0.57358 ,-0.56641 ,-0.55919 ,-0.55194 ,-0.54464 ,-0.53730 ,-0.52992 ,-0.52250 ,-0.51504 ,-0.50754 ,-0.50000 ,-
0.49242 , 
-0.48481 ,-0.47716 ,-0.46947 ,-0.46175 ,-0.45399 ,-0.44620 ,-0.43837 ,-0.43051 ,-0.42262 ,-0.41469 ,-0.40674 ,-
0.39875 , 
-0.39073 ,-0.38268 ,-0.37461 ,-0.36650 ,-0.35837 ,-0.35021 ,-0.34202 ,-0.33381 ,-0.32557 ,-0.31730 ,-0.30902 ,-
0.30071 , 
-0.29237 ,-0.28402 ,-0.27564 ,-0.26724 ,-0.25882 ,-0.25038 ,-0.24192 ,-0.23345 ,-0.22495 ,-0.21644 ,-0.20791 ,-
0.19937 , 
-0.19081 ,-0.18224 ,-0.17365 ,-0.16505 ,-0.15643 ,-0.14781 ,-0.13917 ,-0.13053 ,-0.12187 ,-0.11320 ,-0.10453 ,-
0.09585 , 
-0.08716 ,-0.07846 ,-0.06976 ,-0.06105 ,-0.05234 ,-0.04362 ,-0.03490 ,-0.02618 ,-0.01745 ,-0.00873 }; 
//*============================ ADC Module Setup===============================*// 
void ADCSetup(void) 
{ 
unsigned int config1, config2, config3, configport, configscan; 
unsigned int channel; 
 ConfigIntADC10(ADC_INT_DISABLE ); 
 channel = ADC_CH0_POS_SAMPLEA_AN6& 
 ADC_CH0_NEG_SAMPLEA_NVREF; 
 SetChanADC10(channel); 
PHỤ LỤC 
 configport = ENABLE_AN6_ANA; 
 //Auto conversion trigger, auto sampling 
 config3 = ADC_SAMPLE_TIME_6& 
 ADC_CONV_CLK_SYSTEM& 
 ADC_CONV_CLK_6Tcy; 
 config2 = ADC_VREF_AVDD_AVSS& 
 ADC_SCAN_OFF& 
 ADC_CONVERT_CH0& 
 ADC_SAMPLES_PER_INT_2& 
 ADC_ALT_BUF_OFF& 
 ADC_ALT_INPUT_OFF; 
 config1 = ADC_MODULE_ON& 
 ADC_IDLE_CONTINUE& 
 ADC_FORMAT_INTG& 
 ADC_CLK_AUTO& 
 ADC_AUTO_SAMPLING_ON& 
 ADC_SAMPLE_SIMULTANEOUS; 
 configscan = SCAN_NONE; 
 OpenADC10(config1, config2, config3, configport, configscan); 
} 
/*==================================PWM Module Setup =======================*/ 
void PWMSetup(void) 
{ 
 unsigned int config1, config2, config3; 
 unsigned int period, sptime; 
 unsigned int DeadTime_Config; 
 //Setup deadtime for 2us 
 DTCON1bits.DTBPS =0; 
 DTCON1bits.DTAPS =0; 
 DTCON1bits.DTB = 40; //DT=DeadTime/(Perscaler*Tcy) 
 DTCON1bits.DTA = 40; 
 DeadTime_Config = PWM_DTS3A_UA&PWM_DTS3I_UB& 
 PWM_DTS2A_UA&PWM_DTS2I_UB& 
 PWM_DTS1A_UA&PWM_DTS1I_UB; 
 SetMCPWMDeadTimeAssignment(DeadTime_Config); 
 ConfigIntMCPWM(PWM_INT_EN & PWM_INT_PR7); 
 period = 1999; //1999 Fpwm=5KHz 
 sptime = 0; 
 config1 = PWM_EN& //enable 
 PWM_IDLE_CON& 
 PWM_OP_SCALE1& //output post scaler 
 PWM_IPCLK_SCALE1& //input prescaler 
 PWM_MOD_UPDN; //mode of operation 
 config2 = PWM_MOD1_COMP& 
 PWM_MOD2_COMP& 
 PWM_MOD3_COMP& 
 PWM_PEN1H& 
 PWM_PEN2H& 
 PWM_PEN3H& 
 PWM_PEN1L& 
 PWM_PEN2L& 
 PWM_PEN3L; 
 config3 = PWM_SEVOPS1& //Special event post scaler 
 PWM_OSYNC_PWM& //output Override synchronization 
 PWM_UEN; //PWM update enable/disable 
 OpenMCPWM(period, sptime, config1, config2, config3); 
 DisableIntFLTA; 
PHỤ LỤC 
 DisableIntFLTB; 
 PDC1=0; 
 PDC2=0; 
 PDC3=0; 
} 
void Uart_Setup(void) 
{ 
 unsigned int baudvalue,U1MODEvalue,U1STAvalue; 
 CloseUART1(); 
ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 & 
 UART_TX_INT_DIS & UART_TX_INT_PR1); 
 baudvalue = 129; 
 U1MODEvalue =UART_EN & UART_IDLE_CON & 
 UART_DIS_WAKE & UART_DIS_LOOPBACK & 
 UART_DIS_ABAUD & UART_NO_PAR_8BIT & 
 UART_1STOPBIT; 
 U1STAvalue = UART_INT_TX & 
 UART_TX_PIN_NORMAL & 
 UART_TX_ENABLE & 
 UART_INT_RX_CHAR & 
 UART_ADR_DETECT_DIS & 
 UART_RX_OVERRUN_CLEAR; 
 OpenUART1(U1MODEvalue, U1STAvalue, baudvalue); 
} 
//================================Delay Routine===============================// 
void Delay_Cycle(unsigned long i_cycle) 
{ 
 unsigned long i; 
 for(i=0;i<i_cycle;i++) 
 asm("clrwdt"); 
} 
//================================LCD Routine================================// 
void ClearLCD(void) // Clear LCD 
{ 
 XlcdCursor(1,1); 
 printf(" "); 
 XlcdCursor(2,1); 
 printf(" "); 
} 
void ClearLCD_1(void) // Clear LCD at first line 
{ 
 XlcdCursor(1,1); 
 printf(" "); 
} 
void ClearLCD_2(void) // Clear LCD at second line 
{ 
 XlcdCursor(2,1); 
 printf(" "); 
} 
//==============================External Interrupt ==============================// 
void Ext_Interrupt (void) 
{ 
 ConfigINT3(FALLING_EDGE_INT & EXT_INT_ENABLE & EXT_INT_PRI_6); 
 ConfigINT4(FALLING_EDGE_INT & EXT_INT_ENABLE & EXT_INT_PRI_5); 
 ConfigINT0(FALLING_EDGE_INT & EXT_INT_ENABLE & EXT_INT_PRI_4); 
 ConfigINT1(FALLING_EDGE_INT & EXT_INT_ENABLE & EXT_INT_PRI_3); 
 ConfigINT2(FALLING_EDGE_INT & EXT_INT_ENABLE & EXT_INT_PRI_3); 
} 
//=============================== Update PDC Routine ===========================// 
PHỤ LỤC 
void Update_PDC_FW (void) 
{ 
 a=a+k; 
 if(a>719) 
 { 
 a=(a-720); 
 Voltage_Value_A = Voltage_Value * SinValue[a]; 
 } 
 else 
 { 
 Voltage_Value_A = Voltage_Value * SinValue[a]; 
 } 
 j=a; 
 b=j+240; 
 if(b>719) 
 { 
 b=(b-720); 
 Voltage_Value_B = Voltage_Value * SinValue[b]; 
 } 
 else 
 { 
 Voltage_Value_B = Voltage_Value * SinValue[b]; 
 } 
 c=j+480; 
 if(c>719) 
 { 
 c=(c-720); 
 Voltage_Value_C = Voltage_Value * SinValue[c]; 
 } 
 else 
 { 
 Voltage_Value_C = Voltage_Value * SinValue[c]; 
 } 
 PDC1 = 1999 + Voltage_Value_A; 
 PDC2 = 1999 + Voltage_Value_B; 
 PDC3 = 1999 + Voltage_Value_C; 
} 
void Update_PDC_REV (void) 
{ 
 a=a+k; 
 if(a>719) 
 { 
 a=(a-720); 
 Voltage_Value_B= Voltage_Value * SinValue[a]; 
 } 
 else 
 { 
 Voltage_Value_B = Voltage_Value * SinValue[a]; 
 } 
 j=a; 
 b=j+240; 
 if(b>719) 
 { 
 b=(b-720); 
 Voltage_Value_A = Voltage_Value * SinValue[b]; 
PHỤ LỤC 
 } 
 else 
 { 
 Voltage_Value_A = Voltage_Value * SinValue[b]; 
 } 
 c=j+480; 
 if(c>719) 
 { 
 c=(c-720); 
 Voltage_Value_C = Voltage_Value * SinValue[c]; 
 } 
 else 
 { 
 Voltage_Value_C = Voltage_Value * SinValue[c]; 
 } 
 PDC1 = 1999 + Voltage_Value_A; 
 PDC2 = 1999 + Voltage_Value_B; 
 PDC3 = 1999 + Voltage_Value_C; 
} 
//================================== Calculate Sub_routine ====================// 
void Step_Calculate(void) 
{ 
 Float_k=0.144*F_req; 
 Int_k=Float_k; 
 temp1=Float_k-Int_k; 
 if(temp1>=0.5) 
 { 
 k=Float_k+0.5; 
 } 
 else 
 { 
 k=Int_k; 
 } 
} 
void Voltage_Calculate(void) 
{ 
 Voltage_Value= F_req/0.03; 
 if( Voltage_Value >= 1900.05) //Limit modulation amplitude at 95% to avoid 
 { 
 Voltage_Value=1900.05; // dead_time induced distortion in PWM modulation 
 } 
} 
//============================ Interrupt Sub_routine ============================// 
void __attribute__((__interrupt__)) _PWMInterrupt(void) 
{ 
 IFS2bits.PWMIF=0; 
 ADC_Value=ADC_Result*0.05859375; //ADC_Value=((ADC_Result*60)/1024); 
 if((F_req+0.000005)>ADC_Value) 
 { 
 F_req=F_req-down; //SPEED DOWN 
 if(F_req<=ADC_Value) 
PHỤ LỤC 
 { 
 F_req=ADC_Value; 
 if(Rev_Status==1&&F_req==0) 
 { 
 Run=1; //Prepair For Speed Up, Load Value From ADC 
 Direction=!Direction; //Change Direction 
 Rev_Status=0; 
 PC_Value=PC_Value_Temp; 
 } 
 } 
 } 
 else 
 { 
 F_req=F_req+up; //SPEED UP 
 if(F_req>=ADC_Value) 
 { 
 F_req=ADC_Value; 
 } 
 } 
 switch(Direction) 
 { 
 case 0: //UPDATE FOR REV 
 Step_Calculate(); 
 Voltage_Calculate(); 
 Update_PDC_REV(); 
 break; 
 case 1: //UPDATE FOR FW 
 Step_Calculate(); 
 Voltage_Calculate(); 
 Update_PDC_FW(); 
 break; 
 } 
} 
//========================== UART1 Interrupt Sub-Routine =====================// 
void __attribute__((__interrupt__)) _U1RXInterrupt(void) 
{ 
 IFS0bits.U1RXIF = 0; 
 PC_Value = ReadUART1(); 
 if(PC_Value==70) 
 { 
 PC_Value=0; 
 Rev_Status=1; 
 } 
 else 
 { 
 PC_Value_Temp=PC_Value; 
 } 
 } 
//=========================External Interrupt Sub-Routine=========================// 
void __attribute__((__interrupt__)) _INT3Interrupt(void) 
{ 
CloseINT3(); 
Run=1; //RUN 
First_Run=1; 
Direction=1; 
EnableINT3; 
} 
void __attribute__((__interrupt__)) _INT4Interrupt(void) 
PHỤ LỤC 
{ 
 CloseINT4(); 
 Run=0; //STOP 
 Stop=1; 
 First_Run=0; 
 EnableINT4; 
} 
void __attribute__((__interrupt__)) _INT0Interrupt(void) 
{ 
 CloseINT0(); // Change Direction 
 Run=0; 
 First_Run=0; 
 Rev_Status=1; 
 EnableINT0; 
} 
void __attribute__((__interrupt__)) _INT1Interrupt(void) 
{ 
 CloseINT1(); // Menu 
 Run=0; 
 First_Run=0; 
 Menu_Flag=1; 
 EnableINT1; 
} 
void __attribute__((__interrupt__)) _INT2Interrupt(void) 
{ 
 CloseINT2(); // Reset 
 Run=0; 
 First_Run=0; 
 Reset=1; 
 EnableINT2; 
} 
//============================= MAIN CODE =================================// 
int main(void) 
{ 
Main: 
 TRISA=0xF000; 
 F_req=0; 
 a=0; 
 c=0; 
 b=0; 
 Menu_Flag=0; 
 Direction=1; //FW 
 Reset=0; 
 Run=0; 
 Mode=1; 
 Change_Speed=0; 
 Step_up=10; 
 Step_down=10; 
 up=0.0; 
 down=0.0; 
 PC_Value=0; 
 PC_Value_Temp=0; 
 Temp_Value=0; 
 Temp_Mode3_1=0; 
 Temp_Mode3_2=0; 
ADCSetup(); 
 XlcdInit(); //SETUP 4BIT LCD 
 XlcdWriteCmd(DON&CURSOR_OFF&BLINK_OFF); 
PHỤ LỤC 
 Ext_Interrupt(); 
 TRISFbits.TRISF8 = 1; 
 TRISFbits.TRISF7 = 1; 
 TRISDbits.TRISD8 = 1; 
 TRISDbits.TRISD9 = 1; 
 TRISDbits.TRISD10 = 1; 
 TRISDbits.TRISD11 = 1; 
//=================================WELCOME================================// 
 ClearLCD(); //Welcome Interface 
 XlcdCursor(1,8); 
 printf("LC"); 
 Delay_Cycle(300000); 
 XlcdCursor(1,7); 
 printf("LLCO"); 
 Delay_Cycle(300000); 
 XlcdCursor(1,6); 
 printf("ELLCOM"); 
 Delay_Cycle(300000); 
 XlcdCursor(1,5); 
 printf("WELLCOME"); 
 Delay_Cycle(300000); 
 XlcdCursor(1,4); 
 printf("*WELLCOME*"); 
 Delay_Cycle(300000); 
 XlcdCursor(1,3); 
 printf("**WELLCOME**"); 
 Delay_Cycle(300000); 
 XlcdCursor(1,2); 
 printf("***WELLCOME***"); 
 Delay_Cycle(300000); 
 XlcdCursor(1,1); 
 printf("****WELLCOME****"); 
 Delay_Cycle(800000); 
 XlcdCursor(2,1); 
 printf("READY TO RUN"); 
 while(ENTER) 
 { 
 XlcdCursor(2,1); 
 printf("READY TO RUN"); 
 Delay_Cycle(300000); 
 ClearLCD_2(); 
 Delay_Cycle(300000); 
 } 
 Delay_Cycle(1000000); 
LCD_Loop: 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf("Speed_Up: s"); 
 XlcdCursor(2,1); 
 printf("Speed_Down: s"); 
 while(ENTER) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
PHỤ LỤC 
 goto LCD_Loop; 
 } 
 if(NEXT==0) 
 { 
 Delay_Cycle(800000); 
 goto MODE_STATUS; 
 } 
 if(UP==0) 
 { 
 Delay_Cycle(150000); 
 if(UP==0) 
 { 
 Step_up=Step_up+1; 
 if(Step_up>20) 
 { 
 Step_up=3; 
 } 
 Delay_Cycle(100000); 
 } 
 } 
 if(DOWN==0) 
 { 
 Delay_Cycle(150000); 
 if(DOWN==0) 
 { 
 Step_up=Step_up-1; 
 if(Step_up<3) 
 { 
 Step_up=20; 
 } 
 Delay_Cycle(100000); 
 } 
 } 
 XlcdCursor(1,12); 
 printf("%2.0d",Step_up); 
 } 
 Delay_Cycle(700000); //Waitting for ENTER go back to 1 
 while(ENTER) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 goto LCD_Loop; 
 } 
 if(NEXT==0) 
 { 
 Delay_Cycle(800000); 
 goto MODE_STATUS; 
 } 
 if(UP==0) 
 { 
 Delay_Cycle(150000); 
 if(UP==0) 
 { 
 Step_down=Step_down+1; 
 if(Step_down>20) 
 { 
 Step_down=3; 
 } 
PHỤ LỤC 
 Delay_Cycle(100000); 
 } 
 } 
 if(DOWN==0) 
 { 
 Delay_Cycle(150000); 
 if(DOWN==0) 
 { 
 Step_down=Step_down-1; 
 if(Step_down<3) 
 { 
 Step_down=20; 
 } 
 Delay_Cycle(150000); 
 } 
 } 
 XlcdCursor(2,12); 
 printf("%2.0d",Step_down); 
 } 
 Delay_Cycle(300000); 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf(" IN_PUT DATA. "); 
 XlcdCursor(2,1); 
 printf("Loading"); 
 Delay_Cycle(300000); 
 XlcdCursor(2,8); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,10); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,12); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,14); 
 printf("..."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,1); 
 Delay_Cycle(1000000); 
//Calculate Speed_up and Speed_Down time for the motor 
 up=0.012/Step_up; // Time_up=(60*Tpwm)/Tup 
 down=0.012/Step_down; // Time_down=(60*Tpwm)/Tdown 
//============================== MODE CHECKING =========================// 
MODE_STATUS: 
 ClearLCD(); 
 switch (Mode) 
 { 
 case 1: //Manual Mode is chosen 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf(""); 
 XlcdCursor(2,14); 
 printf("OK"); 
PHỤ LỤC 
 while(1) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 goto LCD_Loop; 
 } 
 if(ENTER==0) 
 { 
 Delay_Cycle(50000); 
 if(ENTER==0) 
 { 
 XlcdCursor(2,14); 
 printf("RUN"); 
 Delay_Cycle(300000); 
 goto LOAD_PARAMETER; 
 } 
 } 
 if(UP==0) 
 { 
 Delay_Cycle(50000); 
 if(UP==0) 
 { 
 Mode=2; 
 Delay_Cycle(300000); 
 goto MODE_STATUS; 
 } 
 } 
 if(DOWN==0) 
 { 
 Delay_Cycle(50000); 
 if(DOWN==0) 
 { 
 Mode=4; 
 Delay_Cycle(300000); 
 goto MODE_STATUS; 
 } 
 } 
 } 
 break; 
 case 2: // AUTO_1 is chosen 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf(""); 
 XlcdCursor(2,14); 
 printf("OK"); 
 while(1) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 goto LCD_Loop; 
 } 
 if(ENTER==0) 
 { 
 Delay_Cycle(50000); 
 if(ENTER==0) 
 { 
 Delay_Cycle(300000); 
PHỤ LỤC 
 goto LOAD_PARAMETER; 
 } 
 } 
 if(UP==0) 
 { 
 Delay_Cycle(50000); 
 if(UP==0) 
 { 
 Mode=3; 
 Delay_Cycle(300000); 
 goto MODE_STATUS; 
 } 
 } 
 if(DOWN==0) 
 { 
 Delay_Cycle(50000); 
 if(DOWN==0) 
 { 
 Mode=1; 
 Delay_Cycle(300000); 
 goto MODE_STATUS; 
 } 
 } 
 } 
 break; 
 case 3: // AUTO_2 is chosen 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf(""); 
 XlcdCursor(2,14); 
 printf("OK"); 
 while( 1) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 goto LCD_Loop; 
 } 
 if(ENTER==0) 
 { 
 Delay_Cycle(50000); 
 if(ENTER==0) 
 { 
 Delay_Cycle(300000); 
 goto LOAD_PARAMETER; 
 } 
 } 
 if(UP==0) 
 { 
 Delay_Cycle(50000); 
 if(UP==0) 
 { 
 Mode=4; 
 Delay_Cycle(250000); 
 goto MODE_STATUS; 
 } 
 } 
 if(DOWN==0) 
 { 
PHỤ LỤC 
 Delay_Cycle(50000); 
 if(DOWN==0) 
 { 
 Mode=2; 
 Delay_Cycle(300000); 
 goto MODE_STATUS; 
 } 
 } 
 } 
 break; 
 case 4: // PC_Control is chosen 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf(""); 
 XlcdCursor(2,14); 
 printf("OK"); 
 while( 1) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 goto LCD_Loop; 
 } 
 if(ENTER==0) 
 { 
 Delay_Cycle(50000); 
 if(ENTER==0) 
 { 
 Delay_Cycle(300000); 
 goto LOAD_PARAMETER; 
 } 
 } 
 if(UP==0) 
 { 
 Delay_Cycle(50000); 
 if(UP==0) 
 { 
 Mode=1; 
 Delay_Cycle(250000); 
 goto MODE_STATUS; 
 } 
 } 
 if(DOWN==0) 
 { 
 Delay_Cycle(50000); 
 if(DOWN==0) 
 { 
 Mode=3; 
 Delay_Cycle(300000); 
 goto MODE_STATUS; 
 } 
 } 
 } 
 break; 
 } //End Of Switch 
//================================ LOAD PARAMETER =========================// 
LOAD_PARAMETER: 
 ClearLCD(); 
 if(Mode==3) 
PHỤ LỤC 
 { 
 Temp_1=Temp_Mode3_1; //Restore Temp_1 Value 
 Temp_2=Temp_Mode3_2; //Restore Temp_2 Value 
 XlcdCursor(1,1); 
 printf(" AUTO_2 "); 
 XlcdCursor(2,1); 
 printf("F1: F2: "); 
Mode3_Loop_1: 
 while(ENTER) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 goto MODE_STATUS; 
 } 
 if(UP==0) 
 { 
 Delay_Cycle(150000); 
 if(UP==0) 
 { 
 Temp_1=Temp_1+1; 
 if(Temp_1>60) // Limit frequency under 60Hz 
 { 
 Temp_1=0; 
 } 
 Delay_Cycle(100000); 
 } 
 } 
 if(DOWN==0) 
 { 
 Delay_Cycle(150000); 
 if(DOWN==0) 
 { 
 Temp_1=Temp_1-1; 
 if(Temp_1<0) 
 { 
 Temp_1=60; 
 } 
 Delay_Cycle(100000); 
 } 
 } 
 XlcdCursor(2,4); 
 printf("%2.0lf",Temp_1); 
 } //End of while 
 Temp_Mode3_1=Temp_1; // Save Temp_1 Value 
 Delay_Cycle(600000); // Waitting for Enter back to 1 
Mode3_Loop_2: 
 while(ENTER) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 XlcdCursor(2,13); 
 printf(" "); 
 goto Mode3_Loop_1; 
 } 
 if(UP==0) 
 { 
 Delay_Cycle(150000); 
PHỤ LỤC 
 if(UP==0) 
 { 
 Temp_2=Temp_2+1; 
 if(Temp_2>60) 
 { 
 Temp_2=0; 
 } 
 Delay_Cycle(100000); 
 } 
 } 
 if(DOWN==0) 
 { 
 Delay_Cycle(150000); 
 if(DOWN==0) 
 { 
 Temp_2=Temp_2-1; 
 if(Temp_2<0) 
 { 
 Temp_2=60; 
 } 
 Delay_Cycle(100000); 
 } 
 } 
 XlcdCursor(2,13); 
 printf("%2.0lf",Temp_2); 
 }//End of While 
 Temp_Mode3_2=Temp_2; //Save Temp_2 Value 
 ClearLCD_2(); 
 XlcdCursor(2,1); 
 printf("Loading"); 
 Delay_Cycle(300000); 
 XlcdCursor(2,8); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,10); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,12); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,14); 
 printf("..."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,1); 
 printf(" RUN"); 
 while(!Run) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 ClearLCD_2(); 
 XlcdCursor(2,1); 
 printf("F1: F2: "); 
 XlcdCursor(2,4); 
 printf("%2.0lf",Temp_1); 
 goto Mode3_Loop_1; 
 } 
 } 
 ClearLCD(); 
PHỤ LỤC 
 XlcdCursor(1,1); 
 printf("AUTO_2"); 
 XlcdCursor(1,10); 
 printf("F1:%2.0lf",Temp_1); 
 XlcdCursor(2,1); 
 printf("F:"); 
 XlcdCursor(2,10); 
 printf("F2:%2.0lf",Temp_2); 
 Temp_1=Temp_1/0.05859375; 
 Temp_2=Temp_2/0.05859375; 
 goto loop1; 
 }//end of if mode 3 
 if(Mode==1) 
 { 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf(" MANUAL "); 
 XlcdCursor(2,14); 
 printf("RUN"); 
 XlcdCursor(2,1); 
 printf("AD:"); 
 while(!Run) 
 { 
 AD=ReadADC10(0); 
 ADC=AD*0.05859375; 
 XlcdCursor(2,4); 
 printf("%2.0d",ADC); //Print Value from Variable Resistor 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 goto MODE_STATUS; 
 } 
 } 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf("M1 RUNNING..."); 
 XlcdCursor(2,1); 
 printf("F:"); 
 goto loop1; 
 }//end if mode 1 
 if(Mode==2) 
 { 
 ClearLCD(); 
 //Temp_Mode_1=0; 
 XlcdCursor(1,1); 
 printf(" AUTO_1 "); 
 XlcdCursor(2,1); 
 printf("F_Ref:"); 
Mode2_Loop: 
 Temp_Mode_1=Temp_Value; //Restore Temp_Mode_1 Value 
 while(ENTER) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(800000); 
 goto MODE_STATUS; 
 } 
 if(UP==0) 
PHỤ LỤC 
 { 
 Delay_Cycle(150000); 
 if(UP==0) 
 { 
 Temp_Mode_1=Temp_Mode_1+1; 
 if(Temp_Mode_1>60) 
 { 
 Temp_Mode_1=0; 
 } 
 Delay_Cycle(100000); 
 } 
 } 
 if(DOWN==0) 
 { 
 Delay_Cycle(150000); 
 if(DOWN==0) 
 { 
 Temp_Mode_1=Temp_Mode_1-0.5; 
 if(Temp_Mode_1<0) 
 { 
 Temp_Mode_1=60; 
 } 
 Delay_Cycle(100000); 
 } 
 } 
 //Temp_Value=Temp_Mode_1; 
 XlcdCursor(2,7); 
 printf("%2.0lf ", Temp_Mode_1); 
 }//end while 
 Temp_Value=Temp_Mode_1; //Save Temp_Mode_1 Value 
 ClearLCD_2(); 
 XlcdCursor(2,1); 
 printf("Loading"); 
 Delay_Cycle(300000); 
 XlcdCursor(2,8); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,10); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,12); 
 printf(".."); 
 Delay_Cycle(300000); 
 XlcdCursor(2,14); 
 printf("..."); 
 Delay_Cycle(300000); 
 ClearLCD_2(); 
 XlcdCursor(2,1); 
 printf("F:%2.0lf",Temp_Mode_1); 
 XlcdCursor(2,14); 
 printf("RUN"); 
 Temp_Mode_1=Temp_Mode_1/0.05859375; 
 while(!Run) 
 { 
 XlcdCursor(2,14); //Blink "RUN" character till it is pressed 
 printf("RUN"); 
PHỤ LỤC 
 Delay_Cycle(200000); 
 XlcdCursor(2,14); 
 printf(" "); 
 Delay_Cycle(200000); 
 if(BACK==0) 
 { 
 Delay_Cycle(500000); 
 ClearLCD_2(); 
 XlcdCursor(2,1); 
 printf("F_Ref:"); 
 XlcdCursor(2,7); 
 printf("%2.0lf",Temp_Mode_1); 
 goto Mode2_Loop; 
 } 
 } 
 XlcdCursor(2,14); 
 printf(" "); 
 XlcdCursor(1,1); 
 printf("M2 RUNNING..."); 
 XlcdCursor(2,9); 
 printf("F_Req:%2.0lf",Temp_Value); 
 goto loop1; 
 }//end if mode 2 
 if(Mode==4) 
 { 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf(" PC_CONTROL "); 
 XlcdCursor(2,14); 
 printf("RUN"); 
 while(!Run) 
 { 
 if(BACK==0) 
 { 
 Delay_Cycle(700000); 
 goto MODE_STATUS; 
 } 
 } 
 ClearLCD_2(); 
 XlcdCursor(2,1); 
 printf("M2 RUNNING"); 
 PC_Value=0; 
 Uart_Setup(); 
 goto loop1; 
 }//end if mode 4 
loop1: 
PWMSetup(); 
 while(1) 
 { 
 switch(Run) //Waitting for Run Button Is Pressed 
 { 
 case 1: //Run Button is not pressed 
 switch(Mode) 
 { 
 case 1: 
 ADC_Result=ReadADC10(0); 
 XlcdCursor(2,3); 
PHỤ LỤC 
 ADC_Result=ReadADC10(0); 
 printf("%2.0lf", F_req); 
 break; 
 case 2: 
 ADC_Result=Temp_Mode_1; 
 XlcdCursor(2,3); 
 printf("%2.0lf", F_req); 
 break; 
 case 3: 
 if(CHANGE==0) 
 { 
 Delay_Cycle(70000); 
 if(CHANGE==0); 
 { 
 Change_Speed=!Change_Speed; 
 Delay_Cycle(70000); 
 } 
 } 
 if(Change_Speed==1) 
 { 
 ADC_Result=Temp_2; 
 } 
 else 
 { 
 ADC_Result=Temp_1; 
 } 
 XlcdCursor(2,3); 
 printf("%2.0lf", F_req); 
 break; 
 case 4: 
 ADC_Result=PC_Value/0.05859375; 
 int_F_req=F_req; 
 delta=F_req-int_F_req; 
 if(delta>0.5) 
 { 
 int_F_req=int_F_req+1; 
 } 
 XlcdCursor(2,1); 
 printf("F:%2.0lf", F_req); 
 WriteUART1(int_F_req); 
 break; 
 } 
 break; 
 case 0: //Run Button is not pressed 
 ADC_Result=0; 
 XlcdCursor(2,3); 
 printf("%2.0lf", F_req); 
 if(F_req==0 && Stop==1) 
 { 
 CloseMCPWM(); // Disable PWM module 
 Stop=0; 
 Change_Speed=0; 
 Delay_Cycle(800000); 
 goto LOAD_PARAMETER; 
 } 
 if(F_req==0 && Menu_Flag==1) 
 { 
 CloseMCPWM(); // Disable PWM module 
 Menu_Flag=0; // Clear Menu_Flag 
PHỤ LỤC 
 Change_Speed=0; 
 Delay_Cycle(1000000); 
 PC_Value=0; 
 PC_Value_Temp=0; 
 Direction=1; 
 goto LCD_Loop; //Return to main menu 
 } 
 if(F_req==0 && Reset==1) 
 { 
 CloseMCPWM(); // Disable PWM module 
 Reset=0; // Clear Menu_Flag 
 Change_Speed=0; 
 ClearLCD(); 
 XlcdCursor(1,1); 
 printf("RESET ."); 
 Delay_Cycle(400000); 
 XlcdCursor(1,8); 
 printf(".."); 
 Delay_Cycle(400000); 
 printf(".."); 
 Delay_Cycle(400000); 
 XlcdCursor(1,12); 
 printf(".."); 
 Delay_Cycle(400000); 
 XlcdCursor(1,14); 
 printf("..."); 
 Delay_Cycle(1000000); 
 goto Main; //Return to main menu 
 } 
 break; 
 } 
 } 
} 
CODE TRONG CHƯƠNG TRÌNH GIAO TIẾP MÁY TÍNH 
Dim Y As Double 'varible in chart drawing 
Public Running As Integer 
Public dir As Integer 
Public StsRun As Byte 
Dim chuoichay As String 
Dim Voltage_Temp As Integer 
Dim strtemp As String 'varible ONCOMM event 
Dim strdata As String 
Dim datavu As String 
Dim intdigvu As Integer 
Dim digdata As Integer 
================================================================================ 
Private Sub Change_Button_Click() 
MSComm1.Output = Chr(70) 
txt_f_request.SetFocus 
If dir = 0 Then 
 dir = 1 
Else 
 dir = 0 
End If 
End Sub 
============================================================================== 
Private Sub Exit_Button_Click() 
PHỤ LỤC 
MSComm1.Output = Chr(0) 'send stop signal for PIC to stop motor 
MSComm1.PortOpen = False 'Dong cong 
End 
End Sub 
=============================================================================== 
Private Sub Form_Load() 
 chuoichay = "LUAN VAN TOT NGHIEP 2006 - 2007 
" 
'Close Serial Port if it have been already opened 
 If frmMain.MSComm1.PortOpen = True Then 
 frmMain.MSComm1.PortOpen = False 
 End If 
 frmMain.MSComm1.PortOpen = True 
 MSComm1.Output = Chr(0) 
 frmMain.MSComm1.PortOpen = False 
'Cau hinh lai Serial Port 
 frmMain.MSComm1.RThreshold = 1 'Khi nhan 1 ki tu don se phat sinh su kien CommEvent 
 frmMain.MSComm1.CommPort = 1 'Dung PORT1 
 frmMain.MSComm1.InputLen = 0 'Doc toan bo buffer 
 frmMain.MSComm1.Settings = "9600,n,8,1" 
 frmMain.MSComm1.PortOpen = True 'Mo cong 
'Form hien giua man hinh 
 frmMain.Move (Screen.Width - frmMain.Width) / 2, (Screen.Height - frmMain.Height) / 2 
 Timer2.Enabled = True 
 Timer2.Interval = 1000 
 Label8.Caption = Date 
============================================================================== 
' Chart SETTING 
 Strip1.CursorColor = RGB(255, 0, 0) 
 'Left = (Main.Width - Width) / 2 
 'Top = (Main.Height - Height) / 2 
 Xx = Now 
 For i = 0 To Strip1.Variables - 1 
 Strip1.VariableID = i 
 '.1 seconds 
 Strip1.VariableDeltaX = 1 / 24 / 60 / 60 / 10 '.1 seconds interval 
 Strip1.VariableLastX = Xx 'Set LastX to current time 
 Next 
 Strip1.XTicMode = 1 'Set X Mode to Date/Time Display 
 '60 seconds 
 Strip1.XSpan = 1 / 24 / 60 / 60 * 60 '60 seconds of display on plot 
End Sub 
=============================================================================== 
Private Sub MSComm1_OnComm() 
 With frmMain.MSComm1 
 Select Case .CommEvent 
 Case comEvReceive 
 'Nhan du lieu tu vi dieu khien 
 strtemp = .Input 
 strdata = Left(strtemp, 1) 
 datavu = Right(strtemp, 1) 
 digdata = Asc(strdata) 
 intdigvu = Asc(datavu) 
 txt_f_out = digdata 
PHỤ LỤC 
 Voltage_Temp = digdata * 3.667 
 Voltage = Voltage_Temp 
 End Select 
 End With 
End Sub 
========================================================================= 
Private Sub ProgressBar1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
End Sub 
========================================================================= 
Private Sub Timer1_Timer() 
 Strip1.AddXY 0, Now, Y 
 Y = digdata 
End Sub 
============================================================================= 
Private Sub cmdStart_Click() 
j = txt_f_request.Text 
If (j > 60) Then 
 MsgBox ("Frequency must be in range from 0 to 60 Hz") 
 txt_f_request = "" 
 txt_f_request.SetFocus 
Else 
 'Status = "Motor Is Running ........" 
 StsRun = 1 
 MSComm1.Output = Chr(j) 
 txt_f_request.SetFocus 
End If 
End Sub 
============================================================================== 
Private Sub Cmd_STOP_Click() 
MSComm1.Output = Chr(0) 
Status = "Stopping" 
StsRun = 0 
txt_f_request.SetFocus 
End Sub 
=============================================================================== 
Private Sub Form_Unload(Cancel As Integer) 
 MSComm1.Output = Chr(0) 'send stop signal for PIC to stop motor 
 MSComm1.PortOpen = False 'Dong cong 
End Sub 
=============================================================================== 
Private Sub Timer2_Timer() 
Label7.Caption = Time 
End Sub 
=============================================================================== 
Private Sub Timer3_Timer() 
If StsRun = 1 Then 
 Running = Running + 5 
 If (Running > 100) Then 
 Running = RunProgressBar.Min 
 End If 
 RunProgressBar.Value = Running + RunProgressBar.Min 
Else 
 If txt_f_out = 0 Then 
 RunProgressBar.Value = 0 
 Else 
 Running = Running + 5 
 If (Running > 100) Then 
 Running = RunProgressBar.Min 
PHỤ LỤC 
 End If 
 RunProgressBar.Value = Running + RunProgressBar.Min 
 End If 
End If 
End Sub 
=============================================================================== 
Private Sub Timer4_Timer() 
If (StsRun = 1) Then 
 Status = "Running" 
End If 
If (txt_f_out = 0) Then 
 Status = "Stopped!!" 
End If 
If dir = 0 Then 
 Direction = "Forward" 
 Else 
 Direction = "Reverse" 
 End If 
 End Sub 
=============================================================================== 
Private Sub Timer5_Timer() 
 Dim chuoi1, chuoi2 As String 
 chuoi1 = Left(chuoichay, 1) 
 chuoi2 = Right(chuoichay, Len(chuoichay) - 1) 
 frmMain.Caption = chuoi2 + chuoi1 
 chuoichay = chuoi2 + chuoi1 
End Sub 
PHỤ LỤC 
TÀI LIỆU THAM KHẢO 
TÀI LIỆU THAM KHẢO TRONG NƯỚC 
[1] TS. Phan Quốc Dũng  Tô Hữu Phước (2003). Truyền Động Điện. Nhà xuất bản 
Đại học Quốc gia TP.Hồ Chí Minh 
[2] TS. Nguyễn Văn Nhờ (2003). Cơ Sở Truyền Động Điện. Nhà xuất bản Đại học 
Quốc gia TP.Hồ Chí Minh 
[3] TS. Nguyễn Văn Nhờ (2003). Điện Tử Công Suất 1. Nhà xuất bản Đại học Quốc 
gia TP.Hồ Chí Minh 
TÀI LIỆU THAM KHẢO NƯỚC NGOÀI 
[4] 16bit_Language_Tools_Libraries. Microchip Techology Inc 
[5] Prof. Ali Keyhani, Pulse-Width Modulation (PWM) Techniques  lecture 25, 
Department of Electrical and Computer EngineeringThe Ohio State University 
[6] dsPic® Language Tools Getting Started. Microchip Techology Inc 
[7] MPLAB® C30 _ C Compiler Users Guide . Microchip Techology Inc 
[8] dsPIC30F6010 Data Sheet High-Performance Digital Signal Controllers . 
Microchip Techology Inc 
[9] dsPIC30F Family Reference Manual. Microchip Techology Inc 
[10] An Introduction To AC Induction Motor Control Using The dsPIC30F MCU. 
Microchip Techology Inc 
WEBSITE THAM KHẢO 
            Các file đính kèm theo tài liệu này:
 luan_van_hoan_chinh_0097.pdf luan_van_hoan_chinh_0097.pdf