用Excel教会你PID算法!

2023-05-16

01

引入PID

电机控制

这样是没有反馈的,也就是说我们完全相信输入的数字,且是理想化的模型,比如输入占空比为50%的25Kz的PWM,车轮速度为1m/s,实际产品中会受到各种这样的影响,比如地面阻力,风阻等等,同样输入占空比为50%的25Kz的PWM,车轮的速度并不是1m/s。

这时候我们就引入测量单元,也就是反馈系统。

这个时候,最常见的反馈就是:直接使用反馈值。简单的例子,属于数值X和输出数值y的数学公式是:y=2x,这是这最见的关系。假设我们输入7,测量结果是5,那么我们就直接将输入修改为7+2*(7-5)=11。也就是我们一次直接调整到位。这样调节过于简单粗暴,因为我们直接将输入修改为11,有可能输出直接变成6,超过预期值了。这时候就自然而然的想到多次调节,每次只增加一点,然后测量速度,看一下是否达标。

这就是比例调节Kp

02

比例调节

举例说明,当前小车速度为0.2,目标速度是1。输出y和输入x的关系是y=1*x。比例系数Kp=0.5。随着时间的增大,输出和输入关系如下。

直观折线图显示如下

我们发现这太完美了,那么比例环节就能够完美的解决问题了,可是等等,在下这个结论前,我们忽略一个特因素:噪声误差。

在很多系统中都是有噪声的,这我们举例小车中,噪声误差可能来自于电机的误差,外部因素风阻等误差,且是波动的。我们将问题简化,假设外部因素恒定,外部因素是的小车实际输出速度减去1。

还是上面的例子,当前小车速度为0.2,目标速度是1。输出y和输入x的关系是y=1*x。比例系数Kp=0.5,恒定的误差为-0.1,随着时间的增大,输出和输入关系如下。

直观折线图显示如下

最终输出稳定在0.8,因为我们初始值为0.2,到最后和目标差值是0.2,补偿是0.1,误差正好是-0.1,也就是说等于我们没有补偿。

如果我们需要速度达到1呢???办法就是增大比例系数Kp。

误差为0.8时

误差为1.9时

误差为2时,已经完全震荡

结论:比例控制引入了稳态误差,且无法消除。比例常数增大可以减小稳态误差,但如果太大则引起系统震荡,不稳定。

03

积分调节

为了消除稳态误差,第二次加入积分,使用PI(比例积分控制),积分控制就是将历史误差全部加起来乘以积分常数。公式如下:

u(t) -------------输出曲线,pid输出值随时间的变化曲线

Kp --------------比例系数

e(t)--------------偏差曲线,设定值与实际值的偏差随时间的变化曲线

t-----------------时间

关于定积分,如果你上过高数,且没有睡觉的话。

需要将数学公式离散化,才能用到计算机系统来。

①表示在时间点t,输出的值

②表示在时间点t,输出的误差

③表示从时间0到t,累计误差。

添加Ki参数之后的折线图如下

结论:

只要存在偏差,积分就不停的累计,直到误差为0,积分项不再累加,变成一个常数,可以抵消稳态误差.

04

微分调节

引入积分可以消除稳态误差,但会增加超调,且Ki增大,超调量也增大.

为了消除超调,我们引入微分作用

积分就是e(t)曲线的斜率。

将公式离散化为

ek是当前误差,ek-1是上一次误差,所以①就是误差曲线的斜率。

关于PID公式还有其他写法,本质是一样的

离散化后是

u(t) -------------输出曲线,pid输出值随时间的变化曲线

Kp --------------比例系数

e(t)------------- 偏差曲线,设定值与实际值的偏差随时间的变化曲线

Ti--------------- 积分时间

Td--------------微分时间

T----------------调节周期

那么PID的参数如下

将前面的示例,加入微分项,Ki=0.3。

折线图如下

结论:微分能够减弱超调趋势

05

总结

PID调节示意图如下

可以发现:

比例项是纠正偏差的主力,越远离偏差绝对值就越大,快速把偏差纠正回来。

积分项和以往的状态有关,面积的绝对值越大它的绝对值就越大,它的作用是消除累计偏差。

微分项跟斜率有关,比较难解释,总的来说它的作用是:当目标靠近设定值时加速它靠近,当目标远离设定值时阻止它远离。因此微分可以增加系统稳定性,因为到达目的之后,离开会受到阻碍。

06

增量PID

上面我们讲解的是位置PID,还有一种增量PID,输出的不是目标值,而是与上次值的差值。直观上将就是u(t)-u(t-1)。

那么u(t)-u(t-1)的公式是

位置型PID控制器的基本特点:

  1. 位置型PID控制的输出与整个过去的状态有关,用到了偏差的累加值,容易产生累积偏差。

  2. 位置型PID适用于执行机构不带积分部件的对象。

  3. 位置型的输出直接对应对象的输出,对系统的影响比较大。

增量型PID控制器的基本特点:

  1. 增量型PID算法不需要做累加,控制量增量的确定仅与最近几次偏差值有关,计算偏差的影响较小。

  2. 增量型PID算法得出的是控制量的增量,对系统的影响相对较小。

  3. 采用增量型PID算法易于实现手动到自动的无扰动切换。

07

代码编程

位置PID

/*******************************************************************
位置式pid    
********************************************************************/
double PID(double Actual,double SET)
{     
  static double E_sum,Error_last;          //上一次误差  


  double  kp=20.767,ki=1.867,kd=115.55;


  double pid_out;
  double Error_now;          //当前误差  
   Error_now = SET-Actual;               //当前误差    
//  if(Error_now>-0.9&&Error_now<0.9)    //防静态误差  
//  {
//       Error_now=0;
//         Error_last=0;
//  }  
    E_sum +=  Error_now;                       //误差累计     
//  if(E_sum>484)E_sum=484;          //积分限幅度,防止积分饱和
//  if(E_sum<-484)E_sum=-484;  


  pid_out= kp * Error_now + ki * E_sum + kd * (Error_now-Error_last);            //pid计算公式      
  Error_last=Error_now;


//  if(pid>900)  pid=900;             //输出限幅
//  if(pid<-900)pid=-900;    
     return -pid_out;          
}

增量PID

error = target_speed - current_speed;
P_error = error;
I_error = error - left_motor.L_error;
D_error = error - 2*left_motor.L_error + left_motor.LL_error;


add = (s16)(KP * P_error + KI * I_error + KD * D_error);
left_motor.ESC_output_PWM += add;


left_motor.LL_error = left_motor.L_error;
left_motor.L_error = error;

excel文件下载:

下载链接:https://pan.baidu.com/s/11FkopQg5iBeLSu_1j8YD1Q 

提取码:5ohs

1.嵌入式系统已经进入了算力时代~

2.你在疯狂屯货,他在悄悄出货,MCU市场上演孙子兵法

3.手把手教你在STM32F4上跑freeRTOS!

4.嵌入式大会演讲人征集:嵌入式AI、RISC-V、物联网、OS与软件测试

5.0Ω电阻可以过多大电流?

6.电路板上的晶振不工作怎么办?

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

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

用Excel教会你PID算法! 的相关文章

  • 将包含宏的工作簿复制到不带宏的工作簿

    我能够复制工作簿 复制到所需位置 其中在后台包含宏 该副本还包含相同的宏 我的问题是我不希望这个重复的工作簿包含宏 谁能告诉怎么做吗 先感谢您 将您的工作簿保存为无宏 即简单地保存为 Excel 工作簿 对于我的 Excel 2007 这是
  • VBA ByRef 参数类型不匹配

    最初在我的主代码部分中 我有一个丑陋的 if 语句 尽管它会运行丑陋 我决定将其设为我要调用的函数 这导致我收到错误 编译错误 ByRef 参数类型不匹配 我的假设是该函数需要正确引用 尽管我一直在阅读文档并且不明白为什么 gt 声明 Sh
  • 在Excel中,我可以使用超链接来运行vba宏吗?

    我有一个包含多行数据的电子表格 我希望能够单击一个单元格 该单元格将使用该行中的数据运行宏 由于行数总是在变化 我认为每行的超链接可能是最好的方法 ROW MeterID Lat Long ReadX ReadY ReadZ CoeffA
  • 无法使用 VBA 代码从 Excel 连接到 Teradata - 无法通过网络访问 Teradata 服务器

    我一直在尝试使用 vba 代码从 Excel 连接到 Teradata 但收到以下错误 无法通过网络访问 Teradata Server 我已经能够从 Teradata SQL 助手成功连接 并且还成功 ping 通 Teradata 服务
  • 使用PHP从doc、xls文件中读取数据

    我想知道是否可以从 doc 和 xls 文件中读取数据并将 将内容读取到图像文件中 创建文档的页面样本 例如 我有一些文件希望我的客户购买 所以我需要自动创建小图像 例如我的文档样本 我们将不胜感激您的帮助 对于读取 xls 文件 我真的推
  • 在 Excel 中自动复制和粘贴特定范围的最佳方法是什么?

    我对 VBA 非常陌生 我想自动化一项任务 但不知道从哪里开始 我有一个如下所示的数据集 样本数据 https i stack imgur com jxqFI png 我想做的是循环遍历 A 列 如果其中有内容 始终是电子邮件 请选择所有行
  • 数据透视表错误 |无效的调用或过程

    我需要一些帮助来解决这个问题 我正在尝试创建一个数据透视表 从第一季度开始 在同一张表中包含一系列数据 第一个 if 语句在那里是因为最后一列并不总是包含标题 所以我将其包含在那里 我希望范围是动态的 因为所制作的表格的大小将根据工作表中数
  • 在工作表中合并行和求和值

    我有一个 Excel 工作表 其中包含以下数据 管道 来分隔列 A B C X 50 60 D E F X 40 30 A B C X 10 20 A B C Y 20 20 A B C X 20 70 D E F X 10 50 A B
  • 从Excel工作表中读取汉字? (总是返回“???”)

    如何从Excel单元格中读取汉字并将其写入文件 当我取值时 Worksheets ActiveCell Worksheet Name Cells 3 columnNumbers 0 value 它总是返回 Dim fileStream Fi
  • Excel 2007 从 C# get_Value 始终返回 -2146826265

    我有一个引用 Microsoft Excel 12 0 对象库的小型 C 应用程序 除此之外 它还从 Excel 单元格读取值 它从一些较旧的 Excel xls 文件和一些 2007 文件 xlsx 中读取此值 所有 xls 文件的值都会
  • Python在没有pandas的情况下解码excel表

    我正在尝试在 python 中读取 excel 文件而不使用pandas or xlrd 我一直在尝试将结果转换为bytes to utf 8没有任何成功 xls 文件中的数据 colA colB colC spc 1D0 20190705
  • Office 365 中 Excel 中 Power Pivot 的计算列中正确的 DAX GROUPBY 语法是什么

    将以下语法输入到下面在 Excel Office 365 版本 的 powerpivot 中提供的表 Visits 的计算列公式中 GROUPBY Visits Patient Name First Visit Date MINX CURR
  • 删除 VBA 按钮集合

    我正在使用以下脚本在 Excel 中生成按钮 范围正是我希望放置它的位置 Sub CreateAddButton rng As Range Dim btn As Button With Worksheets User Set btn But
  • 从Excel单元格中提取固定长度的数字

    一些类似名称的线程 但仍然无法解决我的问题 我需要从 Excel 字符串中提取固定长度的 NUMBER 值 在我的场景中为 8 位数字 为此目的提供了以下 Excel 公式 MID A1 FIND SUBSTITUTE SUBSTITUTE
  • 有没有办法使用 Python Pandas 读取所有行,直到遇到空行

    我在 Excel 中有很多行 并且这些行在空行之后填充有垃圾值 有没有办法使用 Python pandas 只读取 Excel 中第一个空行之前的记录 我不知道 read excel 是否可以做到这一点 如果您从 Excel 导入空行 这些
  • Python循环遍历Excel工作表,将工作表名称添加到列表中,然后连接所有

    我正在循环遍历 Excel 工作表并将它们附加到列表中 循环完成后 我使用 Pandas 连接到单个数据帧 我遇到的问题是将工作表名称添加到适当的列表中 infile is a filepath variable xls xlrd open
  • python XlsxWriter 设置多个单元格周围的边框

    I need an easy way to set border around multiple cells like so 我发现的只是 1 个单元格的边框 并合并单元格 这不是我需要的 我期待类似的事情 worksheet range
  • 有什么办法可以加快这个 VBA 算法的速度吗?

    我正在寻找实现 VBAtrie http en wikipedia org wiki Trie 构建能够在相对较短的时间内 少于 15 20 秒 处理大量英语词典 约 50 000 个单词 的算法 由于我实际上是一名 C 程序员 这是我第一
  • Excel VSTO 工作簿新活动

    在 Excel 2007 的一个 Excel 插件项目中 我需要检查创建新工作簿的事件 我还需要捕捉 Workbook Open 事件 我很容易做到这一点 在我在互联网上的研究中 我发现了以下内容 打开任何工作簿时都会引发 Applicat
  • 错误: 无法使用“localhost:10.0”作为 DISPLAY 变量的值连接到 X11 窗口服务器

    我有 2 个应用程序运行良好 除了 1 个功能的生产环境之外 此功能是从简单表格生成 Excel 在我的所有其他环境中 Excel 的生成都可以 但是当我尝试在生产环境中使用它时 我在日志中遇到了这个错误并且很顽皮错误500在我的应用程序上

随机推荐

  • Bash 中的 ${} 和 $() 有什么区别

    像 Linux 这样的基于 GNU 的操作系统依赖于一个名为 Bash 的命令语言解释器或 Shell 来完成它们的大部分计算任务和目标 Bash 是 Bourne Again Shell 的缩写 xff0c Bunne Again She
  • Go 服务端开发,请牢记这几条

    服务端开发一般是指业务的接口编写 xff0c 对大部分系统来说 xff0c 接口中CURD的操作占了绝大部分 然而 xff0c 网络上总有调侃 CURD工程师 的梗 xff0c 以说明此类开发技术并不复杂 但我个人认为 xff0c 如果仅仅
  • 域格4G模块串口开机自动透传的使用

    首先要求是模块版本为串口自动透传版本 1 模式切换 从透传模式切换至临时指令模式的时序 xff1a 1 串口设备给模块 连续发送 43 43 43 xff0c 模块收到 43 43 43 后 xff0c 会给串口设备发送一个 a 在发送 4
  • 网红送餐无人车冒充AI,真人海外远程操控

    美国网红外卖机器人Kiwibot实际由远在南美哥伦比亚的真人远程操控 xff0c 每人时薪不到2美元 xff0c 最多控制三台 2017年成立的Kiwi Campus公司累计获得200万美元融资 xff0c 约人民币1414万元 xff0c
  • 国产开源基础软件MiniGUI宣布支持RT-Thread!

    北京飞漫软件技术有限公司宣布 xff1a 将在 MiniGUI 4 0 2 版本中支持国产操作系统 RT Thread xff01 这是自 MiniGUI 创始人魏永明在本月初宣布启动 1998 年年底 xff0c 魏永明开始在清华大学开发
  • 既然C编译器是C语言写的,那第一个C编译器是怎样来的?

    来源 xff1a 伯乐在线 xff0c 作者 xff1a Chaobs 首先向C语言之父Dennis Ritchie致敬 xff01 当今几乎所有的实用的编译器 解释器 xff08 以下统称编译器 xff09 都是用C语言编写的 xff0c
  • Oracle推出全球首个自治操作系统~

    原创 xff1a 程序员的那些事 xff08 id xff1a iProgrammer xff09 导读 xff1a 保持系统的修补和安全是 IT 部门目前面临的最大挑战之一 在大规模云环境中 xff0c 此类任务乏味 容易出错 xff0c
  • 基于Autosar的网络安全理解

    目录 1 车载网络安全说明 2 常用的安全加密算法 2 1 对称加密 2 2 非对称加密 2 3 混合加密 2 4 单向散列函数 2 5 消息认证码 2 6 数字签名 3 Autosar的加密模块 3 1 模块说明 3 2 关键数据流说明
  • Linux实用程序——Make快速入门

    1 Make make 是 linux 系统的实用程序 它用于管理对于大型程序的自动编译任务 xff0c 自动决定程序某一部分需要重新编译 xff0c 并发出编译指令 虽然 xff0c 我们最常见于 C 语言程序的编译 但是 xff0c m
  • 干货!学习STM32的一些经验分享

    前言 前两天在群里看到群友们在讨论学习STM32的话题 xff0c 并且今天也有一位机械专业的准研究生读者也问了STM32的入门问题 正好我也有一点点经验 xff0c 所以试着分享一下这个话题 我也不是什么大神 xff0c 只是一名普通的工
  • 为什么买了开发板只能吃灰,还是学不会嵌入式?

    经常有同学问我 xff1a 老师 xff0c 我想学嵌入式 xff0c 应该买哪个板子 xff1f 这个问题本身就是错的 如果你去问10个买过开发板的人 xff0c 至少有8个最终都吃灰了 xff0c 而且他也没通过这个板子以及板子附带的所
  • 基于LiteOS的智慧农业案例实验分享!

    最近在指导一位读者朋友做毕业设计 xff0c 该毕设是关于端云互通的 xff0c 基于小熊派 43 LiteOS 43 华为云 在指导他的过程中我也学到了不少东西 xff0c 这里通过一个案例实验 xff08 智慧农业 xff09 给大家分
  • 漫谈C变量—为什么嵌入式项目中常用静态变量?

    在C语言中 xff0c 按照生命周期来分 xff0c 变量只有两类 xff1a 静态变量和动态变量 其中 xff0c 静态变量是指 xff0c 在编译时刻 xff08 Compiling time xff09 变量的地址和大小都已经确定下来
  • 10月1日后,GitHub用main替代master

    转自 xff1a 开源中国 GitHub 官方表示 xff0c 从 2020 年 10 月 1 日起 xff0c 在该平台上创建的所有新的源代码仓库将默认被命名为 34 main 34 xff0c 而不是原先的 34 master 34 值
  • C++在嵌入式中表现如何?

    这是知乎嵌入式领域的一个热门话题 xff0c 原文链接 xff1a https www zhihu com question 374663834 几个高赞回答 xff1a idea4good xff1a 先说结论 xff1a 嵌入式 单片机
  • 选微处理器MPU,还是单片机MCU?

    每项新应用设计都需要一个单片机或微处理器 当在两者之间选择其一时 xff0c 需要考虑一些因素 以下是微处理器 单片机的概述和对比 考虑选择微处理器 MPU 或者单片机 MCU 时 xff0c 应用类型通常是关键因素 另一方面 xff0c
  • 图解FreeRTOS 原理系列之任务管理器基本框架!

    导读 学习梳理一下FreeRTOS任务管理单元实现思路 xff0c 代码分析基于V10 4 3 从本文开始计划写个图解freeRTOS内核系列笔记分享给朋友们 xff0c 希望大家喜欢 本文主要学习梳理FreeRTOS任务管理器的基本原理
  • 一文带你快速理解FreeRTOS代码规范~

    导读 遇到些朋友感觉FreeRTOS内核代码看起来很不习惯 xff0c 不习惯其编码风格 xff0c 本文就来梳理一下其代码规范 xff0c 便于提高阅读其代码的效率 代码基于FreeRTOS V10 4 3 FreeRTOS代码结构 其内
  • [Adaptive Autosar]深入理解--Persistency

    目录 1 Per架构 2 Per初始化 3 Per错误处理 4 多进程访问 5 冗余存储 6 安装和更新per数据 7 Key Value 方式 8 file storage 方式 9 典型使用代码 Persistency模块对比 CP 中
  • 用Excel教会你PID算法!

    01 引入PID 电机控制 这样是没有反馈的 xff0c 也就是说我们完全相信输入的数字 xff0c 且是理想化的模型 xff0c 比如输入占空比为50 的25Kz的PWM xff0c 车轮速度为1m s xff0c 实际产品中会受到各种这