前言
记录一下曾经折磨博主很久的PID算法,O(∩_∩)O哈哈~。因为现在PID算法已经很广泛的应用了,网络上也有许多专业大牛的生动讲解,我这里就挑一些我看完后觉得不错的文章分享给大家,帮助大家更快的学习PID吧。
PID算法基础
大家可以去参考下面这篇博客,对于经典PID的 Kp Ki Kd 的讲解。
地址:http://www.dfrobot.com.cn/community/thread-14783-1-1.html
PID算法改进
有一定基础的可以看一下下面这篇博客,这个博主写的也挺好的,但阅读需要一定的水平。
地址:https://blog.csdn.net/github_39611196/article/details/81153851
PID资源说明
代码是用C写的,包含了必要的注释(我觉得注释挺多,也挺明白了),如果看不懂可以参照上面的其他博主的讲解,或者多去百度了解下原理。
我上传的PID代码中包含了以下控制,如果不需要的控制参数,可以直接给0即可:
1 Kp Ki Kd (经典PID)
2 积分误差限幅
3 积分饱和限幅
4 前馈控制
5 微分先行
关于PID的调参,网络上有许多口诀和方法。不同的应用所需的控制不同,调参也不同,我就不帮大家找了。还是那句话,百度一下,你就知道。PID的后续还有ADRC等比较高级的控制算法,感兴趣可以继续学习。
最后,PID算法没有想象的那么难,你沉静下来,好好的研究一下,网上的资源很多,发现做到应用还是可以的。难的是你自己是否可以迈出这一步去尝试!
PID资源头文件
.h代码(对外的封装接口)
typedef struct
{
float kp; //比例系数
float ki; //积分系数
float kd_ex; //微分系数
float kd_fb; //微分先行系数
float k_ff; //前馈系数
}_PID_arg_st;//PID参数结构体
typedef struct
{
float err; //误差
float exp_old; //上次误差
float fb_old; //上次反馈
float fb_d; //微分先行
float exp_d; //期望微分
float err_i; //积分项
float out; //输出
}_PID_val_st;//PID数据结构体
float PID_calculate(float dT_s, //周期(单位:秒)
float in_ff, //前馈值
float expect, //期望值(设定值)
float feedback, //反馈值
_PID_arg_st *pid_arg, //PID参数结构体
_PID_val_st *pid_val, //PID数据结构体
float inte_d_lim, //积分误差限幅
float inte_lim //积分限幅
);