ตอนที่ 19: จากอนาล็อกสู่ดิจิทัล: Digital PID Controller โลกที่ขับเคลื่อนด้วย 0 และ 1

1. 🎯 ตอนที่ 19: จากอนาล็อกสู่ดิจิทัล: Digital PID Controller
2. 📖 เปิดฉาก (The Hook)
สวัสดีครับน้องๆ และเพื่อนวิศวกรนักพัฒนาทุกท่าน! กลับมาลุยกันต่อในซีรีส์ เจาะลึกวิศวกรรมระบบควบคุม (Control Systems) จาก 101 ถึง Advance สไตล์วิศวกรรุ่นพี่ครับ
น้องๆ เคยสงสัยไหมครับว่า ในยุคที่ยังไม่มีคอมพิวเตอร์ วิศวกรรุ่นปู่ของเราสร้าง PID Controller กันได้อย่างไร? ในยุคแรกเริ่ม อุตสาหกรรมใช้ระบบลม (Pneumatic Controllers) ในการควบคุม จากนั้นก็พัฒนามาเป็นการใช้วงจรอิเล็กทรอนิกส์ที่เรียกว่า ออปแอมป์ (Operational Amplifiers หรือ Op-amps) ร่วมกับตัวต้านทาน (Resistor) และตัวเก็บประจุ (Capacitor) เพื่อสร้างสมการบวก ลบ อินทิเกรต และดิฟเฟอเรนชิเอต
ลองนึกภาพตามนะครับ ถ้าเครื่องจักรของน้องเกิดอาการแกว่ง (Hunting) แล้วน้องต้องการปรับลดอัตราขยาย $K_p$ น้องจะต้องเดินไปเอาหัวแร้งบัดกรีเพื่อเปลี่ยนค่าตัวต้านทาน (R) บนแผงวงจร! แถมเมื่อเวลาผ่านไป อุปกรณ์อนาล็อกเหล่านี้ยังมีการเสื่อมสภาพ (Aging) และค่าความคลาดเคลื่อนตามอุณหภูมิ (Thermal Drift) ทำให้ระบบที่เคยจูนไว้อย่างดีเกิดเพี้ยนไปหมด
แต่แล้วโลกก็เปลี่ยนไปเมื่อไมโครโปรเซสเซอร์ (Microprocessor) ถือกำเนิดขึ้น การมาถึงของ Digital Control Systems ทำให้เราสามารถเนรมิตสมการคณิตศาสตร์ที่ซับซ้อนได้ด้วยการ “พิมพ์โค้ด” (Software) แทนการต่อสายไฟ และนี่คือจุดเริ่มต้นของการย้ายโลกจากโดเมนเวลาต่อเนื่อง (Continuous-time) เข้าสู่โลกแห่งเวลาสุ่ม (Discrete-time) วันนี้พี่จะพาไปเจาะลึกเบื้องหลังการทำงานของ Digital PID Controller และด่านหฤโหดที่เรียกว่า ADC/DAC กันครับ!
3. 🧠 แก่นวิชา (Core Concepts)
การเปลี่ยนจาก Analog Controller มาเป็น Digital (Discrete) Controller เปลี่ยนสถาปัตยกรรมของระบบไปอย่างสิ้นเชิงครับ สมองกลของเรา (เช่น ไมโครคอนโทรลเลอร์ STM32) ไม่สามารถรับรู้และสั่งงานโลกแห่งความเป็นจริงที่เป็นสัญญาณต่อเนื่องได้โดยตรง มันจึงต้องมี “ล่าม” คอยแปลภาษา ซึ่งประกอบด้วยองค์ประกอบหลักๆ ดังนี้ครับ:
- 1. ADC (Analog-to-Digital Converter) - “ดวงตาแห่งการสุ่มมอง”: โลกภายนอก (Plant) ทำงานแบบเวลาต่อเนื่อง (Continuous-time, $t$) แต่สมองกลเข้าใจแค่ตัวเลข 0 กับ 1 ADC จะทำหน้าที่ “สุ่ม (Sampling)” สัญญาณวัดจากเซ็นเซอร์ (Sensor) ตามคาบเวลาที่กำหนดไว้เป๊ะๆ เรียกว่า Sampling Time ($T_s$) ทำให้สมองกลเห็นข้อมูลเป็นเพียงลำดับของตัวเลข (Sequence of numbers) $y(k)$ ไม่ใช่เส้นกราฟที่ต่อเนื่อง (เปรียบเหมือนการหลับตาขับรถ แล้วลืมตาแอบดูถนนแค่ทุกๆ 0.1 วินาที)
- 2. Digital Controller - “สมองกลผู้คำนวณ”: เมื่อได้รับค่า Error $e(k)$ ในรูปของตัวเลข (Digital code) ไมโครคอนโทรลเลอร์จะรันอัลกอริทึมสมการผลต่าง (Difference Equation) เพื่อคำนวณหาสัญญาณควบคุม $u(k)$ ภายในเวลาเสี้ยววินาที
- 3. DAC (Digital-to-Analog Converter) และ ZOH (Zero-Order Hold) - “กล้ามเนื้อผู้แปรสภาพ”: เมื่อสมองคำนวณค่าสั่งงาน $u(k)$ เสร็จ มันจะถูกส่งไปที่ DAC เพื่อแปลงกลับเป็นแรงดันไฟฟ้าอนาล็อก และเนื่องจากสมองกลจะสั่งงานรอบต่อไปในอีก $T_s$ วินาทีข้างหน้า วงจร Zero-Order Hold (ZOH) จะทำหน้าที่ “แช่ (Hold)” แรงดันค่านั้นไว้ให้คงที่จนกว่าจะถึงรอบคำนวณถัดไป ทำให้สัญญาณที่ส่งไปขับ Actuator มีลักษณะเป็น “ขั้นบันได (Staircase waveform)”
ข้อดีระดับเทพของ Digital Control:
- ความยืดหยุ่น (Flexibility): อยากเปลี่ยนพารามิเตอร์ PID หรือเพิ่มลอจิก Anti-windup? แค่แก้บรรทัดโค้ดแล้วแฟลชโปรแกรมใหม่ ไม่ต้องรื้อแผงวงจร
- ไม่มีความเสื่อมสภาพ (No Drift): ตัวเลขในซอฟต์แวร์ไม่มีวันเสื่อมสภาพตามกาลเวลาหรืออุณหภูมิเหมือนตัวเก็บประจุ (Capacitor) ในวงจรอนาล็อก
- พลังประมวลผลสูง: สามารถทำ Multi-loop control (ควบคุมมอเตอร์หลายแกนพร้อมกัน) หรือใช้อัลกอริทึมขั้นสูง (เช่น Adaptive Control, State-Space) ในชิปเพียงตัวเดียว

4. 🧮 ร่ายมนต์สมการและโค้ดควบคุม (The Math & Implementation)
ในโลกของอนาล็อก (Continuous-time) สมการ PID มาตรฐานคือ: $$ u(t) = K_p e(t) + K_i \int_{0}^{t} e(\tau) d\tau + K_d \frac{de(t)}{dt} $$
แต่ในโลกของดิจิทัล ไมโครคอนโทรลเลอร์ไม่รู้จักการทำ Integration หรือ Differentiation (แคลคูลัส) มันรู้จักแต่การบวก ลบ คูณ หาร (พีชคณิต) เราจึงต้องใช้ระเบียบวิธีเชิงตัวเลข (Numerical Methods) มาแปลงร่างสมการครับ:
- เปลี่ยน Integral เป็น Summation (การบวกสะสม): ใช้ระเบียบวิธีสี่เหลี่ยมผืนผ้า (Rectangular Approximation หรือ Euler) $$ \int e(t) dt \approx T_s \sum_{i=1}^{k} e(i) $$
- เปลี่ยน Derivative เป็น Difference (การหาผลต่าง): ใช้ระเบียบวิธีผลต่างย้อนหลัง (Backward Difference) $$ \frac{de(t)}{dt} \approx \frac{e(k) - e(k-1)}{T_s} $$
เมื่อนำมารวมกัน จะได้ Discrete PID Equation (Position Form) ดังนี้: $$ u(k) = K_p e(k) + K_i T_s \sum_{i=1}^{k} e(i) + K_d \frac{e(k) - e(k-1)}{T_s} $$ (โดย $k$ คือรอบเวลาปัจจุบัน, $k-1$ คือรอบเวลาที่แล้ว, และ $T_s$ คือ Sampling time)
ตัวอย่างโค้ดภาษา C (Discrete PID Algorithm) ที่วิศวกรใช้ในไมโครคอนโทรลเลอร์:
// ตัวแปรโกลบอล (เก็บสถานะในอดีต)
float integral_sum = 0.0;
float prev_error = 0.0;
// ฟังก์ชันนี้ต้องถูกเรียกใช้งานใน Timer Interrupt อย่างสม่ำเสมอ (เช่น ทุกๆ Ts = 0.01 วินาที)
float Digital_PID_Update(float setpoint, float current_pv, float Kp, float Ki, float Kd, float Ts) {
// 1. อ่านค่าและคำนวณ Error ปัจจุบัน (e(k))
float error = setpoint - current_pv;
// 2. Proportional Term (P)
float P_out = Kp * error;
// 3. Integral Term (I) - การบวกสะสมพื้นที่สี่เหลี่ยม
integral_sum += (error * Ts);
float I_out = Ki * integral_sum;
// 4. Derivative Term (D) - การหาความชันย้อนหลัง
float derivative = (error - prev_error) / Ts;
float D_out = Kd * derivative;
// บันทึก Error ปัจจุบันให้กลายเป็นอดีต เพื่อใช้ในรอบถัดไป (e(k-1))
prev_error = error;
// 5. นำ 3 โหมดมารวมกัน
float total_output = P_out + I_out + D_out;
return total_output;
}5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
ถึงแม้โค้ดบรรทัดสั้นๆ จะดูสวยงามและไร้ที่ติ แต่วิศวกรระบบควบคุมต้องพึงระวัง “ข้อจำกัดของฮาร์ดแวร์” เสมอครับ!
- Resolution และ Quantization Error: ADC มักมีความละเอียดจำกัด (เช่น 12-bit จะมี $2^{12} = 4096$ ระดับ) หมายความว่าค่าที่คอมพิวเตอร์มองเห็น ไม่ใช่กราฟที่เนียนเรียบ แต่ถูก “ปัดเศษ” ให้เข้ากับขั้นบันไดดิจิทัล (Quantization) หากเซ็นเซอร์น้องมีความละเอียดไม่พอ สัญญาณรบกวนจากการปัดเศษนี้จะถูกขยายอย่างบ้าคลั่งโดยโหมด Derivative (D-Term) จนทำให้มอเตอร์สั่นกระตุกได้!
- พิษสงของ Zero-Order Hold (ZOH) และ Delay: การที่ DAC แช่สัญญาณสั่งงานไว้เป็นทรงขั้นบันได (Hold) ถือเป็นการ “หน่วงเวลา (Time Delay)” ในเชิงกายภาพครับ โดยเฉลี่ยแล้ว ZOH จะสร้างความหน่วงเวลาเท่ากับ $T_s / 2$ วินาที ซึ่งในโดเมนความถี่ ความหน่วงเวลานี้จะไปกัดกิน Phase Margin (ค่าเผื่อเสถียรภาพเฟส) ของระบบ หากน้องเลือก $T_s$ ที่กว้างเกินไป (Sampling ช้าไป) ระบบป้อนกลับที่เคยเสถียรในกระดาษ อาจแกว่งรุนแรงและสูญเสียเสถียรภาพ (Instability) ในโลกความจริงทันที!
- ความเป๊ะของเวลา (Real-time Execution):
อัลกอริทึมตัวนี้ตั้งอยู่บนสมมติฐานว่าตัวแปร $T_s$ มีค่าคงที่ ดังนั้น โค้ด PID ห้าม ไปอยู่ในวงวน
while(1)ของฟังก์ชันmain()ที่มีเวลาทำงานไม่แน่นอนเด็ดขาด แต่จะต้องนำไปใส่ใน Timer Interrupt Service Routine (ISR) เพื่อรับประกันว่าสมองกลจะสุ่มข้อมูลเป๊ะทุกเสี้ยววินาที!
6. 🏁 บทสรุป (To be continued…)
การอพยพจากโลกของอนาล็อก (Op-amps) เข้าสู่โลกดิจิทัล (Microcontrollers) ถือเป็นการก้าวกระโดดที่ปลดล็อกจินตนาการของวิศวกรระบบควบคุม Digital PID Controller มอบความแม่นยำและความยืดหยุ่นที่ไร้ขีดจำกัด แต่ก็แลกมากับข้อควรระวังเรื่อง ความถี่ในการสุ่ม (Sampling rate), ขีดจำกัดความละเอียดของ ADC/DAC, และการคำนวณเชิงตัวเลข
ตอนนี้เครื่องมือของเราพร้อมแล้ว โค้ดของเราพร้อมแล้ว! คำถามที่สำคัญที่สุดที่ทุกคนรอคอยก็คือ… “แล้วเราจะรู้ได้อย่างไรว่าต้องตั้งค่า $K_p, K_i, K_d$ เป็นตัวเลขเท่าไหร่ เครื่องจักรถึงจะวิ่งเนียนกริบ?” ในตอนต่อไป เราจะมาเปิดตำราคลาสสิกระดับตำนานอย่าง วิธีการจูนแบบ Ziegler-Nichols กันครับ รอติดตามกันได้เลย!
ต้องการที่ปรึกษาด้านการออกแบบระบบควบคุม (Control Systems), หุ่นยนต์อัตโนมัติ (Robotics) หรือพัฒนาระบบ Automation ขั้นสูงให้กับโรงงานของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและติดตั้งระบบแบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p