รูปปกบทความ

1. 🎯 ตอนที่ 18: การรับมือกับสัญญาณรบกวน (Noise) ในระบบ PID: ใส่แว่นกรองฝุ่นให้ตาทิพย์

2. 📖 เปิดฉาก (The Hook)

สวัสดีครับน้องๆ และนักพัฒนาทุกท่าน! กลับมาลุยกันต่อในซีรีส์ เจาะลึกวิศวกรรมระบบควบคุม (Control Systems) จาก 101 ถึง Advance สไตล์วิศวกรรุ่นพี่ครับ

ในตอนที่ 10 พี่เคยเปรียบเทียบว่าโหมด Derivative (D-Term) เป็นเหมือน “ตาทิพย์พยากรณ์อนาคต” ที่คอยแตะเบรกล่วงหน้าเพื่อกันไม่ให้ระบบพุ่งทะลุเป้าหมาย (Overshoot) ฟังดูเท่และมีประโยชน์มากใช่ไหมครับ? แต่ในโลกแห่งความเป็นจริง มีภัยเงียบที่ซ่อนตัวอยู่ นั่นคือ สัญญาณรบกวน (Measurement Noise) ครับ

ลองจินตนาการว่าน้องกำลังขับรถ แล้วมีฝุ่นควันปลิวเข้าตา หรือกระจกหน้ารถสั่นรัวๆ อยู่ตลอดเวลา แม้น้องจะพยายามมองไปข้างหน้าเพื่อเหยียบเบรก แต่ภาพที่สั่นรัวนั้นจะทำให้สมองสั่งงานสับสน จนน้องอาจจะเผลอกระทืบเบรกสลับกับคันเร่งอย่างบ้าคลั่ง! ในระบบควบคุมก็เช่นกันครับ สัญญาณรบกวนความถี่สูง (High-frequency noise) จากเซ็นเซอร์ ไม่ว่าจะเป็นสัญญาณกวนทางไฟฟ้า หรือคลื่นน้ำที่กระเพื่อมในถังวัดระดับน้ำ จะถูก “ขยายทวีคูณ” โดยพจน์อนุพันธ์ (D-Term) ส่งผลให้ Actuator เช่น มอเตอร์หรือวาล์ว สั่นกระตุกอย่างรุนแรงและพังได้ในที่สุด!

วันนี้เราจะมาผ่าสมการดูกันว่า ทำไมโหมด D ถึงแพ้ทาง Noise นักหนา และวิศวกรระดับโปรเขามีวิธี “ใส่แว่นกรองฝุ่น (Low-pass filter)” ให้กับตาทิพย์นี้อย่างไรครับ!

3. 🧠 แก่นวิชา (Core Concepts)

ทำไม D-Term ถึงแพ้ทาง Noise? ในระบบควบคุมแบบวงปิด (Closed-loop) ค่าที่เซ็นเซอร์วัดได้ ($y_m$) มักจะไม่ใช่ค่าที่แท้จริงของกระบวนการ ($y$) เสมอไป แต่มันมักจะมีสัญญาณรบกวน ($w$) ปะปนมาด้วยเสมอ ดังสมการ: $$ y_m(t) = y(t) + w(t) $$

เมื่อนำไปหาค่าความผิดพลาด $e(t) = y_{SP} - y_m(t)$ แล้วป้อนเข้าสู่โหมดอนุพันธ์ เราจะได้ว่า: $$ u_d = K_p T_d \frac{de}{dt} = K_p T_d \frac{d(y_{SP} - y)}{dt} - K_p T_d \frac{dw}{dt} $$

ปัญหาโลกแตกมันอยู่ตรงพจน์สุดท้ายนี่แหละครับ! $\frac{dw}{dt}$ คือ “อัตราการเปลี่ยนแปลงของ Noise” สมมติว่าสัญญาณรบกวนมีหน้าตาเป็นคลื่นไซน์ความถี่สูง $w(t) = W \sin(\omega t)$ เมื่อเราทำการดิฟ (หาอนุพันธ์) มันจะได้: $$ \frac{dw}{dt} = \omega W \cos(\omega t) $$

สังเกตตัวแปร $\omega$ (ความถี่) ที่โผล่มาคูณอยู่ด้านหน้าไหมครับ? หมายความว่า ยิ่ง Noise มีความถี่สูงมากเท่าไหร่ ($\omega \to \infty$) ขนาดของสัญญาณคำสั่ง $\omega W$ ก็จะยิ่งขยายใหญ่ขึ้นเป็นทวีคูณ! สัญญาณกวนยิบย่อยที่ตาเปล่าแทบมองไม่เห็น จะถูกขยายจนกลายเป็นสไปก์ (Spike) กระชากมอเตอร์ของคุณจนครางเสียงหลงเลยล่ะครับ

ทางออก: การใส่ Low-pass Filter วิธีแก้ปัญหานี้ไม่ใช่การปิดโหมด D ทิ้งไปครับ (แม้ในหลายอุตสาหกรรมจะเลือกหนีปัญหาด้วยการใช้แค่ PI ก็ตาม) แต่เราจะทำการ “กรองสัญญาณความถี่สูงทิ้ง (Low-pass filter)” ก่อนที่จะนำไปดิฟ ซึ่งโดยทั่วไปเราจะใช้ฟิลเตอร์อันดับหนึ่ง (First-order lowpass filter) ครับ

บล็อกไดอะแกรมแสดงการทำงานของ Low-pass filter ในพจน์ Derivative

4. 🧮 ร่ายมนต์สมการและโค้ดควบคุม (The Math & Implementation)

ในโดเมนความถี่ของลาปลาซ (Laplace Transform) ฟังก์ชันถ่ายโอนของฟิลเตอร์ความถี่ต่ำอันดับหนึ่ง คือ $\frac{1}{T_f s + 1}$ โดยที่ $T_f$ คือค่าคงตัวเวลาของฟิลเตอร์ (Filter time constant)

ดังนั้น พจน์ D ที่ผ่านการกรองแล้ว (Filtered Derivative Term) จะเขียนได้เป็น: $$ D(s) = K_p T_d s \left( \frac{1}{T_f s + 1} \right) = \frac{K_p T_d s}{T_f s + 1} $$

ในทางอุตสาหกรรม เรามักจะผูกค่า $T_f$ ให้เป็นสัดส่วนกับ $T_d$ เพื่อความง่ายในการจูน โดยให้ $T_f = \frac{T_d}{N}$ หรือ $T_f = a T_d$

  • ค่า $N$ (Derivative gain limitation factor) มักจะอยู่ในช่วง 8 ถึง 20 หรือ 3 ถึง 10
  • ความหมายของมันคือ ฟิลเตอร์ตัวนี้จะยอมให้ D-Term ขยายสัญญาณได้สูงสุดไม่เกิน $K_p N$ เท่า เท่านั้น (จำกัด Gain ที่ความถี่สูง)

การเขียนโค้ด C/C++ บน Microcontroller: เราไม่สามารถดิฟแบบต่อเนื่องได้ในโลกดิจิทัล เราจึงใช้ระเบียบวิธีทางตัวเลข (เช่น Euler Backward) มาแปลงสมการ เพื่อให้ได้โค้ดที่รันในลูป dt หรือ $T_s$ (Sample time) ได้ดังนี้ครับ:

// ตัวแปรในระบบ (Global Variables)
float Kp = 2.0, Ki = 0.5, Kd = 0.1; // Kd = Kp * Td
float N = 10.0;     // ค่าพารามิเตอร์จำกัดเกนของฟิลเตอร์ (Typical: 8-20)
float dt = 0.01;    // Sample time (10ms)

// State variables สำหรับเก็บค่าอดีต
float integral_sum = 0.0;
float prev_error = 0.0;
float prev_D_out = 0.0; 

float PID_Compute_Filtered_D(float setpoint, float current_pv) {
    float error = setpoint - current_pv;
    
    // 1. P-Term
    float P_out = Kp * error;
    
    // 2. I-Term (พร้อมละเว้น Anti-windup เพื่อความกระชับ)
    integral_sum += (error * dt);
    float I_out = Ki * integral_sum;
    
    // 3. D-Term ที่มี Low-pass filter (Band-limited Differentiator)
    // จากสมการ D_out(s) = (Kd * s) / ( (Kd/(Kp*N))*s + 1 ) * E(s)
    // แปลงด้วยวิธี Euler Backward:
    float Tf = Kd / (Kp * N); // ค่า Time constant ของฟิลเตอร์
    
    float D_out = (Tf / (Tf + dt)) * prev_D_out 
                + (Kd / (Tf + dt)) * (error - prev_error);
    
    // 4. รวมสัญญาณสั่งงาน (Control Output)
    float output = P_out + I_out + D_out;
    
    // อัปเดตตัวแปรอดีตสำหรับลูปถัดไป
    prev_error = error;
    prev_D_out = D_out;
    
    return output;
}

(โค้ดนี้ช่วยลดความรุนแรงจากการดิฟสัญญาณ Noise ได้อย่างมีประสิทธิภาพ และเป็นวิธีที่มาตรฐาน PLC นิยมใช้ครับ!)

5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)

แล้วถ้าเราเอา Low-pass Filter ไปใส่ดักไว้ที่ “สัญญาณวัดจากเซ็นเซอร์ (Measurement Signal)” ตรงๆ เลยตั้งแต่แรก เพื่อให้ P และ I ได้รับสัญญาณเนียนๆ ไปด้วยล่ะ ดีไหม?

คำตอบคือ: ต้องระวังให้มากครับ! (Proceed with caution!) การใส่ Low-pass Filter ที่เส้นทางป้อนกลับ (Feedback path) ก่อนเข้า PID ทั้งระบบ จะเป็นการ “เพิ่มพลวัต (Dynamics)” หรือเพิ่มความหน่วง (Delay) เข้าไปในลูปควบคุม

สิ่งที่จะเกิดขึ้นคือ:

  1. Phase Margin ลดลง (Stability Problems): ฟิลเตอร์จะทำให้เกิด Phase Lag เพิ่มเติมในระบบ ถ้าระบบเดิมมีค่าเผื่อเสถียรภาพน้อยอยู่แล้ว การใส่ฟิลเตอร์ที่ช้าเกินไป (Bandwidth ต่ำไป) อาจทำให้ระบบควบคุมสั่นแกว่งและ “สูญเสียเสถียรภาพ (Unstable)” ได้เลยครับ!
  2. สัญญาณที่แท้จริงหายไป: การตั้งจุดตัดความถี่ (Cutoff frequency) ต่ำเกินไป ไม่ได้กรองแค่ Noise แต่ยังกรอง “พฤติกรรมที่แท้จริงของกระบวนการ” ทิ้งไปด้วย ทำให้สมองกล PID ได้รับข้อมูลที่บิดเบือนและตอบสนองช้าลง

Pro-Tip จากรุ่นพี่:

  • หากเซ็นเซอร์มี Noise สูง ให้พิจารณาแก้ที่ต้นเหตุก่อน เช่น ใช้สายชิลด์ (Shielded cable), แยกกราวด์, หรือปรับปรุงวงจรขยายสัญญาณ (Instrumentation)
  • หากต้องใช้ฟิลเตอร์จริงๆ พยายามใช้ฟิลเตอร์เฉพาะในโหมด D (อย่างที่อธิบายไปในโค้ด) หากจำเป็นต้องใช้ Measurement Filter หน้าลูป ควรตั้งให้ Bandwidth ของฟิลเตอร์ “สูงกว่า” ความถี่ของกระบวนการ (Loop Bandwidth) อย่างน้อย 5-10 เท่า เพื่อไม่ให้กระทบ Phase Margin มากเกินไปครับ!

6. 🏁 บทสรุป (To be continued…)

สัญญาณรบกวน (Measurement Noise) คือตัวการร้ายที่ทำให้สมการ PID ในอุดมคติต้องสั่นคลอน โดยเฉพาะโหมดอนุพันธ์ (D) ที่มีธรรมชาติชอบขยายสัญญาณความถี่สูง การประยุกต์ใช้ Low-pass filter เข้ามาเป็นกันชน (Band-limited differentiator) ถือเป็นวิธีมาตรฐานอุตสาหกรรมที่ขาดไม่ได้ เพื่อให้ Actuator ของเราทำงานได้อย่างนิ่มนวลและมีอายุการใช้งานที่ยืนยาว

ถึงจุดนี้ น้องๆ ได้รู้จักปัญหาใหญ่ทั้ง 3 ของ PID ครบแล้ว ไม่ว่าจะเป็น Derivative Kick (จากการเปลี่ยน Setpoint), Integral Windup (จากการที่ Actuator อิ่มตัว), และ Measurement Noise ในตอนต่อไป เราจะปิดท้ายซีรีส์พื้นฐานด้วยเรื่องที่ทุกคนรอคอย: “วิธีการจูนค่า $K_p, K_i, K_d$ ด้วยเทคนิค Ziegler-Nichols” คณิตศาสตร์จะช่วยเราหาพารามิเตอร์ที่สมบูรณ์แบบได้อย่างไร รอติดตามชมครับ!


ต้องการที่ปรึกษาด้านการออกแบบระบบควบคุม (Control Systems), หุ่นยนต์อัตโนมัติ (Robotics) หรือพัฒนาระบบ Automation ขั้นสูงให้กับโรงงานของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและติดตั้งระบบแบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p