理解应用PID算法
PID的实现方式分为两种—位置式和增量式。之前我用得比较多的是野火的位置式的PID计算代码,没怎么用增量式PID计算代码。
位置式PID更便于理解,增量式PID的实际应用更多。两者本质上并没有什么不同。在编写PID算法实现代码时需要注意,位置式PID需要有积分限幅和输出限幅,而增量式PID只需输出限幅。
算法推导过程截图的旧笔记链接如下:
【单片机学习笔记】(26):编码器、离散化PID算法推导、增量式PID与位置式PID比较、平衡车_wenhaiii的博客-CSDN博客
算法代码实现摘录旧笔记链接如下:
【单片机学习笔记】(27):sysTick知识补充、MPU6050、PID算法实现代码 、速度闭环内环控制_wenhaiii的博客-CSDN博客
【单片机学习笔记】(30):蓝牙通信、板球控制系统、串级PID_wenhaiii的博客-CSDN博客
参数整定相关摘录旧笔记链接如下:
【单片机学习笔记】(29):平衡车PID参数整定,基于sysTick的任务调度,STLink四线连接、上位机查看波形,定时器按键消抖_wenhaiii的博客-CSDN博客
[单片机学习笔记](35):串级PID算法应用剖析、通过串口控制电机、MPU6050获取平衡车姿态、自制平衡车PID算法程序设计_wenhaiii的博客-CSDN博客
更为详细的PID算法程序设计与参数整定参考本人上传的板球控制系统程序的相关注释
在串级PID两个环中,一个为主调,一个为副调。主调是串级系统中,要被调节的量的PID控制器;副调是串级系统中,输出直接去指挥执行器动作的PID控制器
一般来说,对于串级PID系统,主调为了调节被调量,副调为了消除干扰。主调的死区可以降低甚取消,设置副调的死区就可以降低执行机构的动作次数了。
单纯比例调节:被调量变化多少,输出乘以比例系数的积就变化多少。
单纯积分调节(实际必须配合比例项):如果调节器的输入偏差不等于零,就让调节器的输出按一定的速度一直朝一个方向累加下去。(积分的作用仅仅是为了消除静态误差)
单纯微分调节(实际必须配合比例项):被调量不动,输出不动;被调量移动,输出马上动。(对于串级调节系统而言,主调的死区可以降低甚至取消。设置副调的死区就可以降低机构的动作次数了)(被调量存在不可避免的微笑波动的时候,不应该加微分,而因该加滤波)
最终所整定的系统,其调节效果应该是被调量波动小而平缓。在一个扰动过来之后,被调量的波动应该达到“一大一小两个波“的效果。
最重要的两个指标:被调量的波动范围,执行机构的动作次数。
时间滞后包括容量滞后于纯滞后。容量滞后又包含测量滞后和传送滞后。
整定参数常用口诀
参数整定找最佳,从小到大顺序差,
先是比例后积分,最后再把微分加,
曲线震荡很频繁,比例度盘要放大,
曲线漂浮绕大弯,积分时间往下降,
曲线波动周期长,积分时间再加长,
曲线震荡频率快,先把微分降下来,
动差大来波动慢,微分时间应加长,
理想曲线两个波,前高后低4比1。
一看二调多分析,调节质量不会低!
通过上位机查看波形以整定参数
(想要进一步的理解PID的应用,强烈推荐看焦作华
润白志刚写的《由入门到精通-吃透PID 2.0版》
)
白志刚:趋势读定法整定口诀
自动调节并不难,复杂系统化简单。
整定要练硬功夫,图形特征看熟练。
趋势读定三要素,设定被调和输出。
三个曲线放一起,然后曲线能判读。
积分微分先去掉,死区暂时也不要。
比例曲线最简单,被调与输出一般。
顶点谷底同时刻,升降同时同拐点。
波动周期都一样,静态偏差没法办。
比例从弱渐调强,阶跃响应记时间。
时间放大十来倍,调节周期约在内。
然后比例再加强,没有周期才算对。
静差消除靠积分,能消静差就算稳。
不管被调升或降,输出只管偏差存。
输入偏差等于零,输出才会不积分。
积分不可加太强,输出拐点仔细辨。
积分拐点再靠前,既消静差又不乱。
微分分辨最容易,输入偏差多注意。
偏差不动微分死,偏差一动就积极。
跳动之后自动回,微分时间管回归。
系统若有大延迟,微分超前最适宜。‘
风压水位易波动,微分作用要丢弃。
比例微分和积分,曲线判读特征真。
如果不会看曲线,多看杖策行吟文。
综合比较灵活用,盛极衰来扼杀因。
串级PID控制系统(例如串级PID板球控制系统)参数整定有5个需要上传到上位机的值:主调量设定值(目标坐标)、主调实际值(实际坐标)、主调的PID输出(目标速度)、副调的实际值(实际速度),副调的PID输出(控制速度值)
(甚至副调的PID输出值也可以不管,只要将相应的目标值和实际值去比较就行,最终效果要达到实际值能够快速跟踪目标值的效果。至于后面控制速度值如何转换成加速度,再转换成舵机角度不进行详细推导,只要保证是线性的转换关系就行)
用过三种上位机,移植过喵呜实验室与其上位机,移植过正点协议代码与匿名上位机,移植过野火协议代码与其上位机。没用过硬石的整定PID的上位机,但后面学无刷电机FOC控制时肯定还得学会用硬石的上位机。
喵呜上位机
只能查看四个通道,不过就算对于串级PID来说,能看四条波形也够用了(外环目标值,外环实际值,外环输出值/内环目标值,内环实际值)
主要移植optputdata.c .h文件,以及usart.c .h 的几个关键的宏定义及函数就行。
使用方法是将需要上报的数值填入一个数组后,调用OutPut_Data();将数据上传,。关旧笔记链接如下:
【单片机学习笔记】(29):平衡车PID参数整定,基于sysTick的任务调度,STLink四线连接、上位机查看波形,定时器按键消抖_wenhaiii的博客-CSDN博客
匿名上位机
移植了正点原子的相关例程代码,暂时只定义了发送mpu6050的原始数据和欧拉角数据。经常用来查看MPU6050的姿态。
主要是移植debug_niming.c .h 文件 和 usart.c .h的关键函数和定义即可。
使用方法是调用mpu6050_send_data()和usart1_report_imu()即可很方便查看mpu6050的数据,如果需要自行定义上报特定数据的功能函数,则要先定义一个数组,并参照上面两个函数的形式对数据进行处理,在函数的最后调用usart1_niming_report(),传入参数如何设定还需要看对照手册来确定。相关旧笔记链接如下:
https://blog.csdn.net/wenhaiii/article/details/120511886?spm=1001.2014.3001.5501
野火上位机
比较常用,功能也挺齐全,很方便进行PID参数的镇定,相应的协议也可以用在无线通信上用来保证数据传输可靠。电赛之前主要用这个来查看波形,最多可支持同时查看十个通道的波形。
主要是移植”protocol.c .h”, ”control.c .h” , “bsp_pid.c .h”, “bsp_debug.c .h ” 以及 “stm32f1xx_it.c”里的串口中断回调函数
调试时在protocol.h里面“#define PID_ASSISTANT_EN 1”, 脱机运行时则将它注释掉
使用方法是调用”protocol.c .h” 里定义的 set_computer_value(uint8_t cmd, uint8_t ch, void *data, uint8_t num),根据需要选择相应命令与通道值,最多同时查看5个通道的目标值和实际值,共10个波形。
协议相关代码码移植参考旧笔记,链接如下