ตอนที่ 17: ปัญหาใหญ่ของ D: Derivative Kick และวิธีแก้

1. 🎯 ตอนที่ 17: ปัญหาใหญ่ของ D: Derivative Kick (ระเบิดเวลาของอนุพันธ์) และวิธีแก้
2. 📖 เปิดฉาก (The Hook)
สวัสดีครับน้องๆ และเพื่อนวิศวกรนักพัฒนาทุกท่าน! กลับมาพบกันอีกครั้งในซีรีส์ เจาะลึกวิศวกรรมระบบควบคุม (Control Systems) จาก 101 ถึง Advance กับพี่วิศวกรคนเดิมครับ
ในตอนที่ 10 พี่เคยเปรียบเทียบการทำงานของ Derivative Control (D-Term) ว่าเป็นเหมือน “นักพยากรณ์อนาคต” ที่คอยแตะเบรกล่วงหน้าเมื่อ Process Variable (PV) พุ่งเข้าหาเป้าหมาย (Setpoint) เร็วเกินไป เพื่อลดอาการ Overshoot ซึ่งฟังดูเป็นฟีเจอร์ที่ยอดเยี่ยมมากใช่ไหมครับ?
แต่ในโลกความเป็นจริง D-Term ซ่อน “ระเบิดเวลา” เอาไว้ลูกหนึ่งครับ! ลองจินตนาการว่าน้องกำลังขับรถแบบ Cruise Control อยู่ดีๆ แล้วจู่ๆ ระบบ GPS ก็สั่งเปลี่ยนเป้าหมายกะทันหัน (Setpoint Step Change) จากเดิมที่ต้องวิ่ง 60 km/h ให้กระโดดเป็น 100 km/h ทันที
ในชั่วพริบตานั้น “อัตราการเปลี่ยนแปลงของเป้าหมาย” จะสูงลิบลิ่วเข้าใกล้อนันต์ (Infinity) สมองกล D-Term ของเราจะตกใจสุดขีดและกระทืบคันเร่งด้วยแรงกระชากมหาศาลเพื่อตอบสนองต่อเป้าหมายที่เปลี่ยนไปกะทันหัน! ปรากฏการณ์วาล์วกระแทกหรือมอเตอร์กระตุกอย่างรุนแรงนี้ ในทางวิศวกรรมเราเรียกว่า “Derivative Kick” หรือ “Setpoint Kick” ครับ วันนี้เราจะมาผ่าสมการดูว่าทำไมมันถึงเกิดเหตุการณ์นี้ขึ้น และวิศวกรระดับโปรเขามีวิธีปลดชนวนระเบิดนี้อย่างไร!
3. 🧠 แก่นวิชา (Core Concepts)
Derivative Kick คืออะไร? ในโครงสร้างของ PID Controller แบบมาตรฐาน (Standard form) สมการของโหมดอนุพันธ์จะถูกคำนวณจาก “อัตราการเปลี่ยนแปลงของความผิดพลาด (Rate of change of error)” นั่นคือ:
$$ u_d(t) = K_d \frac{de(t)}{dt} $$
เนื่องจากค่าความผิดพลาด $e(t) = SP(t) - PV(t)$ เมื่อเรานำมาหาอนุพันธ์ (ดิฟเฟอเรนชิเอต) จะได้ว่า:
$$ \frac{de(t)}{dt} = \frac{dSP(t)}{dt} - \frac{dPV(t)}{dt} $$
ปัญหามันอยู่ตรงพจน์แรก $\frac{dSP(t)}{dt}$ นี่แหละครับ! ในโรงงานอุตสาหกรรม ผู้ใช้งานมักจะเปลี่ยนค่า Setpoint (SP) ด้วยการกดปุ่มตั้งค่าใหม่ทันทีทันใด ซึ่งในทางคณิตศาสตร์มันคือการป้อน Step Function และเรารู้กันดีจากวิชาแคลคูลัสว่า การดิฟ Step Function จะทำให้เกิดสัญญาณแบบ Impulse Function (ค่าพุ่งทะยานเป็นอนันต์ในชั่วพริบตา) ผลลัพธ์ก็คือ สัญญาณสั่งงาน $u(t)$ จะเกิดยอดแหลม (Sharp pulse) กระชาก Actuator อย่างรุนแรง ทำให้กลไกฟันเฟืองพัง วาล์วกระแทก หรือวงจรขับมอเตอร์ไหม้ได้เลยครับ!
วิธีแก้ปัญหา: Derivative on Process Variable (PI-D Control) เพื่อป้องกันปัญหานี้ วิศวกรจึงต้องปรับโครงสร้างของ PID เสียใหม่ โดยตั้งคำถามว่า “ทำไมเราต้องไปดิฟ Setpoint ด้วยล่ะ?” ในเมื่อเป้าหมายหลักของ D-Term คือการ “เบรก” ตัวระบบ (PV) ไม่ให้พุ่งชนเป้าหมายเร็วเกินไป
วิธีแก้ที่ฉลาดและเรียบง่ายที่สุดคือ การย้ายการทำงานของอนุพันธ์ไปไว้ที่เส้นทางป้อนกลับ (Feedback Path) หรือที่เรียกว่าการวัดอนุพันธ์จาก Process Variable โดยตรง (Basing derivative action on PV) โครงสร้างแบบนี้บางครั้งเรียกว่า PI-D Control
เมื่อเราตัด $SP(t)$ ออกจากการคำนวณ D-Term สมการจะเหลือเพียง:
$$ u_d(t) = -K_d \frac{dPV(t)}{dt} $$
ความวิเศษของสมการนี้คือ เมื่อเราเปลี่ยน Setpoint กะทันหัน ค่า PV ของระบบฟิสิกส์ในโลกความจริงจะมีมวลและความเฉื่อย (Inertia) มันไม่มีทางกระโดดเปลี่ยนค่าได้ในพริบตา กราฟของ PV จะค่อยๆ โค้งขึ้นอย่างนุ่มนวล ดังนั้นค่า $\frac{dPV(t)}{dt}$ จึงมีค่าที่สมเหตุสมผลเสมอ สัญญาณ Derivative Kick จึงหายไปอย่างสมบูรณ์ครับ!

4. 🧮 ร่ายมนต์สมการและโค้ดควบคุม (The Math & Implementation)
มาดูการแปลงทฤษฎีลงสู่โค้ดภาษา C/C++ สำหรับ Microcontroller กันครับ ในการเขียนโค้ดแบบ Discrete-time เราจะเปลี่ยนจากการหาความชันของ Error มาเป็นการหาความชันของ PV แทน
ข้อสังเกต: ระวังเครื่องหมาย ลบ (-) หน้า $K_d$ ให้ดีนะครับ! เพราะเมื่อระบบพุ่งขึ้น (PV เพิ่มขึ้น, ความชันเป็นบวก) D-Term จะต้องทำหน้าที่ “เบรก” คือต้องให้ค่าเป็นลบเพื่อไปหักล้างกับ P-Term ครับ
// ตัวแปรในระบบ (Global Variables)
float Kp = 2.0, Ki = 0.5, Kd = 0.1;
float integral_sum = 0.0;
float prev_pv = 0.0; // เก็บค่า Process Variable (PV) ของรอบที่แล้ว (ไม่ใช่ prev_error!)
float dt = 0.01; // Sample time (เช่น 10ms)
float PID_Compute_NoKick(float setpoint, float current_pv) {
// 1. คำนวณ Error ปัจจุบัน
float error = setpoint - current_pv;
// 2. P-Term (คำนวณจาก Error ตามปกติ)
// หมายเหตุ: แม้ P-Term จะเจอ Setpoint step change ก็จะเกิดแค่ P-Kick
// ซึ่งขอบเขตถูกจำกัดไว้ที่ Kp * step_size (ไม่พุ่งทะลุฟ้าเหมือน D-Kick)
float P_out = Kp * error;
// 3. I-Term (คำนวณจาก Error ตามปกติ)
integral_sum += (error * dt);
float I_out = Ki * integral_sum;
// 4. D-Term (คำนวณความชันจาก PV แทน Error)
// dpv/dt = (current_pv - prev_pv) / dt
float dpv_dt = (current_pv - prev_pv) / dt;
// ใส่เครื่องหมายลบ (-) เพื่อให้ D-Term ทำหน้าที่เป็นตัวหน่วง (Damper)
float D_out = -Kd * dpv_dt;
// 5. รวมสัญญาณสั่งงาน
float output = P_out + I_out + D_out;
// เก็บค่า PV ปัจจุบันไว้ใช้ในรอบถัดไป
prev_pv = current_pv;
return output;
}(ในทางปฏิบัติ เราควรต้องเพิ่ม Low-pass filter ที่ D-Term ด้วยเพื่อป้องกัน Noise จากเซ็นเซอร์ ตามที่เคยอธิบายไปในตอนก่อนหน้าครับ)
5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
ในฐานะวิศวกรที่ต้องไปปรับจูนหน้างานจริง มีเกร็ดความรู้ที่ควรรู้ไว้ครับ:
- D on PV คือมาตรฐานอุตสาหกรรม: ถ้าเราไปซื้อ Industrial Controller, PLC ยี่ห้อดังๆ หรือระบบ DCS ส่วนใหญ่ในปัจจุบัน อัลกอริทึมของบล็อก PID มาตรฐานมักจะถูกตั้งค่าให้เป็นการวัดอนุพันธ์จาก PV (Derivative on PV) เป็นค่าเริ่มต้น (Default) อยู่แล้วครับ ผู้ใช้งานมักไม่ค่อยรู้ตัวว่าตัวเองกำลังใช้ PI-D Control อยู่!
- ระวัง Proportional Kick: นอกเหนือจาก Derivative Kick แล้ว การเปลี่ยน Setpoint กะทันหันยังทำให้เกิด P-Kick ด้วย แม้แรงกระชากจะไม่รุนแรงเท่า D-Kick แต่ในบางกระบวนการที่บอบบาง (เช่น อบผิวเซรามิก หรือระบบเคมี) การกระชากของ P ก็ยอมรับไม่ได้ วิธีแก้ระดับสูงขึ้นไปอีกคือการใช้เทคนิค Setpoint Weighting (2-DOF PID) หรือการใช้ฟังก์ชัน SP Ramp เพื่อบังคับให้ Setpoint ค่อยๆ ไต่ระดับขึ้นแทนที่จะเปลี่ยนเป็นขั้นบันไดครับ
- เมื่อไหร่ที่ควรคง D ให้อยู่บน Error? ถ้าเป้าหมายหลักของเราคือการทำให้ระบบมี Tracking Performance หรือการตามรอยคำสั่งที่เคลื่อนที่อยู่ตลอดเวลา (เช่น หุ่นยนต์ที่ต้องวาดรูปตามเส้น) การให้ D-Term คำนวณจาก Error จะทำให้ระบบตอบสนองต่อคำสั่งใหม่ได้ไวกว่าการทำ D on PV ครับ แต่แน่นอนว่าคำสั่งนั้นต้องเป็นสัญญาณที่ต่อเนื่องและนุ่มนวล (Continuous trajectory) ไม่ใช่การกระโดดเป็นขั้นบันไดครับ
6. 🏁 บทสรุป (To be continued…)
Derivative Kick คือฝันร้ายที่เกิดจากความพยายามของสมองกลในการรับมือกับความเปลี่ยนแปลงที่ฉับพลันเกินไป (Setpoint Step Change) การย้ายการคำนวณอนุพันธ์จากค่าความผิดพลาด (Error) ไปไว้ที่การวัดพฤติกรรมจริงของระบบ (Process Variable) ช่วยปลดชนวนระเบิดลูกนี้ได้อย่างหมดจด ทำให้ได้โครงสร้างการควบคุมที่นุ่มนวลและเป็นมิตรกับเครื่องจักรจักรกลของเรามากที่สุดครับ
ในตอนต่อไป เราจะเข้าสู่เนื้อหาเกี่ยวกับการนำสมการ PID ลงไปฝังในไมโครคอนโทรลเลอร์อย่างเต็มรูปแบบ ว่าการเปลี่ยนจากโลกของเวลาต่อเนื่อง (Continuous-time) มาเป็นโลกเวลาสุ่ม (Discrete-time) มันมีอะไรที่เราต้องระวังอีกบ้าง รอติดตามกันนะครับ!
ต้องการที่ปรึกษาด้านการออกแบบระบบควบคุม (Control Systems), หุ่นยนต์อัตโนมัติ (Robotics) หรือพัฒนาระบบ Automation ขั้นสูงให้กับโรงงานของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและติดตั้งระบบแบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p