ผลตอบสนองและเสถียรภาพ
UAT 206 ระบบควบคุมและออโตไพลอตเบื้องต้น
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- อธิบายค่าวัดผลตอบสนองแบบขั้น เช่น เวลาขึ้น overshoot และเวลาเข้าที่
- คำนวณ overshoot และเวลาเข้าที่ของระบบอันดับสองจากอัตราส่วนความหน่วงและความถี่ธรรมชาติ
- อธิบายเสถียรภาพจากตำแหน่งขั้วบนระนาบ s
- คำนวณผลของเวลาหน่วงต่อ phase margin และหาเวลาหน่วงวิกฤต
ทำไมต้องรู้
เวลาปรับจูนโดรน เราดูว่าเมื่อสั่งเอียงแบบขั้น โดรนตามทันเร็วไหม เกินเป้าไหม และนิ่งเร็วแค่ไหน ค่าเหล่านี้มีชื่อและสูตรที่ผูกกับแบบจำลอง รู้แล้วจะบอกได้ว่าควรปรับค่าไปทางใด และรู้ว่าอะไรทำให้ระบบ ไม่เสถียร คือแกว่งจนคุมไม่ได้
ค่าวัดผลตอบสนองแบบขั้น
Åström และ Murray (2021) นิยามค่าวัดหลักไว้ดังนี้
- เวลาขึ้น (rise time, ) เวลาที่ผลตอบสนองขึ้นจาก 10% ถึง 90% ของค่าสุดท้าย
- overshoot () ส่วนที่เกินค่าสุดท้ายสูงสุด คิดเป็นสัดส่วน
- เวลาเข้าที่ (settling time, ) เวลาที่ผลตอบสนองเข้ามาอยู่ในแถบ ±2% ของค่าสุดท้ายและไม่ออกไปอีก
สำหรับระบบอันดับสองมาตรฐาน และ ตำราให้ตัวอย่างว่า มี overshoot 16% และ มี 4%
ตัวอย่างที่ 1 จำลองเทียบกับสูตร
ระบบอันดับสองความถี่ธรรมชาติ 4 rad/s จำลองด้วยขั้นเวลา 1 ms
import math
W0, DT, T_END = 4.0, 0.001, 6.0
def simulate(zeta):
y = v = 0.0
out = []
for _ in range(int(T_END / DT)):
a = W0 ** 2 * (1 - y) - 2 * zeta * W0 * v
v += a * DT
y += v * DT
out.append(y)
return out
for zeta in (0.3, 0.5, 0.707, 1.0):
ys = simulate(zeta)
over = max(ys) - 1
formula = math.exp(-math.pi * zeta / math.sqrt(1 - zeta ** 2)) if zeta < 1 else 0.0
ts = next(i * DT for i in range(len(ys)) if all(abs(v - 1) <= 0.02 for v in ys[i:]))
print(f"zeta {zeta:<5}: overshoot {max(over, 0):6.1%} (formula {formula:5.1%}), "
f"settling {ts:.2f} s (4/(zeta*w0) = {4 / (zeta * W0):.2f} s)")
zeta 0.3 : overshoot 37.2% (formula 37.2%), settling 2.81 s (4/(zeta*w0) = 3.33 s)
zeta 0.5 : overshoot 16.3% (formula 16.3%), settling 2.02 s (4/(zeta*w0) = 2.00 s)
zeta 0.707: overshoot 4.3% (formula 4.3%), settling 1.49 s (4/(zeta*w0) = 1.41 s)
zeta 1.0 : overshoot 0.0% (formula 0.0%), settling 1.46 s (4/(zeta*w0) = 1.00 s)
overshoot จากการจำลองตรงกับสูตร ส่วนเวลาเข้าที่จากสูตรเป็นค่าประมาณ ใกล้เคียงที่ ราว 0.5–0.7 แต่คลาดชัดที่ และ 1.0 งานโดรนมักต้องการ ราว 0.6–0.8 คือเกินเล็กน้อยแต่เร็ว
เสถียรภาพและขั้ว
ขั้ว (poles) คือรากของตัวส่วนในฟังก์ชันถ่ายโอน ระบบอันดับสองมีขั้วที่ ระบบ เสถียร เมื่อขั้วทุกตัวอยู่ครึ่งซ้ายของระนาบ s ขั้วที่ไกลจากแกนจินตภาพมากตอบสนองเร็วและนิ่งเร็ว ส่วนขั้วที่ส่วนจินตภาพมากเทียบกับส่วนจริงจะแกว่งมาก ถ้าขั้วข้ามไปครึ่งขวา ผลตอบสนองจะโตไม่หยุด
เวลาหน่วงกินเฟส
ระบบจริงมี เวลาหน่วง จากตัวกรองเซนเซอร์ การประมวลผล และมอเตอร์ Åström และ Murray แสดงว่าเวลาหน่วง ไม่เปลี่ยนขนาดของสัญญาณ แต่เพิ่มความล้าหลังของเฟส ที่ความถี่ ทำให้ phase margin ลดลง ตำราแนะนำ phase margin ที่เหมาะสมราว 30–60° ถ้าเหลือศูนย์ ระบบจะแกว่งไม่หยุด
ตัวอย่างที่ 2 เวลาหน่วงในลูปอัตราหมุน
แบบจำลองอย่างง่ายของลูปอัตราหมุน ที่ rad/s ความถี่ตัดข้ามเท่ากับ phase margin เท่ากับ (เป็นองศา)
import math
K, DT = 20.0, 0.0005
def run(delay):
n = int(round(delay / DT))
buf = [0.0] * n
y, out = 0.0, []
for _ in range(int(3 / DT)):
seen = buf[0] if n else y
y += DT * K * (1 - seen)
if n:
buf = buf[1:] + [y]
out.append(y)
return out
print(f"critical delay (phase margin 0) = {math.pi / (2 * K) * 1000:.1f} ms")
for delay in (0.0, 0.02, 0.05, 0.075, 0.09):
ys = run(delay)
pm = 90 - K * delay * 180 / math.pi
tail = max(abs(1 - v) for v in ys[-1000:])
print(f"delay {delay * 1000:>4.0f} ms: phase margin {pm:5.1f} deg, peak {max(ys):6.2f}, "
f"error in last 0.5 s {tail:.3f}")
critical delay (phase margin 0) = 78.5 ms
delay 0 ms: phase margin 90.0 deg, peak 1.00, error in last 0.5 s 0.000
delay 20 ms: phase margin 67.1 deg, peak 1.00, error in last 0.5 s 0.000
delay 50 ms: phase margin 32.7 deg, peak 1.50, error in last 0.5 s 0.000
delay 75 ms: phase margin 4.1 deg, peak 2.00, error in last 0.5 s 0.319
delay 90 ms: phase margin -13.1 deg, peak 25.51, error in last 0.5 s 24.513
เวลาหน่วงเพียง 50 ms ทำให้ระบบที่ไม่เกินเป้าเลยเกินไปถึงครึ่งหนึ่ง เมื่อใกล้ 78.5 ms ระบบแกว่งไม่ยอมนิ่ง และเกินค่านั้นระบบแกว่งโตไม่หยุด นี่คือเหตุผลที่ตัวกรองไจโรที่หน่วงมากเกินไปทำให้โดรนสั่น แม้ค่า PID ไม่เปลี่ยน
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: ค่าวัดผลตอบสนองและเวลาหน่วง
- ใช้โค้ดตัวอย่างที่ 1 ทดลอง สามค่า ดูว่า overshoot และเวลาเข้าที่เปลี่ยนอย่างไร
- วาดตำแหน่งขั้วของแต่ละกรณีบนกระดาษกราฟ เทียบกับภาพที่ 2
- ใช้โค้ดตัวอย่างที่ 2 เปลี่ยน แล้วหาเวลาหน่วงวิกฤตใหม่ เทียบกับสูตร
- ใน SITL เพิ่มเวลาหน่วงหรือลดความถี่ตัวกรองไจโรทีละน้อย สังเกตการแกว่งใน log
- บันทึกข้อสรุปว่าควรเลือก และ phase margin เท่าใดสำหรับโดรนในแล็บ
ข้อผิดพลาดที่พบบ่อย
ระวัง
- ตั้งเป้าว่าต้องไม่มี overshoot เลย จนระบบช้าเกินไป
- ใช้สูตรเวลาเข้าที่แทนผลวัดจริงเสมอ
- มองข้ามเวลาหน่วงจากตัวกรองและการประมวลผล
- ดูแค่ผลตอบสนองเดียว ไม่ดูว่าแกว่งเล็กน้อยต่อเนื่องหรือไม่
- เปลี่ยนหลายค่าพร้อมกัน จนไม่รู้ว่าอะไรทำให้เปลี่ยน
สรุป
- ค่าวัดหลักคือ (10–90%), และ (±2%)
- ระบบอันดับสอง และ
- ระบบเสถียรเมื่อขั้วทุกตัวอยู่ครึ่งซ้ายของระนาบ s
- เวลาหน่วงกินเฟส ทำให้ phase margin ลดลงจนระบบแกว่งได้
แบบฝึกตรวจความเข้าใจ
- มี overshoot ราวกี่เปอร์เซ็นต์
- และ rad/s เวลาเข้าที่โดยประมาณเท่าใด
- ขั้วที่ บอกอะไรเกี่ยวกับระบบ
- ลูปที่ความถี่ตัดข้าม 20 rad/s มีเวลาหน่วง 10 ms เฟสลดไปกี่องศา
- จากข้อ 4 ถ้า phase margin เดิม 90° จะเหลือเท่าใด
เฉลย
- ราว 16%
- s
- ไม่เสถียร เพราะส่วนจริงเป็นบวก ผลตอบสนองจะแกว่งโตขึ้น
- rad
- ราว 78.5°
สรุปสูตรสำคัญ
| overshoot ของระบบอันดับสอง | |
| เวลาเข้าที่ (2%) | |
| เฟสที่เวลาหน่วงกินไป |
แหล่งอ้างอิงหลัก
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz