目录

  • 1 什么是增量式PID?

  • 2 举个例子

    • 2.1 位置式PID

    • 2.2 增量式PID

  • 3 伪算法

  • 4 C语言实现

  • 5 总结

在之前一篇博客中( 简易PID算法的快速扫盲 )简单介绍了PID算法的基本原理位置式算法的实现过程,由于部分推导过程已经在上一篇文章做过介绍,所以推导过程本文不再赘述,重点将对离散增量式PID的算法进行实现。

1 什么是增量式PID?

先看一下增量式PID的离散公式如下:

:比例系数:积分系数:微分系数:偏差

对于所谓的位置式增量式的算法,这两者只是在算法的实现上的存在差异,本质的控制上对于系统控制的影响还是相同,单纯从输入和输出的角度来比较,具体如下表所示;这里简单的说明一下;

  • 位置式:位置式算法较为简单,直接输入当前的偏差 ,即可得到输出;
  • 增量式:增量式算法需要保存历史偏差,,,即在第次控制周期时,需要使用第和第次控制所输入的偏差,最终计算得到 ,此时,这还不是我们所需要的PID输出量;所以需要进行累加;

不难发现第一次控制周期时,即时;由以上公式我们可以推导出下式;所以可以看出,最终PID的输出量,满足以下公式;可见增量式算法,就是所计算出的PID增量的历史累加和;


2 举个例子

2.1 位置式PID

下面从一个简单的例子中去理解一下增量式PID,这里依然举一个不是很恰当的例子;如果是位置式PID算法的话:

  • 隆哥对一个直流电机进行调速,设定了转速为 1000
  • 这时由于反馈回来的速度和设定的速度偏差为 ;
  • 经过位置式PID计算得到;
  • 作为Process的输入值(可以是PWM的占空比),最终Process输出相应的PWM驱动直流电机;
  • 反馈装置检测到电机转速,然后重复以上步骤;

整体框图如下所示;

2.2 增量式PID

对于增量式PID来说;

  • 隆哥对一个直流电机进行调速,设定了转速为 1000
  • 这时由于反馈回来的速度和设定的速度偏差为 ,系统中保存上一次的偏差和上上次的偏差,这三个输入量经过增量PID计算得到;
  • 系统中还保存了上一次的PID输出的,所以加上增量,就是本次控制周期的PID输出——;
  • 作为Process的输入值(可以是PWM的占空比),最终Process输出相应的PWM驱动直流电机;
  • 反馈装置检测到电机转速,然后重复以上步骤;

整体框图如下所示;


所以这里不难发现,所谓增量式PID,它的特点有:

  • 需要输入历史的偏差值;
  • 计算得到的是PID输出增量,因此每一次需要累加历史增量最为当前的PID输出;

下面简单介绍一下如何实现增量式PID算法;

3 伪算法

previous02_error := 0  //上上次偏差previous01_error := 0  //上一次偏差integral := 0   //积分和pid_out := 0   //pid增量累加和//循环 //采样周期为dtloop://setpoint 设定值//measured_value 反馈值    error := setpoint − measured_value //计算得到偏差    proportion := error - previous01_error //计算得到比例输出    integral := error × dt //计算得到积分累加和    derivative := (error − 2*previous01_error + previous02_error) / dt //计算得到微分    pid_delta := Kp × error + Ki × integral + Kd × derivative //计算得到PID增量    pid_out := pid_out + pid_delta //计算得到PID输出//保存当前的偏差和上一次偏差作为下一次采样所需要的历史偏差    previous02_error := previous01_error     previous01_error := error    //保存当前偏差为下一次采样时所需要的历史偏差    wait(dt) //等待下一次采用goto loop

4 C语言实现

这里直接使用了TI公司的PID算法,做了积分抗饱和;具体可以参考controlSUITE\libs\app_libs\motor_control\math_blocks\v4.2\pid_grando.h具体代码如下所示;pid_grando.h

/* =================================================================================File name:       PID_GRANDO.H ===================================================================================*/#ifndef __PID_H__#define __PID_H__typedef struct {  _iq  Ref;      // Input: reference set-point      _iq  Fbk;      // Input: feedback      _iq  Out;      // Output: controller output       _iq  c1;      // Internal: derivative filter coefficient 1      _iq  c2;      // Internal: derivative filter coefficient 2    } PID_TERMINALS;// note: c1 & c2 placed here to keep structure size under 8 wordstypedef struct {  _iq  Kr;    // Parameter: reference set-point weighting       _iq  Kp;    // Parameter: proportional loop gain      _iq  Ki;       // Parameter: integral gain      _iq  Kd;           // Parameter: derivative gain      _iq  Km;           // Parameter: derivative weighting      _iq  Umax;   // Parameter: upper saturation limit      _iq  Umin;   // Parameter: lower saturation limit    } PID_PARAMETERS;typedef struct {  _iq  up;    // Data: proportional term      _iq  ui;    // Data: integral term      _iq  ud;    // Data: derivative term      _iq  v1;    // Data: pre-saturated controller output      _iq  i1;    // Data: integrator storage: ui(k-1)      _iq  d1;    // Data: differentiator storage: ud(k-1)      _iq  d2;    // Data: differentiator storage: d2(k-1)       _iq  w1;    // Data: saturation record: [u(k-1) - v(k-1)]    } PID_DATA;typedef struct {  PID_TERMINALS term;      PID_PARAMETERS param;      PID_DATA  data;    } PID_CONTROLLER;/*-----------------------------------------------------------------------------Default initalisation values for the PID objects-----------------------------------------------------------------------------*/                     #define PID_TERM_DEFAULTS {    \                  0,  \                           0,  \                           0,  \                           0,  \                  0   \                   }#define PID_PARAM_DEFAULTS {         \                           _IQ(1.0), \                           _IQ(1.0), \                           _IQ(0.0), \                           _IQ(0.0), \                           _IQ(1.0), \                           _IQ(1.0), \                           _IQ(-1.0) \                   }#define PID_DATA_DEFAULTS {          \                           _IQ(0.0), \                           _IQ(0.0), \                           _IQ(0.0), \                           _IQ(0.0), \                           _IQ(0.0), \                           _IQ(0.0), \                           _IQ(0.0), \                           _IQ(1.0)  \                   }/*------------------------------------------------------------------------------  PID Macro Definition------------------------------------------------------------------------------*/#define PID_MACRO(v)                                              \                                                                  \/* proportional term */                                           \v.data.up = _IQmpy(v.param.Kr, v.term.Ref) - v.term.Fbk;          \                                                   \/* integral term */                                               \v.data.ui = _IQmpy(v.param.Ki, _IQmpy(v.data.w1,                  \(v.term.Ref - v.term.Fbk))) + v.data.i1;                          \v.data.i1 = v.data.ui;                                            \                                                   \/* derivative term */                                             \v.data.d2 = _IQmpy(v.param.Kd, _IQmpy(v.term.c1,                  \(_IQmpy(v.term.Ref, v.param.Km) - v.term.Fbk))) - v.data.d2;      \v.data.ud = v.data.d2 + v.data.d1;                                \v.data.d1 = _IQmpy(v.data.ud, v.term.c2);                         \                                                   \/* control output */                                              \v.data.v1 = _IQmpy(v.param.Kp,                                    \(v.data.up + v.data.ui + v.data.ud));                             \v.term.Out= _IQsat(v.data.v1, v.param.Umax, v.param.Umin);        \v.data.w1 = (v.term.Out == v.data.v1) ? _IQ(1.0) : _IQ(0.0);      \#endif // __PID_H__

example

/* Instance the PID module */ PID   pid1={ PID_TERM_DEFAULTS, PID_PARAM_DEFAULTS, PID_DATA_DEFAULTS }; main() {     pid1.param.Kp = _IQ(0.5);         pid1.param.Ki  = _IQ(0.005);        pid1.param.Kd = _IQ(0);          pid1.param.Kr  = _IQ(1.0);         pid1.param.Km =_IQ(1.0);         pid1.param.Umax= _IQ(1.0);          pid1.param.Umin= _IQ(-1.0); } void interrupt periodic_interrupt_isr() {      pid1.Ref = input1_1;   // Pass _iq inputs to pid1     pid1.Fbk = input1_2;   // Pass _iq inputs to pid1       PID_MACRO(pid1);  // Call compute macro for pid1            output1 = pid1.Out;  // Access the output of pid1     }

5 总结

本文简单总结了位置式PID算法增量式PID算法的差异,参考了TI公司的增量式PID算法实现,对于不同的控制对象可以根据系统要求选择合适的PID算法-END-

往期好文合集

PID到底是个啥?来给你讲个故事再论PID,PID其实很简单。。。电子设计竞赛(4)-常用的两种PID算法

最 后   

若觉得文章不错,转发分享,也是我们继续更新的动力。5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等在公众号内回复「更多资源」,即可免费获取,期待你的关注~

增量式速度pid调节策略_增量式PID是什么?不知道你就落伍了相关推荐

  1. pid调节软件_非常实用的PID算法和PID控制原理

    点击箭头处"工业之家",选择"关注公众号"! PID控制原理和特点 工程实际中,应用最为广泛调节器控制规律为比例.积分.微分控制,简称PID控制,又称PID调节 ...

  2. 热式气体质量流量计检定规程_热式气体质量流量计基于热扩散原理

    热式气体质量流量计基于热扩散原理 由于现在不段的发展热式气体质量流量计基于热扩散原理,即利用流体流过发热物体时,发热物体的热量散失多少与流体的流量成一定的比例关系.具体来说,流量计的传感器有两只标准及 ...

  3. pid调节软件_(四)差分底盘设计——5.底盘PID控制参数整定

    运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为底盘包 ...

  4. pid调节软件_科学or艺术?——如何优化PID回路以实现最优性能

    尽管大部分应用中都将PID算法作为闭环过程控制的事实标准,但对于如何优化PID回路以达到最优性能的方法,人们仍然没有达成共识. 在工业自动化行业,尽管大部分人将比例- 积分- 微分 (PID) 算法作 ...

  5. 响应式网格项目动画布局_响应式网格及其实际使用方式:常见的UI布局

    响应式网格项目动画布局 重点 (Top highlight) 第二部分 (Part II) Now that you have a basic understanding of how to use ...

  6. 过去式加ed的发音_过去式的变化规律,掌握诀窍了吗?

    点击上方蓝字  关注我们 在英文中,当我们讨论过去发生的事情,我们需要用一般过去时. 那同学们知道在一般过去时的句子中,我们最需要关注哪个"小调皮"吗? 那就是英文中的动词.动词有 ...

  7. java pid 获取句柄_获取进程pid、根据进程pid获取线程pid、获取线程进程句柄

    ======================================= 获取进程pid ======================================= #include &qu ...

  8. 截流式合流制设计流量计算_截流式合流制截污管设计污水量的实测统计方法

    是在河涌两岸沿线敷设截污管 , 把截流 的污 水转 输 图 1 第一种截污管敷设方式示意 图 2 第二种截污管敷设方式示意 到污水处理厂进行处理 . 这两种方式都属于截流式 合流制排水系统 . 1. ...

  9. 截流式合流制设计流量计算_截流式合流制管道系统的设计说明

    第一章 概念及理论 . ........................................................... 2 1.1 排水体制 . ............... ...

最新文章

  1. 机器学习数据预处理之缺失值:最小值最大值填充
  2. SAP PM 初级系列7 - 定义工厂区域
  3. zoj2760(最大流)
  4. 管理的最高境界:残缺中的和谐
  5. js日期格式判断(2018/01/30) -方法 小时分秒格式判断((HH:MM)
  6. [C#]委托和事件(详细讲解)
  7. 【java】visualvm 插件 visual gc 使用介绍
  8. IPC$经典入侵步骤和常用net命令
  9. oracle自我评价简历,程序员简历自我评价
  10. php rrd 做统计数据,Ganlia采样、统计及RRD记录周期(频次、间隔)的配置和更改...
  11. perfmon 端口修改_Jmeter插件之PerfMon监控插件使用说明
  12. 手游推广难?平台的选择至关重要
  13. BUPT-CSAPP 2019 Fall 3.58 3.60 3.63
  14. 问路全球化,富途、老虎需要突围两个关键词
  15. 加入美团2021届北斗计划,用科技定义未来生活
  16. 独立站选杂货爆品站还是精耕垂直站?
  17. Mac 终端配置 oh-my-zsh 和自动补全
  18. State Threads 回调终结者
  19. ITN网络课程笔记(十七)(完)
  20. 中国人民银行招聘计算机水平,2019中国人民银行招聘计算机模拟试题及答案

热门文章

  1. BI工具那么多 该如何选择
  2. java 中_l1,L2指令获取错过远高于L1指令获取未命中
  3. 2020考研计算机专业课,2020考研:计算机考这4个科目,各科该这样备考
  4. php mysql 类型_php mysql bigint 类型
  5. 软件测试方法和技术_软件测试学习怎么入门?附真实学习方法
  6. L2-015 互评成绩(排序)
  7. SWPU信息学院团体程序设计竞赛题解
  8. owncloud 10.0 php,基于Linux云服务器CentOS 7上安装OwnCloud 10.0.8
  9. MapReduce过程详解
  10. MongoDB常用操作命令大全