PID应用详解

匿名 (未验证) 提交于 2019-12-02 23:46:01

阅读目录

1.PID介绍及原理
2.常用四轴的两种PID算法讲解(单环PID、串级PID)
3.常用PID算法的C语言实现
5.常用的四轴飞行器PID算法

PID介绍及原理

PID介绍

  在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,也是最经典的算法。

  现在已经演变出很多智能的算法,如蚁群,神经网络等,感兴趣可以看一下刘金琨老师的《先进pid控制》

PID算法的一般形式:

通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻):

偏差控制被控制量

偏差的控制过程;





伪代码:

串级PID

上述角度单环PID控制算法仅仅考虑了飞行器的角度信息,如果想增加飞行器的稳定性(增加阻尼)并提高它的控制品质,我们可以进一步的控制它的角速度,于是角度/角速度-串级PID控制算法应运而生。在这里,相信大多数朋友已经初步了解了角度单环PID的原理,但是依旧无法理解串级PID究竟有什么不同。其实很简单:它就是两个PID控制算法,只不过把他们串起来了(更精确的说是套起来)。那这么做有什么用?答案是,它增强了系统的抗干扰性(也就是增强稳定性),因为有两个控制器控制飞行器,它会比单个控制器控制更多的变量,使得飞行器的适应能力更强。为了更为清晰的讲解串级PID,这里笔者依旧画出串级PID的原理框图,如图所示:

伪代码:


常用PID算法的C语言实现

位置型PID的C语言实现:

第一步:定义PID变量结构体,代码如下:

struct _pid{







}pid;

第二部:初始化变量,代码如下:

void PID_init(){











}

第三步:编写控制算法,代码如下:

float PID_realize(float speed){







}

注意:这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现,后面的介绍当中还会逐渐的对此改进。

int main(){









return 0;
}

增量型PID的C语言实现:

实现过程仍然是分为定义变量、初始化变量、实现控制算法函数、算法测试四个部分,

#include<stdio.h>
#include<stdlib.h>

struct _pid{






}pid;

void PID_init(){








}

float PID_realize(float speed){







}

int main(){









}

积分分离的PID控制算法C语言实现:

在普通PID控制中,引入积分环节的目的,主要是为了消除静差,提高控制精度。但是在启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,导致控制量超过执行机构可能允许的最大动作范围对应极限控制量,从而引起较大的超调,甚至是震荡,这是绝对不允许的。



if(abs(pid.err)>200)






//算法具体实现过程可参考上面的

抗积分饱和的PID控制算法C语言实现:

float PID_realize(float speed){



































}

变积分的PID控制算法C语言实现:

















}

常用的四轴飞行器PID算法

四轴飞行器常用PID组合:


效果:简单暴力,但是补滤波效果差,单级PID响应慢,打舵跟随效应差。


效果:卡尔曼滤波噪声偏大,滞后略微严重,单级PID难操作,打舵响应慢,跟随效应差。不过比较适合初学四轴的人,难度比四元数加串级PID版本低,易于理解。


常用PID:








此外,网上的版本多是用反正弦函数解算的,那样其实是错的,假使我要解算物体在XZ坐标轴所构成的平面的角度时朝Y轴偏移了一点,那么解算出来的值就是错的,原因自己画图想想吧。





一般情况下来讲,陀螺仪比加速度计的比值取值为0.95:0.05或0.98:0.02。当然也可以根据实际情况降低陀螺仪的比重。





单级PID整定方法参见我写的第一篇帖子!







refer:

https://blog.csdn.net/gen_ye/article/details/52534609

http://bbs.elecfans.com/jishu_1615869_1_1.html

https://blog.csdn.net/mish84/article/details/51062165

更多阅读:

位置式PID与增量式PID的区别:http://www.elecfans.com/dianzichangshi/20171124585738.html

卡尔曼滤波的原理说明,附源代码 :http://bbs.elecfans.com/jishu_484128_1_1.html

【开源】分享一个经典的串级PID算法,附源代码 :http://bbs.elecfans.com/jishu_486485_1_1.html

教你在单片机上套公式实现卡尔曼滤波器 ;http://bbs.elecfans.com/jishu_484132_1_1.html

四元数互补滤波(目前匿名等四轴也是用这个解算方):http://bbs.elecfans.com/jishu_4757431_1.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!