C语言实现PID算法:位置式PID和增量式PID[通俗易懂]

原创者微信公众号PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛。大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID控制在其中起到了关键的作用。说来惭愧,大学这门课程学的不咋滴,老师讲的课基本没听进去过。直到后面接触竞赛,算是对PID有了很基础的一点点认识,直到现在工作实际应用的…

大家好,又见面了,我是你们的朋友全栈君。

原创者微信公众号

C语言实现PID算法:位置式PID和增量式PID[通俗易懂]

C语言实现PID算法:位置式PID和增量式PID[通俗易懂]

PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛。

大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID控制在其中起到了关键的作用。

说来惭愧,大学这门课程学的不咋滴,老师讲的课基本没听进去过。直到后面接触竞赛,算是对PID有了很基础的一点点认识,直到现在工作实际应用的比较广泛才知道它的重要性。所以,这里特地回顾一下。

Ⅰ什么是PID

PID,即比例Proportion、积分Integral和微分Derivative三个单词的缩写。

闭环自动控制技术是基于反馈的概念以减少不确定性,在闭环自动控制原理中,我们把它叫做“PID控制器”,拿控制电机来说,参考下面模型:

C语言实现PID算法:位置式PID和增量式PID[通俗易懂]

下面引用一段网上经典的话:

在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。

ⅡPID原理

常规的模拟 PID 控制系统原理框图如下:

C语言实现PID算法:位置式PID和增量式PID[通俗易懂]

该系统由模拟 PID 控制器和被控对象组成。

上面框图中, r(t) 是给定值, y(t) 是系统的实际输出值,给定值与实际输出值构成控制偏差e(t) = r(t) − y(t).

e(t) 作为 PID 控制的输入, u(t)作为 PID 控制器的输出和被控对象的输入。 所以模拟 PID 控制器的控制规律为:

C语言实现PID算法:位置式PID和增量式PID[通俗易懂]

三个重要的参数

Kp:控制器的比例系数.

Ti:控制器的积分时间,也称积分系数.

Td:控制器的微分时间,也称微分系数.

1、P – 比例部分

比例环节的作用是对偏差瞬间作出反应。偏差一旦产生控制器立即产生控制作用, 使控制量向减少偏差的方向变化。 控制作用的强弱取决于比例系数Kp, 比例系数Kp越大,控制作用越强, 则过渡过程越快, 控制过程的静态偏差也就越小; 但是Kp越大,也越容易产生振荡, 破坏系统的稳定性。 故而, 比例系数Kp选择必须恰当, 才能过渡时间少, 静差小而又稳定的效果。

2、I  – 积分部分

从积分部分的数学表达式可以知道, 只要存在偏差, 则它的控制作用就不断的增加; 只有在偏差e(t)=0时, 它的积分才能是一个常数,控制作用才是一个不会增加的常数。 可见,积分部分可以消除系统的偏差。

积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数Ti越大,积分的积累作用越弱,这时系统在过渡时不会产生振荡; 但是增大积分常数Ti会减慢静态误差的消除过程,消除偏差所需的时间也较长, 但可以减少超调量,提高系统的稳定性。

当 Ti 较小时, 则积分的作用较强,这时系统过渡时间中有可能产生振荡,不过消除偏差所需的时间较短。所以必须根据实际控制的具体要求来确定Ti 。

3、D – 微分部分

实际的控制系统除了希望消除静态误差外,还要求加快调节过程。在偏差出现的瞬间,或在偏差变化的瞬间, 不但要对偏差量做出立即响应(比例环节的作用), 而且要根据偏差的变化趋势预先给出适当的纠正。为了实现这一作用,可在 PI 控制器的基础上加入微分环节,形成 PID 控制器。

微分环节的作用使阻止偏差的变化。它是根据偏差的变化趋势(变化速度)进行控制。偏差变化的越快,微分控制器的输出就越大,并能在偏差值变大之前进行修正。微分作用的引入, 将有助于减小超调量, 克服振荡, 使系统趋于稳定, 特别对髙阶系统非常有利, 它加快了系统的跟踪速度。但微分的作用对输入信号的噪声很敏感,对那些噪声较大的系统一般不用微分, 或在微分起作用之前先对输入信号进行滤波。

ⅢPID算法代码

 PID 控制算法可以分为位置式 PID 和增量式 PID 控制算法。

两者的区别:

(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;

(2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

(3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。

下面给出公式直接体现的C语言源代码(请结合项目修改源代码):

1.位置式PID

C语言实现PID算法:位置式PID和增量式PID[通俗易懂]

typedef struct {
  float Kp;                       //比例系数Proportional
  float Ki;                       //积分系数Integral
  float Kd;                       //微分系数Derivative

  float Ek;                       //当前误差
  float Ek1;                      //前一次误差 e(k-1)
  float Ek2;                      //再前一次误差 e(k-2)
  float LocSum;                   //累计积分位置 }PID_LocTypeDef;

/************************************************ 函数名称 : PID_Loc 功    能 : PID位置(Location)计算 参    数 : SetValue ------ 设置值(期望值)            ActualValue --- 实际值(反馈值)            PID ----------- PID数据结构 返 回 值 : PIDLoc -------- PID位置 作    者 : strongerHuang *************************************************/ float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID)
{
  float PIDLoc;                                  //位置

  PID->Ek = SetValue - ActualValue;
  PID->LocSum += PID->Ek;                         //累计误差

  PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek);

  PID->Ek1 = PID->Ek;  return PIDLoc;
}

2.增量式PID

C语言实现PID算法:位置式PID和增量式PID[通俗易懂]

typedef struct {
  float Kp;                       //比例系数Proportional
  float Ki;                       //积分系数Integral
  float Kd;                       //微分系数Derivative

  float Ek;                       //当前误差
  float Ek1;                      //前一次误差 e(k-1)
  float Ek2;                      //再前一次误差 e(k-2) }PID_IncTypeDef;

/************************************************ 函数名称 : PID_Inc 功    能 : PID增量(Increment)计算 参    数 : SetValue ------ 设置值(期望值)            ActualValue --- 实际值(反馈值)            PID ----------- PID数据结构 返 回 值 : PIDInc -------- 本次PID增量(+/-) 作    者 : strongerHuang *************************************************/ float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID)
{
  float PIDInc;                                  //增量

  PID->Ek = SetValue - ActualValue;
  PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);

  PID->Ek2 = PID->Ek1;
  PID->Ek1 = PID->Ek;  return PIDInc;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128176.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 25个经典Selenium自动化面试题,赶紧收藏

    25个经典Selenium自动化面试题,赶紧收藏(1)selenium的工作原理?①脚本启动driver②driver去驱动浏览器作为远程服务器③执行脚本发送请求④服务器解析请求作出相应操作,并返回给客户端(脚本)(2)selenium自动化页面元素找不到存在异常的原因?①元素定位错误②页面加载时间过慢,需要查找的元素程序已经完成,单页面还未加载,此时可以加载页面等待时间③有可能元素包含在iframe或…

    2022年6月20日
    43
  • LaTeX多行公式_latex大括号左对齐

    LaTeX多行公式_latex大括号左对齐LaTeX是一种基于ΤΕΧ的排版系统,其中非常突出的是方便而强大的数学公式排版能力。XMind2020现已支持插入LaTeX数学命令,可实时转化为数学方程。此外还支持部分简单的化学方程,理工科的朋友们从此无需再借助其它应用,在XMind中即可完成方程的输入。今天和大家分享下在XMind中如何用LaTeX输入数学公式。1.插入方程在「插入菜单」中找到方程,点击即可进入方程…

    2022年10月11日
    3
  • linux查看文件位置

    linux查看文件位置1 whereiswhere 命令是定位可执行文件 源代码文件 帮助文件在文件系统中的位置 这些文件的属性应属于原始代码 二进制文件 或是帮助文件 whereis 程序还具有搜索源代码 指定备用搜索路径和搜索不寻常项的能力 如果省略参数 则返回所有信息 test localhost whereisbashb bin bash etc bash bashrc usr share man man1 bash 1 gz 说明 以上输出信息从左至右分别为查询的程序

    2025年12月5日
    3
  • 操作系统存储管理之虚拟存储与分页式虚拟存储系统

    操作系统存储管理之虚拟存储与分页式虚拟存储系统虚拟存储实现思路在实际运行过程,把有关作业的全部信息都装入主存储器后,作业执行时实际上不是同时使用全部信息的,有些部分运行一遍便再也不用,甚至有些部分在作业执行的整个过程中都不会被使用到(如错误处理部分)。进程在运行时不用的,或暂时不用的,或某种条件下才用的程序和数据,全部驻留于内存中是对宝贵的主存资源的一种浪费,大大降低了主存利用率。于是,提出了这样的问题:作业提交时,先全部进入辅助存储器,作

    2022年9月26日
    6
  • c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

    c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别先考虑一种情况,对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。先看一个例子,有一个学生类,数据成员时学生的人数和名字:#include<iostream>usingnam…

    2022年9月1日
    3
  • html中iframe自适应高度_设置iframe高度自适应

    html中iframe自适应高度_设置iframe高度自适应h5iframe自适应高度外部div:divposition:relative;width:100%;padding-top:calc(100%*720/1280);border:2pxblacksolid;内部iframe:position:absolute;width:100%;height:100%;top:0;<divstyle=”position:relative;width:100%;padding-top:cal

    2022年10月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号