1. PID(比例-积分-微分)
PID(比例-积分-微分)调参是一种广泛应用于工业控制系统的反馈控制方法,通过调整比例§、积分(I)和微分(D)三个参数来控制系统误差,提高系统的稳定性和响应速度。以下是PID调参的详细介绍:
比例调节(P)。比例调节根据设定值与实际值之间的误差进行调节,当出现误差时,比例调节器会根据误差大小成比例地调整输出以减小误差,从小到大调整比例系数,直到系统出现振荡,此时的比例系数是较为合适的。
积分调节(I)。积分调节的作用是消除系统误差,积分调节器会根据误差大小和时间进行调节以逐步消除误差,适当增大积分系数可以加快系统响应速度,但要注意避免积分过调和振荡。
微分调节(D)。微分调节预测系统未来的变化趋势,微分调节器会根据误差大小和变化速度进行调节,适当减小微分系数可以减少系统灵敏度,避免过调,但要避免微分振荡。
在调整PID参数时,需要根据实际系统和应用需求进行针对性调整,综合考虑系统的稳定性、响应速度、超调量和稳态精度,对于不同的系统,需要适当调整微分系数,如果系统响应较快,则可以适当增大微分系数;如果系统响应较慢,则可以适当减小微分系数。此外,还可以通过计算相角裕度和幅值来设计PID参数
2、 PID参数如何调试
**PID调节器的参数调整口诀如下:**
参数整定找最佳,从小到大顺序查。
先是比例后积分,最后再把微分加。
曲线振荡很频繁,比例度盘要放大。
曲线漂浮绕大湾,比例度盘往小扳。
曲线偏离回复慢,积分时间往下降。
曲线波动周期长,积分时间再加长。
曲线振荡频率快,先把微分降下来。
动差大来波动慢,微分时间应加长。
理想曲线两个波,前高后低四比一。
一看二调多分析,调节质量不会低。
1、手动调整法
这种方法通常涉及对PID参数进行手动微调,以达到满意的控制效果。例如,可以先调整比例增益§,然后调整积分增益(I),最后引入微分增益(D)。在调整过程中,观察系统的响应,如超调、振荡和稳定时间等,根据响应调整参数,直至达到最佳性能。
2、极点配置法
这种方法适用于线性系统。首先计算相角裕度,然后使用极点配置技术将系统的极点配置到期望的位置,如60度相角裕度。这需要先将传递函数转换为PID参数形式,然后进行优化。
3、根轨迹法
对于高阶或具有震荡特性的系统,可以使用根轨迹技术进行PID参数调整。通过观察系统根轨迹的变化,可以找到使系统稳定的最佳PID参数。
4、基于软件工具的方法
如使用专门的PID调校工具,如Betaflight的Pidtoolbox。这些工具允许用户上传飞行过程中的数据,然后分析并调整PID参数,以优化飞行性能。
每种方法都有其适用场景和优缺点,选择哪种方法取决于用户的具体需求和系统特性。通常,对于初学者或非专业人士,手动调整法可能更为直观和易于操作;而对于专业人士或需要精确控制的应用,极点配置法或根轨迹法可能更为适用。
最后我选择使用工具进行调整参数。
'''实时刷新显示波形数据'''
def show_plot():
global show_data,t,fig1,canvas,flag_start,show_data2
global flag_start, show_data, t
global err, sum_err, derr, pwm
global MySerial, index
if flag_start:
with lock: # with模块自动加锁及解锁
show_data_thd = show_data
show_data_thd2 = err
show_data_thd3 = derr
show_data_thd4 = pwm
show_data_thd5 = sum_err
t_thd = t
if len(t_thd) != len(show_data_thd5) or len(t_thd) != len(show_data_thd4) or len(t_thd) != len(show_data_thd2):
print("len(t_thd) != len(show_data_thd)",len(t_thd),len(show_data_thd5),len(show_data_thd4),len(show_data_thd2))
show_data = []
err = [] # 误差
sum_err = [] # 积分
derr = [] # 微分
pwm = [] # 输出pwm
t = []
index = 0
elif t_thd != []:
fig1.clear()
fig1.plot(t_thd, show_data_thd,label='temp',color='red')
fig1.text(t_thd[len(t_thd) - 1], show_data_thd[len(t_thd) - 1], show_data_thd[len(t_thd) - 1],
ha='center', va='bottom', fontsize=10)
fig1.axhline(y=show_data_thd[len(t_thd) - 1], ls=":", c="yellow") # 添加水平直线
fig1.text((t_thd[int(len(t_thd)/2)]), show_data_thd[int(len(t_thd)/2)], show_data_thd[int(len(t_thd)/2)],
ha='center', va='bottom', fontsize=10)
fig1.axhline(y=show_data_thd[int(len(t_thd)/2)], ls=":", c="green") # 添加水平直线
fig1.text( t_thd[0], show_data_thd[0], show_data_thd[0],
ha='center', va='bottom', fontsize=10)
fig1.axhline(y=show_data_thd[0], ls=":", c="red") # 添加水平直线
fig1.legend()
fig2.clear()
fig2.plot(t_thd, show_data_thd5, label='sum_err', color='green')
fig2.grid(linestyle='-.')
fig2.legend()
fig3.clear()
fig3.plot(t_thd, show_data_thd2, label='err', color='blue')
fig3.grid(linestyle='-.')
fig3.legend()
fig4.clear()
fig4.plot(t_thd, show_data_thd4, label='pwm', color='purple')
fig4.grid(linestyle='-.')
fig4.legend()