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算法原理及基本实现 的相关文章

  • C语言之补漏(1)

    typedef 1 define与typedef区别 xff1f 相比起宏定义的直接替换 xff0c typedef是对类型的封装 xff08 通俗说就是对类型起一个别名 xff09 2 typedef可以给多个别名 typedef int
  • 关于学习如何组装基于F4V3S飞控的竞速穿越机

    广西 河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院 智控无人机小组 创作时间2020 8 22 组装一架穿越机 xff0c 你需要的一些最基本的 xff0c 能让它飞起来的配件有 xff1a 机架
  • STM32—串口

    串口介绍 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指数据一位一位
  • 2021电赛元件清单(评论区有题目预测)

    2021 年全国大学生电子设计竞赛仪器设备和主要元器件及器材清单 本科组 1 仪器设备清单 数字示波器 xff08 100MHz xff0c 双通道 xff09 函数发生器 xff08 50 MHz xff0c 双通道 xff09 任意波信
  • 通过TCP实现客户端与服务端之间通信

    客户端发送的消息 xff0c 服务端接收并在终端中显示出来 服务端代码 xff08 server c include lt stdio h gt include lt sys socket h gt include lt netinet i
  • Qt导入Opencv出现undefined reference to cv::xxx

    Qt配置Opencv在Qt运行时报错undefined reference to cv xxx Face Recognizer报错 FaceRecognizer load const char 41 报错 首先 xff0c 如果出现cv x
  • ESP32 之 ESP-IDF 教学(十二)WiFi篇—— LwIP 之 TCP 通信

    本文章 来自原创专栏 ESP32教学专栏 基于ESP IDF xff0c 讲解如何使用 ESP IDF 构建 ESP32 程序 xff0c 发布文章并会持续为已发布文章添加新内容 xff01 每篇文章都经过了精打细磨 xff01 通过下方对
  • ACWING 799. 最长连续不重复子序列 (入门) (双指针算法)

    给定一个长度为 n 的整数序列 xff0c 请找出最长的不包含重复的数的连续区间 xff0c 输出它的长度 输入格式 第一行包含整数 n 第二行包含 n 个整数 xff08 均在 0 105 范围内 xff09 xff0c 表示整数序列 输
  • STM32串口通信晶振导致问题出现

    STM32串口通信问题 关于stm32串口通信的问题 xff0c 比较常见的主要是以下几个问题 xff1a 1 xff0c 因为波特率不同导致通信时出现乱码 xff0c 这是一个比较常见的问题 xff0c 也是比较容易发现和解决的问题 2
  • 解决ERROR: cannot launch node of type [move_base/move_base]

    最近拿了别人的程序跑 xff0c 直接将工作空间git了过来 xff0c 结果发现提示错误 xff1a ERROR cannot launch node of type move base move base Cannot locate n
  • 基于单片机控制的开关电源设计

    文末下载完整资料 1 概述 1 1 课题来源及意义 电源技术是一种应用功率半导体器件 xff0c 综合电力变换技术 现代电子技术 自动控制技术的多学科的边缘交叉技术 随着科学技术的发展 xff0c 电源技术又与现代控制理论 材料科学 电机工
  • Hikvison对接iSecure Center时获取Appkey和Secert、不显示API网关、预览时提示网络请求失败

    场景 SpringBoot 43 Vue 43 iSecure Center xff08 海康综合安防管理平台 xff09 实现视频预览 xff1a SpringBoot 43 Vue 43 iSecure Center xff08 海康综
  • request和response

    文章目录 前言一 request功能1 获取请求行数据 xff08 1 xff09 方法 xff08 2 xff09 获取请求头数据 xff08 3 xff09 获取请求体数据 2 其他功能 xff08 1 xff09 获取请求参数通用方式
  • C++ Primer Plus 学习笔记(一)

    目录 第二章 开始学习C 43 43 1 主函数 2 预处理器 3 endl 第三章 处理数据 1 简单变量 2 整型 3 C 43 43 初始化 xff1a 4 字符 5 bool 6 const限定符 7 浮点数 8 算数运算符 9 类
  • 【上位机与下位机通信】使用WIFI模块ESP8266连接单片机与上位机通信

    文章目录 前言一 ESP8266模块与STM32连接二 单片机代码三 总结 前言 承接上文WIFI上位机部分 xff1a 上位机 通过WIFI上位机与网络调试助手通信绘制曲线 xff0c 现阶段实现了STM32单片机与ESP8266WIFI
  • Linux C++服务器项目——项目实战1(理论知识)

    牛客 C 43 43 高并发服务器开发 参考笔记 1 阻塞 非阻塞 同步 异步 网络lO 2 Unix Linux上的五种lO模型a 阻塞blockingb 非阻塞non blocking NIO c IO复用 IO multiplexin
  • 网络编程传输层——UDP通信

    何为传输层 xff1f 在物理层 数据链路层 网络层解决了主机和主机之间能够发送接收数据 xff0c 但是在计算机网络中 xff0c 主机的通信主体还是进程 xff0c 而传输层则解决应用进程的通信 xff0c 所谓传输层协议也是端对端协议
  • WiFi的原理以及正点原子WiFi模块的使用

    本文主要用于记录WiFi的部分协议 原理 xff0c 以及如何使用正点原子的WiFi模块 文章名 xff1a WiFi的原理以及正点原子WiFi模块的使用 作者 xff1a 遮瑕 注 xff1a 本文大量引用 WIFI基本知识整理 以及百度
  • STM32 - 用户自定义通讯协议

    一 自定义协议 帧头1 xff1a 0x5A 帧头1 xff1a 0xA5 命令类型 xff1a 0x01 ADC 读取电压 0x02 外部flash写入 0x03 外部flash 读取 0x04 内部flash 写入 0x05 内部fla
  • 串口通信介绍

    文章目录 1 串口通信简介 xff08 DB9接口讲解 xff09 2 串口通信基本原理 xff08 1 xff09 串口通信连线 xff08 2 xff09 串口通信时序 1 波特率 2 起始位 3 数据位 4 奇偶校验位 5 停止位 3

随机推荐

  • curl 命令详解(超详细)

    GET 请求 GET 方法是在 curl 中发出请求的默认方法 xff0c 因此不必指定任何参数 eg curl https blog ucwords com o 保存响应到文件中 curl o response tex https blo
  • Matlab 命令行显示循环显示进度条

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言一 代码二 简单说明三 测试总结 前言 闲来无事 xff0c 在用Matlab跑循环比较长的时候 xff0c 时间长 xff0c
  • Hikvison对接NVR实现WEB无插件开发包实现前端视频预览(html、vue、nginx代理)

    场景 Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 xff1a Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 霸道流氓气质的博客 CSDN博客 海康nv
  • C++ 为什么编写模板类时要把方法的实现写在头文件中,而不能像写普通类一样写在源文件中?

    1 回答标题的问题 这里说下我自己的理解 xff0c 如有不正确请各位大佬斧正 想要解决这个问题需要先了解C 43 43 代码的编译过程 C 43 43 将代码编译生成可执行文件的过程可以分为三步 xff1a 预编译 编译 链接 预编译时
  • 加速度计、陀螺仪工作原理

    加速度计 陀螺仪的工作原理 参考链接 xff1a https c miaowlabs com B07 html 陀螺仪 加速度计都是惯性测量元件的一种 而 MPU 6050 传感器的内部同时集成了陀螺仪和加速度传感器两种惯性测量元件 1 加
  • VsCode中运行C/C++

    VsCode中运行C C 43 43 1 插件 runCode2 配置环境 mingw64 1 插件 runCode 在 VsCode 中的扩展商店中 xff0c 下载插件 Code Runner 安装完成之后 xff0c 进行一些配置更改
  • 常见通信协议之UART、RS485

    UART 通用异步收发器一种通用的串行 异步通信总线 xff0c 该总线有两条数据线 xff0c 可以实现全双工的发送和接受并行通信和串行通信 总线传递数据的本质 高低电信号并行通信 一次性传输多个位 布线难度高 存在数据干扰串行通信 逐次
  • java的琐碎学习之串口通信与数据库与GUI

    RFID作业 xff0c 要求实现软硬结合 xff0c 全部使用自己的页面完成 xff1b 找了几个教程发现安卓我做不到 xff0c 就用了Java实现 xff1b 图书管理系统 可以通过写卡来绑定15693卡和书籍 xff0c 实现增删改
  • C++- #define 和 const 有什么区别?

    回答如下 xff1a 定义不同 xff1a define 是C 43 43 预处理器的指令 xff0c 用于定义宏 xff0c const是C 43 43 关键字 xff0c 用于定义常量 作用对象不同 xff1a define 定义的宏
  • HTTP协议:二.使用工具观察 HTTP 的请求和响应

    二 使用工具观察 HTTP 的请求和响应 1 HTTP 协议格式 HTTP 是一个文本格式的协议 可以通过 Chrome 开发者工具或者 Fiddler 抓包 分析HTTP 请求 响应的细节 2 抓包工具的下载和使用 直接去官网下载即可 f
  • Linux环境下的c语言编程

    vim编辑器编辑hello c vim编辑器中输入相应代码 编译 运行代码 运行结果 使用GDB函数调用 编译生成可执行文件 启动gdb 第十行设置断点并运行 gcc过程改为makefile管理 编写makefile文件 启动makefil
  • ubuntu下关于ssh远程和scp远程复制文件以及nfs搭建

    SSH远程 在Linux系统中 xff0c 通过客户端连接到远程服务器中 xff0c 方便代码地编写运行 xff0c ssh是一种安全协议 xff0c 主要用于给远程登录信息数据进行加密 1 安装ssh 2 启动ssh 3 创建要发送的文件
  • Linux环境下的多线程&多进程编程

    1 线程的创建与终止 创建一个 c文件 xff0c 使用vi编辑器进行多线程的创建 编译文件 在编译文件时会出现对 pthread create 未定义的引用 xff0c 这是由于pthread 库不是Linux系统默认的库 xff0c 连
  • 东北天坐标系转载体坐标系

    文章目录 1 基本概念1 1欧拉角1 2左乘右乘1 3东北天坐标系1 4载体坐标系1 5捷联惯性导航系统 2 通过ECEF转换到参考点附近的ENU坐标系上3 东北天坐标系到载体坐标系 1 基本概念 1 1欧拉角 欧拉旋转定理指出 xff1a
  • I2C驱动App

    1 查看eeprog c源代码 copyright C by 2009 Guangzhou FriendlyaRM in China email capbily 64 163 com website arm9 net include lt
  • Qt5.14.2 编程应用

    Qt5 14 2 编程应用 什么是Qt Qt 是一个跨平台的 C 43 43 图形用户界面库 xff0c 由挪威 TrollTech 公司于 1995 年底出品 xff0c 并于 2008年6月17日被NOKIA公司收购 xff0c 以增强
  • L298N电机驱动的使用

    L298N电机驱动的使用 前言一 介绍L298N模块简介接口介绍 二 使用步骤硬件连接软件部分1 声明部分2 代码部分 总结 前言 博主为某大学电气专业大学生 xff0c 以学习为目的写下该文 xff0c 内容主要为以51单片机为例简单介绍
  • Authorization头的作用

    Authorization头的主要用作http协议的认证 Authorization的作用是当客户端访问受口令保护时 xff0c 服务器端会发送401状态码和WWW Authenticate响应头 xff0c 要求客户机使用Authoriz
  • vscode中常用的快捷键

    分享一些本人在学习前端过程中用到的一些快捷键 xff0c 需要强调的是 xff0c 这些快捷键适用的软件是VScode 因为自己初学前端用的是这个软件 其中有一些在idea中也是适用的 xff0c 已经在括号内标注 1 alt 43 W 将
  • PID算法原理及基本实现

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