Temperature controller
• เป้ าหมาย
– ควบคุมอุณหภูมิด้วยคาสั่งจากคอมพิวเตอร์
– ขับกระแสให้กับขดลวดความร้อนผ่าน AC relay
DS18b20 (~150oC)
Thermocouple (~750oC)
Relay module
• บอร์ด ETT-OPTO RELAY4 เป็นรีเลย์ AC จานวน 4 ช่อง
http://www.ett.co.th/download2.html
ETT OPTO-RELAY4
• ต่อ relay เพื่อเป็นสวิตช์
ขาแบบ normally open
DS18B20 sensor
• เซ็นเซอร์แบบ 1-wire สาหรับวัดอุณหภูมิ
http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
• การใช้ Arduino วัดอุณหภูมิด้วย DS18B20
http://playground.arduino.cc/Learning/OneWire
http://www.pjrc.com/teensy/td_libs_OneWire.html
Thermocouple shield
• เทอร์โมคัปเปิลใช้ปรากฏการณ์ Seebeck แปลงความสัมพันธ์
อุณหภูมิเป็นแรงดันไฟฟ้ า (ย่าน mV)
– ต้องทาการชดเชยจุดเยือกแข็ง (offset) และขยายสัญญาณ (amplify)
• ใช้ thermocouple shield เพื่อวัดแรงดัน
https://oceancontrols.com.au/KTA-259.html
Procedure
• ต่อบอร์ด Arduino กับเซ็นเซอร์วัดอุณหภูมิ
– เขียนโค้ดเพื่อวัดอุณหภูมิและแสดงผลทาง serial monitor
– เปิดหม้อหุงข้าว/เตาอบ แล้ววัดอุณหภูมิทุก 1 วินาที
– นาค่าไปพล็อตกราฟ แล้วหาค่าความชันของอุณหภูมิสูงสุด (Smax)
– หาค่าอุณหภูมิสูงสุด (Tmax)
• ต่อบอร์ด Arduino กับบอร์ดรีเลย์และเซ็นเซอร์วัดอุณหภูมิ
– คานวณช่วงความละเอียด T = Tmax / 100
– หาคาบเวลาในการควบคุม = 0.1 * T/Smax
(หากน้อยกว่า 1 วินาที ให้เท่ากับ 1 วินาที)
– ทดสอบการปิด/เปิดแบบ pulse-width modulation
#define STEP (X)
const int onPeriod = Y;
const int offPeriod = Z;
void setup() {
initTempSensor();
initRelayBoard();
Serial.begin(9600);
}
void loop() {
float temp = readTempSensor();
Serial.print("Temp: "); Serial.println(temp);
delay(X*Y);
onRelay();
delay(X*Z);
offRelay();
}
โค้ดตัวอย่างสาหรับทดลองรีเลย์
มาจากผลทดลอง หน่วย msec
เทคนิค burst firing
• การควบคุมแบบ PWM จะไม่เหมาะกับ AC เนื่องจากวงจร triac
มักใช้หลักการ zero-crossing เพื่อลดสัญญาณรบกวน
– ใช้เทคนิค burst firing เปิดให้ AC
power หลายลูกคลื่นผ่านไปยังโหลด
– ค่า cycle time ขึ้นอยู่กับความจุของ
โหลด โดยไม่ควรน้อยกว่าค่าที่ทาให้แกว่ง
const int relayPin = X;
const int onPeriod[] = {0,1,1,2,2,3,6,7,8,9,10};
const int offPeriod[] = {5,9,5,4,5,3,4,3,2,1,0};
void heaterOn(int duty_cycle) {
if (duty_cycle > 0) {
idx = duty_cycle/10; // lookup table step 10%
if (onPeriod[idx] > 0) {
digitalWrite(relayPin, HIGH);
delay(onPeriod[idx]*1000);
}
if (offPeriod[idx] > 0) {
digitalWrite(relayPin, LOW);
delay(offPeriod[idx]*1000);
}
} else {
delay(10000);
}
}
PID controller
• หลักการควบคุม = สร้างสัญญาณควบคุมจากการคานวณ
error = setpoint - feedback
• setpoint อ่านค่าจาก potentiometer
• Feedback อ่านค่าจากเซ็นเซอร์
#define MAX_TEMP (X.Y)
const float Kp = 1.0;
const float Ki = 0.0;
const float Kd = 0.0;
float sumErr = 0.0;
float lastTemp = 0.0;
setpoint = (analogRead(0)/5.0) * 100;
temp = readTempSensor()/MAX_TEMP * 100;
float pidCtrl(float setpoint, float temp) {
float error, ctrl, tempChange;
error = setpoint – temp;
sumErr += error;
tempChange = speed – lastTemp;
ctrl = Kp*error + Ki*sumErr + Kd*tempChange;
lastTemp = temp;
return ctrl;
}
โค้ดตัวอย่างสาหรับตัวควบคุม PID
มาจากผลทดลอง
ต่อ pot กับขา A0
const int PERIOD (X);
int ratioPWM(float ctrl) {
int onPeriod = (PERIOD*STEP) * (ctrl/100);
if (onPeriod > 0) {
onRelay();
delay(onPeriod);
offRelay();
delay(PERIOD*STEP - onPeriod);
} else {
offRelay();
delay(PERIOD*STEP);
}
}
โค้ดตัวอย่างสาหรับตัวควบคุม PID
ค่าทดลอง
Results
• เอกสารสรุปงาน (ประมาณ 3-4 หน้า ส่งพร้อมสาธิต)
– กราฟแสดงการเปลี่ยนแปลงอุณหภูมิเมื่อจ่ายไฟโดยตรงตรง
– กราฟแสดงการเปลี่ยนแปลงอุณหภูมิเมื่อจ่ายไฟแบบ PWM ผ่านรีเลย์ โดย
เป็นผลการทดลองแบบปรับค่า ON/OFF ต่างๆกัน
– ผลการควบคุมอุณหภูมิด้วยหลักการ PID โดยใช้ค่า PERIOD = 10,
15, 20, 25
– โค้ดสมบูรณ์สาหรับการควบคุมอุณหภูมิตั้งค่าด้วย potentiometer
• การให้คะแนนพิจารณาความเรียบร้อยของชิ้นงานด้วย
– เน้นความปลอดภัยลาดับแรก ตรงส่วนที่เป็น 220Vrms ต้องมีการป้ องกัน

ตัวควบคุมอุณหภูมิ

  • 1.
    Temperature controller • เป้าหมาย – ควบคุมอุณหภูมิด้วยคาสั่งจากคอมพิวเตอร์ – ขับกระแสให้กับขดลวดความร้อนผ่าน AC relay DS18b20 (~150oC) Thermocouple (~750oC)
  • 2.
    Relay module • บอร์ดETT-OPTO RELAY4 เป็นรีเลย์ AC จานวน 4 ช่อง http://www.ett.co.th/download2.html
  • 3.
    ETT OPTO-RELAY4 • ต่อrelay เพื่อเป็นสวิตช์ ขาแบบ normally open
  • 4.
    DS18B20 sensor • เซ็นเซอร์แบบ1-wire สาหรับวัดอุณหภูมิ http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf • การใช้ Arduino วัดอุณหภูมิด้วย DS18B20 http://playground.arduino.cc/Learning/OneWire http://www.pjrc.com/teensy/td_libs_OneWire.html
  • 5.
    Thermocouple shield • เทอร์โมคัปเปิลใช้ปรากฏการณ์Seebeck แปลงความสัมพันธ์ อุณหภูมิเป็นแรงดันไฟฟ้ า (ย่าน mV) – ต้องทาการชดเชยจุดเยือกแข็ง (offset) และขยายสัญญาณ (amplify) • ใช้ thermocouple shield เพื่อวัดแรงดัน https://oceancontrols.com.au/KTA-259.html
  • 6.
    Procedure • ต่อบอร์ด Arduinoกับเซ็นเซอร์วัดอุณหภูมิ – เขียนโค้ดเพื่อวัดอุณหภูมิและแสดงผลทาง serial monitor – เปิดหม้อหุงข้าว/เตาอบ แล้ววัดอุณหภูมิทุก 1 วินาที – นาค่าไปพล็อตกราฟ แล้วหาค่าความชันของอุณหภูมิสูงสุด (Smax) – หาค่าอุณหภูมิสูงสุด (Tmax) • ต่อบอร์ด Arduino กับบอร์ดรีเลย์และเซ็นเซอร์วัดอุณหภูมิ – คานวณช่วงความละเอียด T = Tmax / 100 – หาคาบเวลาในการควบคุม = 0.1 * T/Smax (หากน้อยกว่า 1 วินาที ให้เท่ากับ 1 วินาที) – ทดสอบการปิด/เปิดแบบ pulse-width modulation
  • 7.
    #define STEP (X) constint onPeriod = Y; const int offPeriod = Z; void setup() { initTempSensor(); initRelayBoard(); Serial.begin(9600); } void loop() { float temp = readTempSensor(); Serial.print("Temp: "); Serial.println(temp); delay(X*Y); onRelay(); delay(X*Z); offRelay(); } โค้ดตัวอย่างสาหรับทดลองรีเลย์ มาจากผลทดลอง หน่วย msec
  • 8.
    เทคนิค burst firing •การควบคุมแบบ PWM จะไม่เหมาะกับ AC เนื่องจากวงจร triac มักใช้หลักการ zero-crossing เพื่อลดสัญญาณรบกวน – ใช้เทคนิค burst firing เปิดให้ AC power หลายลูกคลื่นผ่านไปยังโหลด – ค่า cycle time ขึ้นอยู่กับความจุของ โหลด โดยไม่ควรน้อยกว่าค่าที่ทาให้แกว่ง
  • 9.
    const int relayPin= X; const int onPeriod[] = {0,1,1,2,2,3,6,7,8,9,10}; const int offPeriod[] = {5,9,5,4,5,3,4,3,2,1,0}; void heaterOn(int duty_cycle) { if (duty_cycle > 0) { idx = duty_cycle/10; // lookup table step 10% if (onPeriod[idx] > 0) { digitalWrite(relayPin, HIGH); delay(onPeriod[idx]*1000); } if (offPeriod[idx] > 0) { digitalWrite(relayPin, LOW); delay(offPeriod[idx]*1000); } } else { delay(10000); } }
  • 10.
    PID controller • หลักการควบคุม= สร้างสัญญาณควบคุมจากการคานวณ error = setpoint - feedback • setpoint อ่านค่าจาก potentiometer • Feedback อ่านค่าจากเซ็นเซอร์
  • 11.
    #define MAX_TEMP (X.Y) constfloat Kp = 1.0; const float Ki = 0.0; const float Kd = 0.0; float sumErr = 0.0; float lastTemp = 0.0; setpoint = (analogRead(0)/5.0) * 100; temp = readTempSensor()/MAX_TEMP * 100; float pidCtrl(float setpoint, float temp) { float error, ctrl, tempChange; error = setpoint – temp; sumErr += error; tempChange = speed – lastTemp; ctrl = Kp*error + Ki*sumErr + Kd*tempChange; lastTemp = temp; return ctrl; } โค้ดตัวอย่างสาหรับตัวควบคุม PID มาจากผลทดลอง ต่อ pot กับขา A0
  • 12.
    const int PERIOD(X); int ratioPWM(float ctrl) { int onPeriod = (PERIOD*STEP) * (ctrl/100); if (onPeriod > 0) { onRelay(); delay(onPeriod); offRelay(); delay(PERIOD*STEP - onPeriod); } else { offRelay(); delay(PERIOD*STEP); } } โค้ดตัวอย่างสาหรับตัวควบคุม PID ค่าทดลอง
  • 13.
    Results • เอกสารสรุปงาน (ประมาณ3-4 หน้า ส่งพร้อมสาธิต) – กราฟแสดงการเปลี่ยนแปลงอุณหภูมิเมื่อจ่ายไฟโดยตรงตรง – กราฟแสดงการเปลี่ยนแปลงอุณหภูมิเมื่อจ่ายไฟแบบ PWM ผ่านรีเลย์ โดย เป็นผลการทดลองแบบปรับค่า ON/OFF ต่างๆกัน – ผลการควบคุมอุณหภูมิด้วยหลักการ PID โดยใช้ค่า PERIOD = 10, 15, 20, 25 – โค้ดสมบูรณ์สาหรับการควบคุมอุณหภูมิตั้งค่าด้วย potentiometer • การให้คะแนนพิจารณาความเรียบร้อยของชิ้นงานด้วย – เน้นความปลอดภัยลาดับแรก ตรงส่วนที่เป็น 220Vrms ต้องมีการป้ องกัน