PID控制系统的基本构架实际就是我们耳熟能详的反馈控制,这里将PID与之进行类比:
PID控制思想:我们在单片机中不可能实现连续的控制(不可能说都去进行PID控制,否则就进入了死循环,不能进行其他的操作),所以说这里在使用的是PID控制器离散型分析,顾名思义就是说我们获取的数据不是连续的,而是每隔相同的时间进行获取(这个和我们单片机的中断相吻合)
注意这里是定义的一个PID_TYPE的一个结构体变量方便了我们管理数据
还有一个巧妙的地方是代码运用了积分分离法。这里的积分分离法的基本思想是在偏差大时不进行积分,仅当偏差的绝对值小于一预定的门限值ε时才进行积分累积。这样既防止了偏差大时有过大的控制量,也避免了过积分现象。
关于应用,例如说:
(这里在无人机中的应用就是飞行姿态的角度问题,在使用比例控制时最后会出现稳态误差,虽然可以用积分进行补偿。但是如果一开始就使用积分控制,这里在达到目标值的时候会有较大的起伏使得Sk=0从而保持稳态,但是这样的较大的起伏可能并不是我们想要的。所以才有了我们所谓的积分分离法,就是在设定值上下确定一个较小的门限值ε,只有在门限值内即:设定值-门限值ε<实际值<设定值+门限值ε 时,积分才参与控制,所以这里定义的有积分分离变量与积分限幅变量以及积分分离标志)
函数的参数有:结构体指针,目标值,测量值,(以及采样时间dt这里没有设置)还有“->”的意思可能理解有些问题:
“->”是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.
struct Data{ int a,b,c;}; struct Data * p;struct Data A = {1,2,3};int x;p = &A ; x = p->a;
这里简单的理解就是在一个名为PID的数组里面,是按Error,target,measure等等这些变量名来存储数据的(PID->Error == PID.Error)
-------------------------------------------------------------
最后还想分享一下无人机串级PID的实现思路,这里的串级PID就是将控制分为内环与外环:
外环:角度环
内环: 角速度环
有什么不对的地方欢迎各位大佬指出