简单记录下我在学习PID过程中遇到的困难及解决方法,希望能对大家有所帮助。
1. 首先,关于PID这块理论知识必须非常清楚,能够自行推导公式,包括位置式PID公式和增量式PID公式
2. 实现位置式PID和增量式PID的C语言代码编写
代码如下如下
#include <stdio.h>
//结构体
typedef struct
{
float kp;
float ki;
float kd;
float expect; //期望
float ex; //误差
float ex_prior; //前次误差
float ex_sum; //误差和
float ux; //输出
}_pid;
_pid p_struc = {0.5, //P
0.1, //I
0.001, //D
};
void pid_func(_pid *p,float temp_exp); //函数声明
int main()
{
int i = 0;
while(i++ < 500) //测试
{
pid_func(&p_struc,1000.0);
printf("The output is : %.3f\r\n",p_struc.ux);
}
return 0;
}
//位置式PID实现函数
//入口参数 结构体指针/期望值
void pid_func(_pid *p,float temp_exp)
{
p->expect = temp_exp; //传参
p->ex = p->expect - p->ux; //求出误差
p->ex_sum += p->ex; //求误差累加和
p->ux = p->kp*p->ex + p->ki * p->ex_sum + p->kd * (p->ex-p->ex_prior); //主体计算
p->ex_prior = p->ex; //保存副本
}
#include <stdio.h>
//结构体
typedef struct
{
float kp;
float ki;
float kd;
float expect; //期望
float ex; //误差
float ex_prior; //前次误差
float ex_prior_prior; //前前次误差
float ux; //输出
float dux; //输出增量
}_pid;
_pid p_struc = {
0.5, //P
0.1, //I
0.001, //D
};
void pid_func(_pid *p,float temp_exp); //函数声明
int main()
{
int i = 0;
while(i++ < 500) //测试
{
pid_func(&p_struc,1000.0);
printf("The output is : %.3f\r\n",p_struc.ux);
}
return 0;
}
//增量式PID实现函数
//入口参数 结构体指针/期望值
void pid_func(_pid *p,float temp_exp)
{
p->expect = temp_exp; //传参
p->ex = p->expect - p->ux; //求出误差
p->dux = p->kp * (p->ex - p->ex_prior) + p->ki * p->ex + p->kd * (p->ex - 2 * p->ex_prior + p->ex_prior_prior);
//计算增量
p->ex_prior_prior = p->ex_prior; //保存副本
p->ex_prior = p->ex; //保存副本
p->ux += p->dux; //计算输出
}
3. 深入理解串级PID,关于这部分,直接参考别人写的,基本就能看懂,资料如下
1 . B站关于串级PID讲解视频,先通俗理解下
https://www.bilibili.com/video/av24220271
2 . 而后看下面这篇博客对串级PID深入理解,框图必须看懂
https://blog.csdn.net/csshuke/article/details/80252406
4.研究匿名代码中关于PID的部分,如下
关于匿名中PID这块东西还是挺多的,简单看了下,首先是“Ano_Pid.c”此文件,实现单级PID,虽然简单,但是后面各种PID控制都直接调用此文件中的函数,很重要,务必看懂,后面是“Ano_AttCtrl.c”文件,里面是关于角度环和角速度环的串级PID内容,接下来是“Ano_AltCtrl.c”文件,设计的是高度环和高度速度环,由于未涉及到过这方面所以也不是很懂,最后顺带着把“Ano_FlightCtrl.c”和“Ano_LocCtrl.c”一起解决了,基本上PID就差不多可以结束了。
以下关于诸文件的解读会各开一个新的文章,所以本文到此结束。
兄弟们,任重而道远啊!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)