欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

PID原理以及C语言的代码实现

时间:2023-04-30

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就是将控制分为内环与外环:

外环:角度环

内环:   角速度环

有什么不对的地方欢迎各位大佬指出

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。