Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
โครงงานนี้เป็นการเรียนรู้เบื้องต้นและเป็นการทดลองแบบง่าย สำหรับควบคุมความเร็วมอเตอร์กระแสตรงให้กับพัดลมขนาดเล็กด้วยวิธีการ PID Adaptive Tuning โดยใช้ตัวอย่างโปรแกรมจากไลบารี่ PID_V1.h มาทดลองการทำงาน (โปรแกรมสามารถดาวน์โหลดมาใช้งานได้ฟรี) ทั้งนี้เพื่อเป็นการศึกษาและทำความเข้าใจลักษณะการควบคุมแบบ PID Adaptive Control ซึ่งเป็นลักษณะของการควบคุมระบบปิด (Closed loop control) อีกรูปแบบหนึ่ง โดยในการทดลองจะใช้บอร์ดประมวลผล Arduino UNO ในการควบคุมการทำงานให้กับโครงงานนี้ครับ
สำหรับในรูปที่ 1 ถึงรูปที่ 3 เป็นการเตรียมอุปกรณ์ต่างๆ สำหรับทดลองโครงงาน ซึ่งตัวพัดลม (รูปที่ 2) สามารถหาซื้อได้ทั่วไปที่บ้านหม้อหรือร้านค้าออนไลน์ และในรูปที่ 3 เป็นลักษณะการต่อวงจรโดยจะประกอบด้วยวงจรบักคอนเวอร์เตอร์ (Buck converter) วงจรปรับขนาดสัญญาณ (Signal condition) ระหว่างไมโครคอนโทรลเลอร์และวงจรบักคอนเวอร์เตอร์ และวงจรแบ่งค่าแรงดันที่เอาต์พุต (Voltage Divider) สำหรับเป็นสัญญาณป้อนกลับ (Feedback signal)
/* Cradit code PID Adaptive Tuning Example Form Library PID_v1.h MCU : Arduino UNO DC Power supply : 12V/2A Fan : DC12V/0.55A, Model : AD0812XB-A73GL Dev by : www.electronicsDNA.com */ #include <PID_v1.h> #define PIN_INPUT 0 #define PIN_OUTPUT 3 int sampleRate = 10; //Define Variables we'll be connecting to double Setpoint, Input, Output; //Define the aggressive and conservative Tuning Parameters double aggKp=4, aggKi=2, aggKd=0.001; double consKp=2, consKi=5, consKd=0.001; //Specify the links and initial tuning parameters PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT); void setup() { //initialize the variables we're linked to Input = analogRead(PIN_INPUT); Setpoint = 500; // SP Test = 300, 500, 700 pinMode(13, OUTPUT); digitalWrite(13, LOW); delay(3000); //turn the PID on myPID.SetMode(AUTOMATIC); } void loop() { Input = analogRead(PIN_INPUT); double gap = abs(Setpoint-Input); //distance away from setpoint if (gap < 50) { //we're close to setpoint, use conservative tuning parameters myPID.SetTunings(consKp, consKi, consKd); digitalWrite(13, HIGH); } else { //we're far from setpoint, use aggressive tuning parameters myPID.SetTunings(aggKp, aggKi, aggKd); digitalWrite(13, LOW); } myPID.Compute(); analogWrite(PIN_OUTPUT,Output); }
โปรแกรมการทดลองที่แสดงข้างบนนี้ เป็นตัวอย่างหนึ่งที่อยู่ในไฟล์ไลบารี่ PID_V1.h ซึ่งเป็นการควบคุมในลักษณะ PID Adaptive Tuning โดยในส่วนของคำสั่ง if (gap < 50) นี้จะทำหน้าที่กำหนดช่วงระยะค่า ความผิดพลาด (Error) แบบค่าสัมบูรณ์ (Absolute value) เป็นอีก 1 ช่วงเมื่อเทียบกับการควบคุมแบบ PID Control ทั่วไป คือ ในกรณี เมื่อความผิดพลาดมากกว่า 50 จะใช้ค่าคงที่ในการควบคุมระบบ (Kp,Ki และ Kd) เท่ากับ aggKp=4, aggKi=2, aggKd=0.001; ซึ่งจะช่วยให้ระบบเข้าสู่ค่าที่กำหนดได้เร็วขึ้น โดยในช่วงเวลานี้แอลอีดีที่ขา D13 จะดับอยู่ จากนั้นเมื่อค่าวามผิดพลาดน้อยกว่า 50 ก็จะทำให้รูปแบบของการควบคุมคงที่มากขึ้นด้วยการกำหนดค่า consKp=2, consKi=5, consKd=0.001; และแอลอีดีจะติดเพื่อให้ทราบการปรับค่าตัวแปรในการควบคุมใหม่นั้นเอง ทั้งนี้ความเหมาะสมของการทำงานระบบนั้นๆ ผู้ใช้จะต้องศึกษาและปรับแต่งตามกระบวนการในระบบที่มีอยู่ครับ
สำหรับในรูปที่ 4 ถึงรูปที่ 6 เป็นการทดลองที่ 1 ด้วยการกำหนดค่า Setpoint : SP เท่ากับ 300 และให้วงจรทำงานจากนั้นทดลองวัดสัญญาณเอาต์พุตที่ขา D3 ในรูปที่ 5 ที่ช่องวัดสัญญาณที่ 1 (CH1) เพื่อสังเกตการทำงาน ในส่วนช่องวัดสัญญาณที่ 2 (CH2) จะเป็นสัญญาณป้อนกลับ (Feedback signal) ซึ่งจะเป็นสัดส่วนกับความเร็วรอบของพัดลมและแรงดันที่จ่ายให้กับพัดลม
ในรูปที่ 7 ถึงรูปที่ 9 เป็นการทดลองที่ 2 ด้วยการกำหนดค่า Setpoint เท่ากับ 500 และวัดสัญญาณเอาต์พุตที่ขา D3 ในรูปที่ 8 (CH1 มีความถี่เพิ่มขึ้น) และที่ช่องวัดสัญญาณที่ 2 (CH2) จะเป็นสัญญาณป้อนกลับ ซึ่งจะมีค่าแรงดันเพิ่มขึ้นมาที่ 2.45V เช่นกันปริมาณกระแสที่จ่ายให้กับพัดลมเพิ่มขึ้นมาที่ประมาณ 300mA แสดงในรูปที่ 9
ในการทดลองสุดท้ายรูปที่ 10 ถึงรูปที่ 12 การทดลองที่ 3 กำหนดค่า Setpoint เท่ากับ 700 และวัดสัญญาณเอาต์พุตที่ขา D3 ในรูปที่ 11 (CH1 มีความถี่เพิ่มขึ้น) และสัญญาณช่องที่ 2 (CH2) เป็นสัญญาณป้อนกลับ ซึ่งจะมีค่าแรงดันเพิ่มขึ้นมาที่ 3.45V และปริมาณกระแสที่จ่ายให้กับพัดลมประมาณ 400mA แสดงในรูปที่ 12
ในรูปที่ 13 เป็นวงจรที่ออกแบบและใช้ในการทดลองโครงงาน ซึ่งส่วนที่สำคัญคือบอร์ดควบคุมไมโครคอนโทรลเลอร์ Arduino UNO โดยตัวบอร์ดจะทำหน้าที่รับสัญญาณป้อนกลับ (Vmotor) เข้าที่ขา A0 ผ่านวงจรแบ่งแรงดัน (R5 และ R6) จากนั้นจะส่งสัญญาณขับพัดลมแบบพัลซ์วิดมอดูเลตชั่น (PWM Signal) ที่ขา D3 โดยจะส่งให้ทรานซิสเตอร์ Q2 ทำหน้าที่ปรับระดับสัญาณให้กับเพาเวอร์ทรานซิสเตอร์ Q4 ได้เหมาะสม (Driver) ทั้งนี้สัญญาณที่ได้จาก Q4 จะส่งไปยังวงจรกรองความถี่ต่ำผ่าน (Low pass filter) ที่ตำแหน่ง L1 และ C2 เพื่อจ่ายกำลังไฟฟ้าให้กับพัดลมนั้นเอง
สำหรับการทดลองโครงงานนี้จะสังเกตผลการควบคุมแบบ PID Adaptive Tuning ได้ไม่มากนัก ทั้งนี้เนื่องจากตัวพัดลมจะมีเพียงการปรับความเร็วให้เข้าสู่ค่าที่กำหนด (Setpoint) โดยที่ไม่มีโหลดมากนักและใช้การแสดงผลของแอลอีดี (D13) เพื่อให้เห็นการเปลี่ยนตัวแปรของการควบคุมใหม่ แต่ในกรณีที่เราต้องการนำวิธีการควบคุมลักษณะนี้ไปใช้กับระบบที่มีโหลดเพิ่มมากขึ้นจะช่วยให้เห็นความแตกได้ชัดเจน ในส่วนหนึ่งแอดมินได้นำอุปกรณ์ต่างๆ ที่พอจะมีมาทำการออกแบบและทดลองโครงงาน เพื่อให้เป็นแนวความคิดเบื้องต้นให้กับท่านผู้อ่านก่อนครับ.
Reference
- https://en.wikipedia.org/wiki/Adaptive_control
- http://image.sciencenet.cn/olddata/kexue.com.cn/upload/blog/file/2009/9/2009930810151118.).pdf
- https://mdh.diva-portal.org/smash/get/diva2:1107041/FULLTEXT01.pdf
- https://www.youtube.com/watch?v=muaG2VETgHU
- https://www.academia.edu/3551433/PID_and_Adaptive_Predictive_Fuzzy_Logic_Controller_for_a_micro_satellite