Kết quả thực nghiệm

Một phần của tài liệu THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN NHIỆT độ DÙNG đèn HALOGEN (Trang 25 - 41)

Trong quá trình thực nghiệm trên hệ thống thật để đạt được các chỉ tiêu chất lượng yêu cầu chúng em đã tinh chỉnh bộ điều khiển PID mới trên cơ sở bộ điều khiển PID được thiết kế trên matlab. Bộ điều khiển mới như sau:

26

Hình 3.4: Đặc tính của hệ thống.

So với kết quả mô phỏng trên Matlab và trên giao diện chương trình ta có thế đánh giá. Đặc tính hệ thống sau khi thực hiện bộ điều khiển là tương đối tốt đáp ứng chỉ tiêu chất lượng: độ quá điều chỉnh nhỏ, thời gian đáp ứng ngắn.

27

Hình 3.5: Nhiệt độ đặt 100°C.

Khi giá trị đặt ở 100°C sau khoảng 150s thì hệ thống tăng nhiệt độ từ 30°C đến gần 100°C. Sau khoảng hơn 200s thì vào trạng thái xác lập, độ quá điều chỉnh khoảng 1,6%

28

Hình 3.6: Đáp ứng của hệ thông khi tăng nhiệt độ đặt.

Khi tăng nhiệt độ đặt thì hệ thống vẫn khá ổn định và bám vào giá trị đặt mới khá tốt. Khi tăng nhiệt độ từ 32°C lên 60°C thì độ quá điều chỉnh khoảng 2,5%, thời gian xác lập khoảng 220s. Khi tăng từ 60°C lên 80°C thì độ quá điều chỉnh khoảng 3%, thời gian xác lập khoảng 260s.

29

Hình 3.7: Đáp ứng của hệ thống khi giảm nhiệt độ đặt.

Khi giảm nhiệt độ đặt thì hệ thống vẫn khá ổn định và bám vào giá trị đặt mới khá tốt, tuy nhiên khi nhiệt độ càng thấp thì thời gian xác lập sẽ lâu hơn.

30

Hình 3.8: Hệ thống lò nhiệt dùng đèn halogen.

Lò nhiệt sử dụng bóng halogen được điều khiển từ máy tính qua chương trình điều khiển và giám sát trên máy tính trong thực tế. Trong hình 3.8 trên gồm giao diện điều khiển, mạch điều khiển và lò nhiệt.

31

KẾT LUẬN

Các kết quả đạt được

Trên cơ sở thiết kế phần cứng và phần mềm khi thực hiện đồ án đã đạt được một số kết quả sau:

- Thiết kế được hệ thống điều khiển nhiệt độ lò dùng đèn halogen - Nhận dạng và mô phỏng đối tượng điều khiển trên Matlab. - Thiết kế bộ điều khiển cho hệ lò nhiệt

- Tạo được giao diện người dùng giám sát và điều khiển hệ thống từ máy tính đến vi điều khiển.

- Điều khiển nhiệt độ thực

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

Trong giai đoạn làm đồ án, chúng em đã rất cố gắng nghiên cứu, thiết kế để có được những kết quả đã nêu trên. Tuy nhiên do thời gian và kiến thức của chúng em có hạn, mặt khác một số điều kiện về thiết bị không cho phép nên trong đồ án còn những hạn chế :

- Kết quả thu được vẫn có sai số so với mô hình lý tưởng thiết kế trên Matlab.

- Thuật toán điều khiển chưa được tốt ưu tốt

- Mô hình lò nhiệt của chúng em mới thử nghiệm trong phòng thí nghiệm

Hướng khắc phục các điểm hạn chế

- Kết hợp các bộ điều khiển hiện đại, tối ưu code xử lí thuật toán chương trình.

- Trên cơ sở mô hình trên có thể áp dụng vào cuộc sống như làm hệ thống sưởi, hệ thống sấy hoa quả loại nhỏ v.v...

32

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

- Điều khiển nhiệt độ vật nung, hoặc sấy

- Thiết kế bộ điều khiển thích nghi PID, bộ điều khiển mờ học theo mô hình mẫu , hoặc bộ điều khiển ứng dụng mạng Nơron.

- Mở rộng thêm các đối tượng có thể làm việc được như động cơ, bình mức…

Do kiến thức và thời gian còn nhiều hạn chế nên đồ án này không tránh khỏi những thiếu sót. Chúng em rất mong nhận được những ý kiến đóng góp của các thầy cô để đồ án được hoàn thiện hơn.

Một lần nữa, chúng em xin chân thành cảm ơn Bộ môn điều khiển tự động và thầy Nguyễn Hoài Nam đã hướng dẫn chúng em tận tình trong quá trình thực hiện đồ án này.

33

TÀI LIỆU THAM KHẢO

[1] Võ Minh Chính, Phạm Quốc Hải, Trần Trọng Minh, Điện Tử Công Suất, NXB Khoa Học Và Kỹ Thuật, 2007.

[2] Phạm Quốc Hải, Hướng dẫn thiết kế điện tử công suất, NXB Khoa Học

và Kỹ Thuật, 2009.

[3] Nguyễn Phùng Quang, MATLAB & SIMULINK Dành Cho Kỹ Sư Điều Khiển Tự Động, NXB Khoa Học Và Kỹ Thuật, 2006.

[4] Nguyễn Doãn Phước, Lý thuyết điều khiển tuyến tính, NXB Khoa Học và

Kỹ Thuật, 2002.

[5] Bùi Hải, Trần Thế Sơn, Kỹ thuật nhiệt , NXB Khoa Học Kỹ Thuật, 2006 [6] https://slideplayer.com/slide/1578385/

34

PHỤ LỤC

[1] Linh kiện được sử dụng trong đồ án • Cầu diode KBL410 - Sep electronic • Opto quang 4N35-209Q - Fairchid

• Opto quang xoay chieu MOC3021 - Liteon • Triac BTA137 - NXP

• Tụ hoá 10u-25v • Diode 1N4148

• Trasnistor B331-3904 - StMicroelectric • Cảm biến nhiệt DS18B20 - Maxim • Đèn led

• Arduino Uno R3

• Đèn Halogen 300W- 220V • Tấm Aluminium

[2] Chương trình trên Arduino #include <OneWire.h> #include <DallasTemperature.h> #include <TimerOne.h> #include <SimpleKalmanFilter.h> #define ONE_WIRE_BUS 4 #define Triac_Pin 8 #define led 7

uint8_t index = 0, bytes, x = 0; uint8_t recData[16];

35 typedef union { uint8_t temp[4]; float value; } FloatConver; double Kp, Ki, Kd, k1, k2, k3; float E = 0, E1 = 0, E2 = 0;

double NhietDoDat, lastNhietDoLo, dInput; float T, timePrev, Time;

float anpha, beta, gama, PTerm, integral, ITerm, derivative, DTerm; double Output = 0, LastOutput = 0, outputSum;

int diemkich = 0, SkipCtr; double NhietDoLo, temp;

unsigned long int ZeroXTime[4] = {0, 0, 0, 0}; unsigned long int Steptime;

float C; long tTime;

unsigned long int AC_step = 180;

volatile unsigned long int SteptimeCounter, now, timeChange, lastTime, SampleTime = 200 ;

volatile unsigned long int FireTriac = 0; volatile boolean zero_cross = 0;

byte PowerMap[181] = {

180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154,

36 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; typedef union { float number; int udk; uint8_t bytes[4]; } FLOATUNION_t; FLOATUNION_t myValue; SimpleKalmanFilter bo_loc(0.5, 0.5, 0.001); OneWire oneWire_in(ONE_WIRE_BUS); DallasTemperature sensor_TrongLo(&oneWire_in); void setup() {

37 Serial.begin(115200);

sensor_TrongLo.begin();

pinMode (ONE_WIRE_BUS, INPUT); pinMode(Triac_Pin, OUTPUT);

tTime = millis();

attachInterrupt(0, zero_cross_detect, FALLING); Timer1.initialize(Steptime); measure_half_period(); } void fire_triacs() { if ( FireTriac == SteptimeCounter ) { digitalWrite(Triac_Pin, HIGH); delayMicroseconds(10); digitalWrite(Triac_Pin, LOW); } SteptimeCounter++; } void zero_cross_detect() { zero_cross = 1; SteptimeCounter = 0; digitalWrite(led, HIGH); //Serial.println(micros()); //if (NhietDoDat == 0) //{ //digitalWrite(Triac_Pin, LOW); //} }

38

void measure_half_period() { //tinh thoi buoc nhay trong nưa chu ki zero_cross = 0; byte F = 0; while ( F < 4 ) { if ( zero_cross ) { ZeroXTime[F] = micros(); zero_cross = 0; F++; } }

Steptime = (((ZeroXTime[1] - ZeroXTime[0]) + (ZeroXTime[2] - ZeroXTime[1]) + (ZeroXTime[3] - ZeroXTime[2])) / 3) / AC_step;

Timer1.attachInterrupt(fire_triacs, Steptime); } void sendTemp(void) { Serial.print("T"); Serial.print(";"); Serial.print(NhietDoLo); Serial.print(";"); //Serial.print(NhietDoDat); //Serial.print(";"); //Serial.print(Kp); //Serial.print(";"); //Serial.print(Ki); //Serial.print(";"); //Serial.println(Kd);

39 //Serial.println( millis()); //Serial.println( diemkich); } void serialEvent() { while (Serial.available() > 0) { int inChar = Serial.read();

if (inChar != '\n') { NhietDoDat = Serial.readStringUntil(';').toFloat(); Kp = Serial.readStringUntil(';').toFloat(); Ki = Serial.readStringUntil(';').toFloat(); Kd = Serial.readStringUntil(';').toFloat(); } } } void loop() { digitalWrite(led, LOW); sensor_TrongLo.requestTemperatures(); temp = sensor_TrongLo.getTempCByIndex(0); NhietDoLo = bo_loc.updateEstimate(temp) - 1; now = millis();

40 if (timeChange >= 0.01)

{

dInput = (NhietDoLo - lastNhietDoLo); E = NhietDoDat - NhietDoLo;

outputSum += (Ki * E * timeChange); Output = Kp * E;

if (outputSum > 180 ) outputSum = 180; else if (outputSum < 0) outputSum = 0;

Output += outputSum - Kd * dInput / timeChange; if (Output > 180) Output = 180;

else if (Output < 1) Output = 1; E1 = E;

lastNhietDoLo = NhietDoLo; lastTime = now;

}

diemkich = int (10*Output);

if (diemkich < 1) { diemkich = 1; } else if (diemkich > 165) { diemkich = 165; }

41 if ((NhietDoLo > 119) || (NhietDoDat == 0)) { diemkich = 1; } C = diemkich; FireTriac = PowerMap[diemkich]; if (millis() - tTime > 500) { sendTemp(); tTime = millis(); } } /////////////////////////////////////////////////////////// // gui ve matlab // myValue.number = NhietDoLo; // Serial.write('A');

//for (int i=0; i<4; i++){

// Serial.write(myValue.bytes[i]);

//Serial.print('\n');

//delay(50);

Một phần của tài liệu THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN NHIỆT độ DÙNG đèn HALOGEN (Trang 25 - 41)