<强> PID算法实现强>
导入的时间 类PID: def __init__(自我,P=0.2,=0.0, D=0.0): 自我。Kp=P 自我。Ki=我 自我。Kd=D 自我。sample_time=0.00 自我。当前时间=time.time () 自我。last_time=self.current_time self.clear () def清楚(自己): 自我。选点=0.0 自我。PTerm=0.0 自我。摘要=0.0 自我。DTerm=0.0 自我。last_error=0.0 self.int_error=0.0 自我。windup_guard=20.0 自我。输出=0.0 def更新(自我,feedback_value): 错误=自我。选点,feedback_value 自我。当前时间=time.time () delta_time=自我。当前时间- self.last_time delta_error=错误- self.last_error 如果(delta_time祝辞=self.sample_time): 自我。PTerm=自我。Kp *错误#比例 自我。摘要+=错误* delta_time #积分 如果(自我。摘要& lt;-self.windup_guard): 自我。摘要=-self.windup_guard elif(自我。摘要在self.windup_guard): 自我。摘要=self.windup_guard 自我。DTerm=0.0 如果delta_time比;0: 自我。DTerm=delta_error/delta_time 自我。last_time=self.current_time 自我。last_error=错误 自我。输出=自我。PTerm +(自我。Ki * self.ITerm) +(自我。Kd * self.DTerm) def setKp(自我,proportional_gain): 自我。Kp=proportional_gain def setKi(自我,integral_gain): 自我。Ki=integral_gain def setKd(自我,derivative_gain): 自我。Kd=derivative_gain def setWindup(自我,结束): 自我。windup_guard=结束 def setSampleTime(自我,sample_time): 自我。sample_time=sample_time >之前<强>测试PID算法强>
进口PID 导入的时间 进口matplotlib matplotlib.use (“TkAgg”) 进口matplotlib。pyplot作为plt 进口numpy np 从scipy.interpolate进口样条 #这个程序的实质就是在前九秒保持零输出,在后面的操作中在传递函数为某某的系统中输出1 def test_pid(我=0.0,P=0.2 D=0.0 L=100): ”““自测PID类 . .注意:: … 我的范围(1): pid.update(反馈) 输出=pid.output 如果pid。选点祝辞0: 输出反馈+=(- (1/i)) 如果i> 9: pid。选点=1 time . sleep (0.02) --- ”“” pid=pid。PID (P, I, D) pid.SetPoint=0.0 pid.setSampleTime (0.01) 结束=L 反?0 feedback_list=[] time_list=[] setpoint_list=[] 我的范围(1): pid.update(反馈) 输出=pid.output 如果pid。选点祝辞0: 反馈+=#输出(输出- (1/i))控制系统的函数 如果i> 9: pid。选点=1 time . sleep (0.01) feedback_list.append(反馈) setpoint_list.append (pid.SetPoint) time_list.append(我) time_sm=np.array (time_list) time_smooth=np.linspace (time_sm.min (), time_sm.max (), 300) feedback_smooth=花键(time_list feedback_list time_smooth) plt.figure (0) plt。情节(time_smooth feedback_smooth) plt。情节(time_list setpoint_list) plt。xlim (L (0,)) plt.ylim (min (feedback_list) -0.5, max (feedback_list) + 0.5)) plt。包含(时间(s)) plt。ylabel (PID (PV)) plt。标题(“测试PID”) plt.ylim ((1 - 0.5, (1 + 0.5)) plt.grid(真正的) plt.show () if __name__==癬_main__”: test_pid (1.2、1、0.001 L=80) # test_pid (0.8 L=50) >之前<强>结果强>
以上这篇python实现PID算法及测试的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
python实现PID算法及测试的例子