GIẢI THUẬT CHƯƠNG TRÌNH

Một phần của tài liệu Điều khiển nhiệt độ nhiều kênh dùng dsPIC (Full Code) (Trang 50)

3.2.1 Đối tượng điều khiển

Đối tượng điều khiển là nhiệt độ, tăng nhiệt độ bằng cách tăng PWM – thay đổi độ rộng xung (duty cycle).

Vậy ngõ vào và ra của bộ điều khiển PID:

- Ngõ vào: e = nhiệt độ đặt (t_da) – nhiệt độ đo (t_do) - Ngõ ra: u = % duty cycle

3.2.2 Cách tính nhiệt độ trong đề tài

Cảm biến LM35 là cảm biến tương tự vì vậy ta phải dùng bộ ADC chuyển sang tương tự thì mới tính toán được nhiệt độ.

Ta có: U= t.k u là điện áp đầu ra

t là nhiệt độ môi trường đo, k là hệ số theo nhiệt độ của LM35 10mV/1 độ C

Điện áp cấp cho LM35 là 5V ADC 12bit

Vậy bước thay đổi của LM35 sẽ là 5/(2^12) = 5/4096 Giá trị ADC đo được thì điện áp đầu vào của LM35 là (t*k)/(5/4096) = ((10^-2)*4096*t)/5 = 4.096*t

Vậy nhiệt độ ta đo được t = giá trị ADC/4096 Tính nhiệt độ trong đề tài:

coun_adc = 0; sum_adc = 0; while(coun_adc < 3000){ adc = read_adc(); sum_adc += adc; coun_adc++; }; tdo_1 = sum_adc/30000;

3.2.3 Cách tính toán PWM duty trong đề tài

Các ký hiệu:

+ Kp, Ki, Kd lần lượt là các hệ số Kp,Ki, Kd. + err là sai lệch hiện tại (trong lúc đang xét). + pre_err là sai lệch ngay trước đó.

+ e_sum là tổng của tất cả các sai lệch từ lúc bắt đầu đến thời điểm đang xét.

+ t_da là nhiệt độ đặt (oc).

+ t_do là nhiệt độ đo đọc được từ cảm biến LM35. + duty là độ rộng của xung PWM.

- Cách tính:

#define period 5000 err_1 = tda_1 - tdo_1;

p_part_1 = (signed int32)kp_1*err_1; if(p_part_1 > period){p_part_1 = period;}; if(p_part_1 < -period){p_part_1 =- period;}; if(ki_1 != 0){

i_part_1 += ((signed int32)ki_1*err_1); }

else{

i_part_1 = 0; };

if(i_part_1 > period){i_part_1 = period;}; if(i_part_1 < -period){i_part_1 =- period;};

if(tdo_1 >= tda_1){i_part_1 = 0;}; d_part_1=((signed int32)kd_1*(err_1 - pre_err_1)); if(d_part_1 > period){d_part_1 = period;};

if(d_part_1 < -period){d_part_1 =- period;}; pre_err_1 = err_1; output_1 = p_part_1 + i_part_1 + d_part_1; if(output_1 > period){output_1 = period;}; if(output_1 < 0){output_1 = 0;};

if(tdo_1 > tda_1){output_1 = 0;}; temp = output_1*65472/period; set_pwm_duty(1,temp);

3.2.4 Chương trình chính

Hình 3.41 Lưu đồ chương trình chính

START

Khởi tạo LCD, đọc dữ liệu EEPROM, khởi tạo ADC, khởi

tạo PWM, khởi tạo timer, cho phép ngắt.

Đo nhiệt độ

Điều khiển PID HOẶC ON/OFF d

Kết nối với máy tính END

3.2.5 Chương trình PID

Hình 3.42 Lưu đồ thuật toán PID

PID Err = Tda - Tdo

P_part = Kp*Err

I_part += Ki*Err

D_part = Kd (Err – Pre_Err)

Pre_Err = Err

Output = P_part + I_part + D_part

3.2.6 Chương trình ON/OFF

3.2.7 Chương trình kết nối với máy tính

Hình 3.44 Lưu đồ kết nối với máy tính

N Y N N Y Y Y

Kết nối với máy tính

Có dữ liệu

trong bộ đệm END

Yêu cầu gửi

dữ liệu Gửi dữ liệu lên máy tính.

Thông số cài

đặt lò 1 Lưu thông số và hiển thị.

Y Thông số cài đặt lò 2 Lưu thông số và hiển thị. Trạng thái START/STO P Lưu trạng thái END

3.2.8 Chương trình ngắt dữ liệu trên máy tính

CHƯƠNG 4. KẾT QUẢ THI CÔNG

4.1 Giao diện điều khiển trên visual basic 2005:

Hình 4.46 Giao diện điều khiển

4.2 Mô hình

4.3 Kết quả thực nghiệm trên mô hình4.3.1 Thực nghiệm 1 4.3.1 Thực nghiệm 1

Hình 4.48 Thực nghiệm 1

Lò 1: điều khiển bằng PID với nhiệt độ đặt là 70 các hệ số PID là Kp = 7,Ki = 1, Kd = 3.

Nhận xét: chất lương điều khiển chưa tốt thời gian đáp ứng chậm, sai số xác lặp cao.

Lò 2: điều khiển bằng ON/OFF với nhiệt độ đặt là 80. Nhận xét: chất lượng điều khiển tốt.

4.3.2 Thực nghiệm 2

Hình 4.49 Thực nghiệm 2

Lò 1: Điểu khiển PID với nhiệt độ đặt 70, các thông số PID là Kp = 8, Ki = 10, Kd = 20

Nhận xét: chất lương điều khiển tương đối tốt không độ vọt lố,thời gian đáp ứng nhanh, sai số xác lập nhỏ.

Lò 2: điều khiển ON/OFF với nhiệt độ đặt 80 Nhận xét: chất lượng điều khiển tốt

Hình 4.50 Thực nghiệm 3

Lò 1: điều khiển ON/OFF với nhiệt độ đặt 70 Nhận xét: chất lượng điều khiển tốt

Lò 2:điểu khiển PID với nhiệt độ đặt 60, các thông số PID là Kp = 5, Ki = 10, Kd = 20

Nhận xét: chất lượng điều khiển tốt không độ vọt lố, thời gian đáp ứng nhanh, sai số xác lập nhỏ.

4.3.4 Thực nghiệm 4

Hình 4.51 Thực nghiệm 4

Cả 2 lò cùng điều khiển bằng PID cùng tốc độ đặt và cùng thông số PID. Nhận xét:

Cả 2 lò có chất lượng điều khiển tốt sai số xác lặp nhỏ, không độ vọt lố và thời gian đáp ứng nhanh.

CHƯƠNG 5. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI

5.1 Kết luận

Qua đề tài này em đã làm được những yêu cầu sau:

 Thứ nhất:

Tìm hiểu về vi điều khiển dsPIC 30F4013 viết chương trình và thuật toán PID, thuật toán ON/OFF trên CCS nạp vào vi điều khiển dsPIC và thông qua mạch công suất để điều khiển lò nhiệt.

 Thứ hai:

Tìm hiểu về Visual Basic 2005 để thiết kế giao diện và viết chương trình để truyền các thông số PID và nhiệt độ đặt xuống vi điều khiển đồng thời nhận nhiệt độ đo được từ vi điều khiển vẽ đồ thị đánh giá chất lượng điều khiển.

 Thứ ba:

Thiết kế được mô hình phần cứng của 2 lò nhiệt.

5.2 Một số điểm hạn chế

- Lò nhiệt làm còn thô sơ, băm xung ở tần số 1HZ nên đèn chớp liên tục dễ hư đèn, bộ phân hạ nhiệt chỉ có quạt hút phải thiết kế thêm 1 quạt thổi trong lò nhiệt.

5.3 Hướng phát triển đề tài:

- Thiết kế các khối mạch độ có công suất lớn hơn để có thể điều khiển nhiệt độ cao dùng trong công nghiệp.

- Nghiên cứu và cải tiến bộ điều khiển PID trong đề tài thành bộ điều khiển PID-Mờ hoặc PID-Mờ thích nghi để có chất lượng điều khiển tốt hơn.

CHƯƠNG 6.TÀI LIỆU THAM KHẢO

Tiếng việt

[1] Huỳnh Minh Ngọc “tailieudspic30f4013”, Đại Học Công Nghiệp TPHCM.

[2]Huỳnh Thái Hoàng lý thuyết điều khiển tự động . Đại học bách khoa Thành Phố Hồ Chí Minh.

[3] Huỳnh Minh Ngọc đo lường và điều khiển bằng máy tính . Đại học công nghiệp Thành Phố Hồ Chí Minh

[4] Nguyễn Bính (2000) Điện tử công suất. Nhà xuất bản Khoa học và kỹ thuật.

[5] Bùi Đình Tiếu (2004) Giáo trình Truyền động điện. Nhà xuất bản giáo dục.

[6] Các tài liệu dạng file PDF gồm: Giáo trình, Data Sheet linh kiện,… [7] Các wedside tham khảo:

www.dientuvietnam.net www.diendandientu.vn

www.picvietnam.com

www.alldatasheet.com

Tiếng anh

[1] Microchip, dsPIC30F3014/4013Data Sheet High-Performance, 16-Bit Digital Signal Controllers, Getting Started with dsPIC30F.

[2] Zoran Milivojević, Djordje Šaponjić, Programming dsPIC Microcontrollers in C, MikroElektronika Publication.

CHƯƠNG 7. PHỤ LỤC

1. Chương trình chính viết trên vi điều khiển dsPIC30F4013

#include <30f4013.h> #device ADC = 12 #use delay(clock=22118400) #include "lcd16x2.c" #use rs232(UART1A,baud=9600,parity=N,xmit=PIN_C13,rcv=PIN_C14,bits=8) #FUSES HS,NOWDT,BROWNOUT,MCLR,PROTECT,NODEBUG void tinh_nhiet_do(); void pid_1(); void pid_2(); void ket_noi_pc(); void dieu_khien_onoff();

unsigned int8 du_lieu_nhan[10]; unsigned int8 du_lieu_gui[30]; unsigned int8 i = 0;

unsigned int8 value = 0; int1 status_rda = 0; #define read_data 1 #define save_lo_1 2 #define save_pid_1 3 #define save_lo_2 4 #define save_pid_2 5 #define start_stop 6 #define test 7

//Dinh nghia chan diei khien #define dk_1 PIN_D0 #define dk_2 PIN_D1 #define fan_1 PIN_D2 #define fan_2 PIN_D3

unsigned int16 tdo_1 = 0, tdo_2 = 0; unsigned int16 tda_1 = 0, tda_2 = 0; unsigned int8 st_pid_1 = 0;

unsigned int8 st_pid_2 = 0; unsigned int8 st_start_stop = 0; unsigned int8 st_test = 0; unsigned int8 st_dk_1 = 0; unsigned int8 st_fan_1 = 0; unsigned int8 st_dk_2 = 0; unsigned int8 st_fan_2 = 0;

unsigned int16 temp; //Bien tam //Cac thong so PID

#define period 5000

unsigned int16 ki_1 = 0;

unsigned int16 kd_1 = 0; signed int32 err_1 = 0; //Sai so hien tai signed int32 pre_err_1 = 0; //Sai so truoc do signed int32 p_part_1 = 0;

signed int32 i_part_1 = 0; signed int32 d_part_1 = 0; signed int32 output_1 = 0;

unsigned int16 kp_2 = 0; //Thong so PID 2 unsigned int16 ki_2 = 0;

unsigned int16 kd_2 = 0; signed int32 err_2 = 0; //Sai so hien tai signed int32 pre_err_2 = 0; //Sai so truoc do signed int32 p_part_2 = 0;

signed int32 i_part_2 = 0; signed int32 d_part_2 = 0; signed int32 output_2 = 0; void main(){ //Khoi tao LCD lcd_init(); lcd_gotoxy(1,1); printf(lcd_putc,"Do Nhiet Do LM35"); lcd_gotoxy(1,2);

printf(lcd_putc,"DK ON/OFF & PID"); delay_ms(1000);

printf(lcd_putc,"\f"); //Doc du lieu EEPROM //Du lieu lo 1 tda_1 = read_eeprom(0); if(tda_1 > 200) tda_1 = 0; st_pid_1 = read_eeprom(2); if(st_pid_1 > 1) st_pid_1 = 0; kp_1 = read_eeprom(4); if(kp_1 > 5000) kp_1 = 0; ki_1 = read_eeprom(6); if(ki_1 > 5000) ki_1 = 0; kd_1 = read_eeprom(8); if(kd_1 > 5000) kd_1 = 0; //Du lieu lo 2 tda_2 = read_eeprom(10); if(tda_2 > 200) tda_2 = 0; st_pid_2 = read_eeprom(12); if(st_pid_2 > 1) st_pid_2 = 0; kp_2 = read_eeprom(14); if(kp_2 > 5000) kp_2 = 0; ki_2 = read_eeprom(16);

if(ki_2 > 5000) ki_2 = 0; kd_2 = read_eeprom(18); if(kd_2 > 5000) kd_2 = 0; //Hien thi len LCD

lcd_gotoxy(1,2);

printf(lcd_putc,"%3u",tda_1); lcd_gotoxy(9,2);

printf(lcd_putc,"%3u",tda_2); //Khoi tao ADC

SETUP_ADC_PORTS(sAN1|sAN2,VSS_VREF); //Range 0-VrefH SETUP_ADC(ADC_CLOCK_DIV_64|ADC_TAD_MUL_2); //Clock External, Auto-sample time = 0

//Khoi tao PWM set_pwm_duty(1,0); set_pwm_duty(2,0);

setup_timer2(TMR_INTERNAL | TMR_DIV_BY_64, 0xFFC0); if(st_pid_1){

setup_compare(1, COMPARE_PWM | COMPARE_TIMER2); }

else{

setup_compare(1, COMPARE_OFF); };

if(st_pid_2){

setup_compare(2, COMPARE_PWM | COMPARE_TIMER2); }

else{

setup_compare(2, COMPARE_OFF); };

//Khoi tao Timer thoi gian tinh PID

SETUP_TIMER1(TMR_INTERNAL|TMR_DIV_BY_256,21600); //Dung cho thoi gian lay mau

//Tat quat

output_bit(fan_1,0); output_bit(fan_2,0); //Cho phep ngat

ENABLE_INTERRUPTS(INT_TIMER1); ENABLE_INTERRUPTS(INT_RDA); ENABLE_INTERRUPTS(INTR_GLOBAL); while(TRUE){ tinh_nhiet_do(); dieu_khien_onoff(); ket_noi_pc(); } } void dieu_khien_onoff(){ if(st_start_stop){

if(st_pid_1 == 0){

if(tdo_1 < tda_1) output_bit(dk_1,1); else output_bit(dk_1,0);

if(tdo_1 >= tda_1) output_bit(fan_1,1); else output_bit(fan_1,0);

};

if(st_pid_2 == 0){

if(tdo_2 < tda_2) output_bit(dk_2,1); else output_bit(dk_2,0);

if(tdo_2 >= tda_2) output_bit(fan_2,1); else output_bit(fan_2,0); }; }; } void ket_noi_pc(){ unsigned int8 j = 0; if(status_rda == 1){ status_rda = 0; if(du_lieu_nhan[0] == read_data){ //Gui nhiet do lo 1 du_lieu_gui[0] = tdo_1/128; du_lieu_gui[1] = tdo_1%128; //Gui nhiet do dat lo 1

du_lieu_gui[2] = tda_1/128; du_lieu_gui[3] = tda_1%128; //Gui trang thai lo 1

du_lieu_gui[4] = st_pid_1; //Gui PID dat lo 1

du_lieu_gui[5] = kp_1/128; du_lieu_gui[6] = kp_1%128; du_lieu_gui[7] = ki_1/128; du_lieu_gui[8] = ki_1%128; du_lieu_gui[9] = kd_1/128; du_lieu_gui[10] = kd_1%128; //Gui nhiet do lo 2 du_lieu_gui[11] = tdo_2/128; du_lieu_gui[12] = tdo_2%128; //Gui nhiet do dat lo 2

du_lieu_gui[13] = tda_2/128; du_lieu_gui[14] = tda_2%128; //Gui trang thai lo 2

du_lieu_gui[15] = st_pid_2; //Gui PID dat lo 2

du_lieu_gui[16] = kp_2/128; du_lieu_gui[17] = kp_2%128; du_lieu_gui[18] = ki_2/128;

du_lieu_gui[19] = ki_2%128; du_lieu_gui[20] = kd_2/128; du_lieu_gui[21] = kd_2%128; //Gui Trang thai Start Stop du_lieu_gui[22] = st_start_stop; //Gui trang thai DK he ho

du_lieu_gui[23] = st_test; du_lieu_gui[24] = st_dk_1; du_lieu_gui[25] = st_fan_1; du_lieu_gui[26] = st_dk_2; du_lieu_gui[27] = st_fan_2; printf("%c",0xfe); //Start code for(j = 0;j < 28;j ++){

printf("%c",du_lieu_gui[j]); };

}

if(du_lieu_nhan[0] == save_lo_1){

tda_1 = (unsigned int16)du_lieu_nhan[1]*128 + du_lieu_nhan[2]; st_pid_1 = du_lieu_nhan[3];

write_eeprom(0,tda_1); write_eeprom(2,st_pid_1); if(st_start_stop){

if(st_pid_1){

setup_compare(1, COMPARE_PWM | COMPARE_TIMER2); } else{ setup_compare(1, COMPARE_OFF); }; }; lcd_gotoxy(1,2); printf(lcd_putc,"%3u",tda_1); }; if(du_lieu_nhan[0] == save_pid_1){

kp_1 = (unsigned int16)du_lieu_nhan[1]*128 + du_lieu_nhan[2]; ki_1 = (unsigned int16)du_lieu_nhan[3]*128 + du_lieu_nhan[4]; kd_1 = (unsigned int16)du_lieu_nhan[5]*128 + du_lieu_nhan[6]; write_eeprom(4,kp_1);

write_eeprom(6,ki_1); write_eeprom(8,kd_1); };

if(du_lieu_nhan[0] == save_lo_2){

tda_2 = du_lieu_nhan[1]*128 + du_lieu_nhan[2]; st_pid_2 = du_lieu_nhan[3];

write_eeprom(10,tda_2); write_eeprom(12,st_pid_2); if(st_start_stop){

if(st_pid_2){

setup_compare(2, COMPARE_PWM | COMPARE_TIMER2); } else{ setup_compare(2, COMPARE_OFF); }; }; lcd_gotoxy(9,2); printf(lcd_putc,"%3u",tda_2); }; if(du_lieu_nhan[0] == save_pid_2){

kp_2 = (unsigned int16)du_lieu_nhan[1]*128 + du_lieu_nhan[2]; ki_2 = (unsigned int16)du_lieu_nhan[3]*128 + du_lieu_nhan[4]; kd_2 = (unsigned int16)du_lieu_nhan[5]*128 + du_lieu_nhan[6]; write_eeprom(14,kp_2); write_eeprom(16,ki_2); write_eeprom(18,kd_2); }; if(du_lieu_nhan[0] == start_stop){ st_start_stop = du_lieu_nhan[1]; if(st_start_stop){ if(st_pid_1)setup_compare(1, COMPARE_PWM | COMPARE_TIMER2); if(st_pid_2)setup_compare(2, COMPARE_PWM | COMPARE_TIMER2); } else{ if(st_pid_1)setup_compare(1, COMPARE_OFF); else output_bit(dk_1,0); if(st_pid_2)setup_compare(2, COMPARE_OFF); else output_bit(dk_2,0); output_bit(fan_1,0); output_bit(fan_2,0); }; }; if(du_lieu_nhan[0] == test){ st_test = du_lieu_nhan[1]; if(st_test){ st_dk_1 = du_lieu_nhan[2]; if(st_dk_1){ output_bit(dk_1,1); } else{ output_bit(dk_1,0); };

st_fan_1 = du_lieu_nhan[3]; if(st_fan_1){ output_bit(fan_1,1); } else{ output_bit(fan_1,0); }; st_dk_2 = du_lieu_nhan[4]; if(st_dk_2){ output_bit(dk_2,1); } else{ output_bit(dk_2,0); }; st_fan_2 = du_lieu_nhan[5]; if(st_fan_2){ output_bit(fan_2,1); } else{ output_bit(fan_2,0); }; } else{ output_bit(dk_1,0); st_dk_1 = 0; output_bit(fan_1,0); st_fan_1 = 0; output_bit(dk_2,0); st_dk_2 = 0; output_bit(fan_2,0); st_fan_2 = 0; }; }; } } void tinh_nhiet_do(){

unsigned int16 coun_adc = 0; unsigned int16 adc;

unsigned int32 sum_adc = 0; //Do nhiet do kenh 1

SET_ADC_CHANNEL(1); delay_ms(1);

sum_adc = 0;

while(coun_adc < 3000){ //Chuyen doi ADC LM35 1 adc = read_adc();

sum_adc += adc; coun_adc++; };

tdo_1 = sum_adc/30000; //Do nhiet do kenh 2

SET_ADC_CHANNEL(2); delay_ms(1);

coun_adc = 0; sum_adc = 0;

while(coun_adc < 3000){ //Chuyen doi ADC LM35 1 adc = read_adc(); sum_adc += adc; coun_adc++; }; tdo_2 = sum_adc/30000; //Hien thi ra LCD lcd_gotoxy(1,1); printf(lcd_putc,"L1%3u%cC",tdo_1,0xdf); lcd_gotoxy(9,1); printf(lcd_putc,"L2%3u%cC",tdo_2,0xdf); }

#INT_TIMER1 //Thoi gian tinh PID 1 S void timer1_isr(){

if(st_pid_1 && st_start_stop) pid_1(); else i_part_1 = 0;

if(st_pid_2 && st_start_stop) pid_2(); else i_part_2 = 0;

}

void pid_1(){

err_1 = tda_1 - tdo_1;

p_part_1 = (signed int32)kp_1*err_1; if(p_part_1 > period){p_part_1 = period;}; if(p_part_1 < -period){p_part_1 =- period;}; if(ki_1 != 0){

i_part_1 += ((signed int32)ki_1*err_1); }

else{

i_part_1 = 0; };

if(i_part_1 > period){i_part_1 = period;}; if(i_part_1 < -period){i_part_1 =- period;};

if(tdo_1 >= tda_1){i_part_1 = 0;}; d_part_1=((signed int32)kd_1*(err_1 - pre_err_1));

if(d_part_1 > period){d_part_1 = period;}; if(d_part_1 < -period){d_part_1 =- period;}; pre_err_1 = err_1; output_1 = p_part_1 + i_part_1 + d_part_1; if(output_1 > period){output_1 = period;}; if(output_1 < 0){output_1 = 0;}; if(tdo_1 > tda_1){output_1 = 0;}; temp = output_1*65472/period; set_pwm_duty(1,temp); } void pid_2(){

err_2 = tda_2 - tdo_2;

p_part_2 = (signed int32)kp_2*err_2; if(p_part_2 > period){p_part_2 = period;}; if(p_part_2 < -period){p_part_2 =- period;}; if(ki_2 != 0){

i_part_2 += ((signed int32)ki_2*err_2); }

else{

i_part_2 = 0; };

if(i_part_2 > period){i_part_2 = period;}; if(i_part_2 < -period){i_part_2 =- period;};

if(tdo_2 >= tda_2){i_part_2 = 0;}; d_part_2=((signed int32)kd_2*(err_2 - pre_err_2)); if(d_part_2 > period){d_part_2 = period;};

if(d_part_2 < -period){d_part_2 =- period;}; pre_err_2 = err_2; output_2 = p_part_2 + i_part_2 + d_part_2; if(output_2 > period){output_2 = period;}; if(output_2 < 0){output_2 = 0;}; if(tdo_2 > tda_2){output_2 = 0;}; temp = output_2*65472/period; set_pwm_duty(2,temp); } #INT_RDA void receive_isr(){ value = getchar();

if(value == 0xfe){i = 0;goto exit;}; if(i < 7){ du_lieu_nhan[i] = value; i++; if(i == 7){ status_rda = 1; }; }; exit:; }

2. Chương trình viết trên visual basic 2005

Public Class Form1

Dim Du_Lieu(30) As Integer Dim Coun As Integer

Dim Temp As Integer Dim Status As Integer Dim St_Test As Byte Dim St_Lo_1 As Byte Dim St_Fan_1 As Byte Dim St_Lo_2 As Byte Dim St_Fan_2 As Byte

Const Read_Data = 1 Const Save_Lo_1 = 2 Const Save_Pid_1 = 3 Const Save_Lo_2 = 4 Const Save_Pid_2 = 5 Const Start_Stop = 6 Const Test = 7

Dim X_TeeChart1 As Double Dim Y_TeeChart1 As Double Dim X_TeeChart2 As Double Dim Y_TeeChart2 As Double Dim TDo_1 As Integer

Dim TDo_2 As Integer Dim TDa_1 As Integer Dim TDa_2 As Integer

Private Sub Form1_Load(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

MyBase.Load

Status = Read_Data End Sub

Private Sub Cmd_Open_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Cmd_Open.Click

If Cmd_Open.Text = "KET NOI" Then

SerialPort1.PortName = CboPort.Text SerialPort1.Encoding =

System.Text.Encoding.GetEncoding(28591) SerialPort1.Open()

Cmd_Open.Text = "NGAT KET NOI" Timer_Read.Enabled = True

Else

SerialPort1.Close()

Cmd_Open.Text = "KET NOI" Timer_Read.Enabled = False End If

End Sub

Private Sub SerialPort1_DataReceived(ByVal

sender As Object, ByVal e As

System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim n As Integer Dim i As Integer n = SerialPort1.BytesToRead For i = 1 To n Temp = SerialPort1.ReadChar If Temp = 254 Then Coun = 0 Else Du_Lieu(Coun) = Temp If Coun < 29 Then Coun = Coun + 1 If Coun = 27 Then 'Lay du lieu Lo 1

Temp = Du_Lieu(0) * 128 + Du_Lieu(1) Lbl_Tdo1.Text = Temp

TDo_1 = Temp

Temp = Du_Lieu(2) * 128 + Du_Lieu(3) TDa_1 = Temp

Lbl_Tda1.Text = Temp 'Trang thai ON/OFF - PID Temp = Du_Lieu(4) If Temp = 0 Then Lbl_OnOff1.Text = "ON-OFF" Else Lbl_OnOff1.Text = "PID" End If 'Kd 1

Temp = Du_Lieu(5) * 128 + Du_Lieu(6) Lbl_Kp1.Text = Temp

'Ki 1

Temp = Du_Lieu(7) * 128 + Du_Lieu(8) Lbl_Ki1.Text = Temp

'Kd 1

Temp = Du_Lieu(9) * 128 + Du_Lieu(10) Lbl_Kd1.Text = Temp

'Lay du lieu Lo 2

Temp = Du_Lieu(11) * 128 + Du_Lieu(12) Lbl_Tdo2.Text = Temp

TDo_2 = Temp

Temp = Du_Lieu(13) * 128 + Du_Lieu(14) TDa_2 = Temp

Lbl_Tda2.Text = Temp 'Trang thai ON/OFF - PID Temp = Du_Lieu(15) If Temp = 0 Then Lbl_OnOff2.Text = "ON-OFF" Else Lbl_OnOff2.Text = "PID" End If 'Kd 2

Temp = Du_Lieu(16) * 128 + Du_Lieu(17) Lbl_Kp2.Text = Temp 'Ki 2

Temp = Du_Lieu(18) * 128 + Du_Lieu(19) Lbl_Ki2.Text = Temp 'Kd 2

Temp = Du_Lieu(20) * 128 + Du_Lieu(21) Lbl_Kd2.Text = Temp 'Trang Thai Start Stop Temp = Du_Lieu(22) If Temp = 1 Then Cmd_Start.Text = "STOP" Else Cmd_Start.Text = "START" End If

'Trang Thai Test

If Du_Lieu(23) = 1 Then Cmd_KhaoSat.Text = "KHAO SAT OFF" Else

Cmd_KhaoSat.Text = "KHAO SAT ON" End If

If Du_Lieu(24) = 1 Then Cmd_Lo1.Text = "LO 1 OFF" Else

Cmd_Lo1.Text = "LO 1 ON" End If

If Du_Lieu(25) = 1 Then Cmd_Quat1.Text = "QUAT OFF" Else

Cmd_Quat1.Text = "QUAT ON" End If

If Du_Lieu(26) = 1 Then Cmd_Lo2.Text = "LO 2 OFF" Else

End If

If Du_Lieu(27) = 1 Then Cmd_Quat2.Text = "QUAT OFF" Else

Cmd_Quat2.Text = "QUAT ON"

Một phần của tài liệu Điều khiển nhiệt độ nhiều kênh dùng dsPIC (Full Code) (Trang 50)

Tải bản đầy đủ (DOC)

(77 trang)
w