PID算法原理及基本实现

2023-05-16

自动控制中,PID及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景。

1、PID算法基本原理

PID算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法。对于一般的研发人员来说,设计和实现PID算法是完成自动控制系统的基本要求。这一算法虽然简单,但真正要实现好,却也需要下一定功夫。首先我们从PID算法最基本的原理开始分析和设计这一经典命题。

PID算法的执行流程是非常简单的,即利用反馈来检测偏差信号,并通过偏差信号来控制被控量。而控制器本身就是比例、积分、微分三个环节的加和。其功能框图如下:
在这里插入图片描述
根据上图我们考虑在某个特定的时刻t,此时输入量为rin(t),输出量为rout(t),于是偏差就可计算为err(t)=rin(t)-rout(t)。于是PID的基本控制规律就可以表示为如下公式:
在这里插入图片描述
其中Kp为比例带,TI为积分时间,TD为微分时间。PID控制的基本原理就是如此。

2、PID算法的离散化

上一节简单介绍了PID算法的基本原理,但要在计算机上实现就必须将其离散化,接下来我们就说一说PID算法的离散化问题。在实现离散化之前,我们需要对比例、积分、微分的特性做一个简单的说明。

比例就是用来对系统的偏差进行反应,所以只要存在偏差,比例就会起作用。积分主要是用来消除静差,所谓静差就是指系统稳定后输入输出之间依然存在的差值,而积分就是通过偏差的累计来抵消系统的静差。而微分则是对偏差的变化趋势做出反应,根据偏差的变化趋势实现超前调节,提高反应速度。

在实现离散前,我们假设系统采样周期为T。假设我们检查第K个采样周期,很显然系统进行第K次采样。此时的偏差可以表示为err(K)=rin(K)-rout(K),那么积分就可以表示为:err(K)+ err(K+1)+┈┈,而微分就可以表示为:(err(K)- err(K-1))/T。于是我们可以将第K次采样时,PID算法的离线形式表示为:
在这里插入图片描述
也可以记为:
在这里插入图片描述
这就是所谓的位置型PID算法的离散描述公式。我们知道还有一个增量型PID算法,那么接下来我们推到一下增量型PID算法的公式。上面的公式描述了第k个采样周期的结果,那么前一时刻也就是k-1个采样周期就不难表示为:
在这里插入图片描述
那么我们再来说第K个采样周期的增量,很显然就是U(k)-U(k-1)。于是我们用第k个采样周期公式减去第k-1个采样周期的公式,就得到了增量型PID算法的表示公式:
在这里插入图片描述
当然,增量型PID必须记得一点,就是在记住U(k)=U(k-1)+∆U(k)。

3、PID控制器的基本实现

完成了离散化后,我们就可以来实现它了。已经用离散化的数据公式表示出来后,再进型计算机编程已经不是问题了。接下来我们就使用C语言分别针对位置型公式和增量型公式来具体实现。

(1)位置型PID的简单实现

位置型PID的实现就是以前面的位置型公式为基础。这一节我们只是完成最简单的实现,也就是将前面的离散位置型PID公式的计算机语言化。

首先定义PID对象的结构体:

 1 /*定义结构体和公用体*/
 2 
 3 typedef struct
 4 
 5 {
 6 
 7   float setpoint;       //设定值
 8 
 9   float proportiongain;     //比例系数
10 
11   float integralgain;      //积分系数
12 
13   float derivativegain;    //微分系数
14 
15   float lasterror;     //前一拍偏差
16 
17   float result; //输出值
18 
19   float integral;//积分值
20 
21 }PID;

接下来实现PID控制器:

 1 void PIDRegulation(PID *vPID, float processValue)
 2 
 3 {
 4 
 5   float thisError;
 6 
 7   thisError=vPID->setpoint-processValue;
 8 
 9   vPID->integral+=thisError;
10 
11   vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
12 
13   vPID->lasterror=thisError;
14 
15 }

这就实现了一个最简单的位置型PID控制器,当然没有考虑任何干扰条件,仅仅只是对数学公式的计算机语言化。

(2)增量型PID的简单实现

增量型PID的实现就是以前面的增量型公式为基础。这一节我们只是完成最简单的实现,也就是将前面的离散增量型PID公式的计算机语言化。

首先定义PID对象的结构体:

 1 /*定义结构体和公用体*/
 2 
 3 typedef struct
 4 
 5 {
 6 
 7   float setpoint;       //设定值
 8 
 9   float proportiongain;     //比例系数
10 
11   float integralgain;      //积分系数
12 
13   float derivativegain;    //微分系数
14 
15   float lasterror;     //前一拍偏差
16 
17   float preerror;     //前两拍偏差
18 
19   float deadband;     //死区
20 
21   float result; //输出值
22 
23 }PID;

接下来实现PID控制器:

void PIDRegulation(PID *vPID, float processValue)
{
  float thisError;
  float increment;
  float pError,dError,iError;

  thisError=vPID->setpoint-processValue; //得到偏差值

  pError=thisError-vPID->lasterror;

  iError=thisError;

  dError=thisError-2*(vPID->lasterror)+vPID->preerror;

  increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError;   //增量计算

 

  vPID->preerror=vPID->lasterror;  //存放偏差用于下次运算

  vPID->lasterror=thisError;

  vPID->result+=increment;

}

这就实现了一个最简单的增量型PID控制器,也没有考虑任何的干扰条件,仅仅只是对数学公式的计算机语言化。

4、基本特点

前面讲述并且实现了PID控制器,包括位置型PID控制器和增量型PID控制器。界限来我们对这两种类型的控制器的特点作一个简单的描述。

位置型PID控制器的基本特点:
位置型PID控制的输出与整个过去的状态有关,用到了偏差的累加值,容易产生累积偏差。
位置型PID适用于执行机构不带积分部件的对象。
位置型的输出直接对应对象的输出,对系统的影响比较大。

增量型PID控制器的基本特点:
增量型PID算法不需要做累加,控制量增量的确定仅与最近几次偏差值有关,计算偏差的影响较小。
增量型PID算法得出的是控制量的增量,对系统的影响相对较小。
采用增量型PID算法易于实现手动到自动的无扰动切换。

原文链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PID算法原理及基本实现 的相关文章

  • endNote X9 导入英文文献(谷歌学术、web of science 等)

    文章目录 1 导入英文文献 xff08 谷歌学术 web of science 等 xff09 2 EndNote X9 插入参考文献常见问题总结3 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 导
  • endNote X9 增加 / 删除参考文献 文献编号自动更新

    文章目录 1 增插参考文献2 删减参考文献3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 增插参考文献 61 61 61 61 61 61 61
  • windows10 通过vnc方式远程连接服务器

    以下摘抄至腾讯云文档 xff0c 记录一下 腾讯云 文档中心 轻量应用服务器 最佳实践 搭建Ubuntu可视化界面 VNC xff08 Virtual Network Console xff09 是虚拟网络控制台的缩写 它是一款优秀的远程控
  • UART串口接收设计

    一 设计思路 1 端口设置 为实现UART串口接收 xff0c 所设计的模块应具有如下端口 xff1a 时钟 复位 波特率设置 串行数据输入 并行数据输出 一次数据接收完成标志 如图 xff1a module span class toke
  • (十)性能分析工具的使用(上)

    性能分析工具的使用 1 数据库服务器的优化步骤2 查看系统性能参数3 统计SQL的查询成本 xff1a last query cost4 定位执行慢的 SQL xff1a 慢查询日志4 1 开启慢查询日志参数1 开启slow query l
  • uboot1.1.6/lowlevel.S详解

    TEXT BASE word TEXT BASE 这个TEXT BASE是在uboot1 1 6 board smdk2410 config mk内定义的 xff0c TEXT BASE 61 0x33F80000 config mk内有注
  • 杨辉三角(Pascal‘s Triangle)

    6 杨辉三角 xff08 Pascal 39 s Triangle xff09 1 每个数等于它上方两数之和 直角模式等于上方和左上方元素之和 2 每行数字左右对称 xff0c 由1开始逐渐变大 3 第一行有1个元素 xff0c 第n行有n
  • A*算法在matlab上的实现

    先看看算法的效果 图中蓝绿色大圆为障碍物 xff0c 蓝色小圆为路径节点 xff0c 红色号为目的地 xff0c 蓝色为起点 算法下载位置 xff1a https gitee com bingobinlw volans tree maste
  • 数学知识---数论(质数和约数)

    文章目录 1 质数1 1质数的判定 试除法1 2分解质因数 试除法 1 3筛质数2 约数2 1试除法求约数2 2约数个数2 3约数之和2 4最大公约数 欧几里得算法 xff08 辗转相除法 xff09 1 质数 质数是针对所有大于1的自然数
  • ccie入门学习day1

    写信的例子 Source Name Source address Destination Name Destination address 数据从源端A送达目的端B xff1a 网络地址 xff1a IP地址 网络当中的任何网络设备的标识符
  • OSI七层模型 端到端通信

    免费DNS 电信 xff1a 114 114 114 114 google xff1a 8 8 8 8 xff0c 4 4 2 2 阿里 百度 腾讯 数据的端到端通信 xff1a 1 封装 xff1a encapsulation 2 解封装
  • 常见安全事件

    一 钓鱼 xff1b 1 诱惑性标题 xff1b 2 仿冒真实网站 xff1b 3 骗取用户账号 xff1b 4 骗取用户资料 xff1b 篡改 网页 Tampering 关键字 xff1a Hacked by 搜索引擎语法 xff1a I
  • 局域网技术,涉及到VLAN,TRUNK,链路聚合,VLAN间路由,单臂路由,

    Ethernet xff1a 以太网 构建一个网络 xff08 迷你型 小型 中型 大型 巨型 xff09 集线器 xff08 hub xff09 xff1a 物理层的设备 xff0c 半双工通信 xff0c 泛洪 xff08 floodi
  • ACL 网安基础

    ACL xff1a access control list 访问控制列表 网络当中哪些流量可以通过 xff0c 哪些流量不能通过 xff0c 哪些用户可以登录 xff0c 哪些用户拒绝登录 permit 允许 deny 拒绝 flow co
  • SONiC-P4实验搭建及研究SONiC管理的交换机

    首先需建立在虚拟机上部署SONiC P4仿真环境 xff0c 关于部署SONiC P4 xff0c 详情可以参考https github com sonic net SONiC wiki SONiC P4 Software Switch x
  • Linux操作系统指令

    Linux简介 Linux xff0c 全称GNU Linux xff0c 是一种免费使用和自由传播的类UNIX操作系统 xff0c 其内核由林纳斯 本纳第克特 托瓦兹于1991年10月5日首次发布 xff0c 它主要受到Minix和Uni
  • ubuntu 10.04下的配置tftp服务器

    转载自 http www cnblogs com geneil archive 2011 11 24 2261653 html 第1步 xff1a 安装tftp所需的软件 首先需要安装tftp hpa xff0c tftpd hpa xff
  • 【每天学习一点新知识】如何绕过CDN查真实ip

    1 什么是CDN 为了防止流量过大网络堵塞 xff0c 我们就在靠近用户的地方 xff0c 建一个缓存服务器 xff0c 把远端的内容复制一份 xff0c 放在这里 xff0c 简单来说就是将内容缓存在终端用户附近 2 怎么绕过cdn找到远
  • hadoop集群启动后datanode没有启动

    今天启动hadoop集群后 xff0c 查看进程发现名称节点的NameNode进程启动了 xff0c 但是数据节点的DataNode进程没有启动 xff0c 如下 xff1a 这个问题是个常见问题 xff0c 对于自学的初学者来说 xff0
  • 局域网组网 实验7 MPLS VNP

    配置 xff1a AR1 xff1a interface GigabitEthernet0 0 0 ip address 10 1 2 1 255 255 255 0 interface GigabitEthernet0 0 1 inter

随机推荐

  • 数字逻辑电路(四)

    数字逻辑电路 xff08 四 xff09 目录 组合逻辑电路 1 组合逻辑电路的分析 设计 2 数值计算电路 3 编码器 4 译码器 编码的逆过程 5 数值比较器 6 数据选择器 7 组合逻辑电路分析 组合逻辑电路 1 组合逻辑电路的分析
  • 2020-10-27

    云计算是什么 1 水龙头观点论 xff1a 当需要的时候 xff0c 你别管水是怎么来的 xff0c 电是怎么发的 xff0c 扭开水龙头用水 xff0c 插上插头用电 xff0c 只需要操心交水电费就是了 xff01 当你需要用一个软件时
  • 2020-11-03

    云计算的服务类型 当今IT信息时代 xff0c 云计算激流勇进 xff0c 稳步发展都离不开云计算服务 云计算的服务类型有 1 SaaS 软件即服务 SaaS 软件即服务 xff0c 是指用户获取软件服务的一种新形式 它不需要用户将软件产品
  • 2020-11-03

    云计算五大特点 云计算 xff0c 是一种基于互联网的计算方式 xff0c 通过这种方式 xff0c 共享的软硬件资源和信息可以按需提供给计算机和其他设备 典型的云计算提供商往往提供通用的网络业务应用 xff0c 可以通过浏览器等软件或者其
  • 2020-11-17

    大数据的就业前景还是很不错的 大数据的价值体现在以下几个方面 xff1a xff08 1 xff09 对大量消费者提供产品或服务的企业可以利用大数据进行精准营销 xff1b xff08 2 xff09 做小而美模式的中小微企业可以利用大数据
  • 2020-11-25

    网格计算和云计算有相似之处 xff0c 特别是计算的并行与合作的特点 xff1b 但他们的区别也是明显的 主要有以下几点 xff1a 首先 xff0c 网格计算的思路是聚合分布资源 xff0c 支持虚拟组织 xff0c 提供高层次的服务 x
  • 2020-12-22

    云计算主要包含哪些关键技术 xff1f 1 虚拟化技术 xff1a 云计算的虚拟化技术不同于传统的单一虚拟化 xff0c 它是涵盖整个IT架构的 xff0c 包括资源 网络 应用和桌面在内的全系统虚拟化 xff0c 它的优势在于能够把所有硬
  • ubuntu nfs服务器设置-调试成功

    转载地址 xff1a http www cnblogs com doctorqbw archive 2012 02 03 2337411 html 1 安装nfs服务 xff0c apt get install nfs common nfs
  • 2020-12-28

    大数据发展必备三个条件 大数据概念的横空出世 xff0c 有赖于短短几年出现的海量数据 据统计 xff0c 互联网上的数据每两年翻一番 xff0c 而目前世界上90 以上的数据都是最近几年才产生的 当然 xff0c 海量数据仅仅是 大数据
  • Casbin

    Model Model语法 Model CONF 至少应包含四个部分 request definition policy definition policy effect matchers 如果 model 使用 RBAC 还需要添加 ro
  • STM32串口发送字符串

    在STM32串口学习中 xff0c 串口发送字符串是必不可少的 xff0c 但是 在学习过程中可能会遇到下面这个问题 xff0c 就由我来给大家分享一下吧 下面是封装的串口发送字符串的函数 xff1a void Usart SendStri
  • 树莓派4b安装Ubuntu20.04+ROS-noetic(也适用于历史版本)

    树莓派4b安装Ubuntu20 04 43 ros noetic 前言一 镜像下载二 烧录系统1 插入tf卡 xff0c 首先对tf卡进行格式化2 烧录镜像方法1 官方烧录软件 Raspberry Pi Imager方法2 Win32Dis
  • vscode 项目中安装配置webpack及其插件

    1 安装webpack 在终端运行如下的命令 xff0c 安装webpack相关的两个包 xff1a npm install webpack 64 5 42 1 webpack cli 64 4 7 2 D D表示 xff1a npm安装完
  • 【02】FreeRTOS获取10.4.6源码+移植到STM32F429步骤

    目录 1 获取FreeRTOS源码 1 1 FreeRTOS官网下载步骤 1 2FreeRTOS源码内容 1 3FreeRTOS内核文件 1 3 1Demo文件夹 1 3 2Source文件夹 2 FreeRTOS移植 2 1添加FreeR
  • M1-MAC-MYSQL安装+启动的笔记

    前言 xff1a 安装Mysql之前应该先安装JAVA JDK 1 开始安装Mysql xff08 1 xff09 下载Mysql xff1a 官网下载地址 xff1a https dev mysql com downloads mysql
  • OpenCV 与 OpenGL 的区别与关系是什么?

    老婆和老婆饼的关系 没啥关系 xff01 CV Computer Vision 和CG Computer Graphics 两者的区别和联系 CV相当于给了计算机摄像头 xff1f 让它捕获处理视觉信息的技术 xff0c 比如进行图像分类
  • 自制STLinkV2.1

    步骤 绘制原理图 layout 打板 焊接 烧录固件 更新固件 绘制原理图 layout 为了方便焊接 xff0c 元器件都放同一面 烧录固件 用现有STLink及软件STM32 ST LINK Utility为其烧录固件 软件及固件已打包
  • IAR下载报错 “Fatal error: Failed to connect to CPU Session aborted!”

    当IAR下载程序进入单片机运行时出现这个弹窗之后就再也下载不进去程序了 xff0c 报以下错误 解决办法 xff1a 这时候就需要对单片机进行复位了 xff0c 一般是先看电路有没有复位按键如果没有复位按键则需要找到复位电路然后找到电路中的
  • uboot和ubuntu ping通测试结果

    前一段时间开始研究uboot xff0c 首先遇到的问题就是下载的别人移植的uboot始终ping不通主机 xff08 Windows中VMWare虚拟机中的ubuntu10 04 xff09 这几天终于找到了一份可以配合手头开发板的移植说
  • PID算法原理及基本实现

    自动控制中 xff0c PID及其衍生出来的算法是应用最广的算法之一 各个做自动控制的厂家基本都有会实现这一经典算法 我们在做项目的过程中 xff0c 也时常会遇到类似的需求 xff0c 所以就想实现这一算法以适用于更多的应用场景 1 PI