pid --- ตัวควบคุม Proportional-Integral-Derivative¶
โมดูล pid มีคลาสตัวควบคุม Proportional-Integral-Derivative (PID) อย่างง่ายพร้อมตัวกรองความถี่ต่ำสำหรับอนุพันธ์และการจำกัดการพอกพูนของตัวอินทิเกรเตอร์
ตัวอย่าง:
from pid import PID
pid1 = PID(p=0.07, i=0, imax=90)
while True:
error = 50 # error should be calculated as: target - measure
output = pid1.get_pid(error, 1)
# control value with output
class PID¶
- class pid.PID(p: float = 0, i: float = 0, d: float = 0, imax: float = 0)¶
สร้างตัวควบคุม PID
pคือค่าเกนสัดส่วน (Kp)iคือค่าเกนอินทิกรัล (Ki)dคือค่าเกนอนุพันธ์ (Kd)imaxคือค่าสูงสุดสัมบูรณ์ที่จำกัดเทอมอินทิเกรเตอร์ (ขีดจำกัดป้องกันการพอกพูน) โดยเอาต์พุตของอินทิเกรเตอร์จะถูกจำกัดให้อยู่ในช่วง[-abs(imax), +abs(imax)]
เทอมอนุพันธ์ถูกกรองด้วยตัวกรองความถี่ต่ำอันดับหนึ่งคงที่ที่ความถี่ตัดที่ 20 Hz
- get_pid(error: float, scaler: float) float¶
คำนวณและส่งคืนเอาต์พุตของตัวควบคุม PID สำหรับ
errorที่กำหนดerrorคือค่าความผิดพลาดในปัจจุบัน (โดยทั่วไปคือtarget - measurement)scalerคือตัวประกอบมาตราส่วนแบบคูณที่ใช้กับผลรวมของค่าสัดส่วนและอนุพันธ์ รวมถึงส่วนเพิ่มของตัวอินทิเกรเตอร์
ช่วงเวลาระหว่างการเรียกใช้ต่อเนื่องจะถูกวัดภายในโดยใช้
time.ticks_ms()หากเวลาผ่านไปมากกว่า 1000 ms ระหว่างการเรียกใช้ (หรือในการเรียกใช้ครั้งแรก) ตัวอินทิเกรเตอร์จะถูกรีเซ็ตผ่านPID.reset_I()และช่วงเวลาจะถูกถือเป็นศูนย์สำหรับขั้นตอนนั้นส่งคืนเอาต์พุต PID เป็น
float
- reset_I() None¶
รีเซ็ตสถานะของตัวอินทิเกรเตอร์ ล้างเทอมอินทิกรัลสะสมให้เป็นศูนย์และล้างค่าอนุพันธ์ที่แคชไว้ (ตั้งค่าเป็น
NaN) เพื่อให้การเรียกใช้PID.get_pid()ครั้งต่อไปเริ่มต้นตัวกรองอนุพันธ์ใหม่