PID控制器开发笔记之四:梯形积分PID控制器的实现

从微积分的基本原理看,积分的实现是在无限细分的情况下进行的矩形加和计算。但是在离散状态下,时间间隔已经足够大,矩形积分在某些时候显得精度要低了一些,于是梯形积分被提出来以提升积分精度。

1、梯形积分基本思路

在PID控制其中,积分项的作用是消除余差,为了尽量减小余差,应提高积分项的运算精度。在积分项中,默认是按矩形方式来计算积分,将矩形积分改为梯形积分可以提高运算精度。其计算公式为:

于是如果在位置型PID算法中引入梯形积分则可以修改计算公式如下:

同样要在增量型PID算法中引入梯形积分则可以修改计算公式如下:

2、算法实现

从微积分的角度来说,当微分分到无限小时,矩形积分与梯形积分是没有区别的。但事实上我们的采样时间不可能无限小,而且也不可能是连续的,那么采样周期越大,那么矩形近似于实际曲线间的偏差就越大,而梯形积分则可以更加接近实际曲线,所以采用梯形积分代替矩形积分就可以得到更高的精度。

2.1、位置型PID算法实现

位置型PID的实现在前面就已经完成,所不同的是前面使用的是矩形积分,在这一节我们将举行积分部分改为梯形积分,同样首先定义PID对象的结构体:

/*定义结构体和公用体*/
typedef struct
{floatsetpoint;       //设定值floatproportiongain;     //比例系数floatintegralgain;      //积分系数floatderivativegain;    //微分系数floatlasterror;     //前一拍偏差floatresult; //输出值floatintegral;//积分值
}PID;

接下来实现PID控制器:

void PIDRegulation(PID *vPID, float processValue)
{floatthisError;thisError=vPID->setpoint-processValue;vPID->integral+=(thisError+ vPID-> lasterror)/2;vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);vPID->lasterror=thisError;
}

从上述实现我们不难看出,变化仅仅只是在做积分累计vPID->integral时,将累计量按梯形方式累计。

2.2、增量型PID算法实现

同样的增量型PID的梯形积分实现也就是即将积分部分有矩形积分部分换成梯形积分即可。首先定义PID对象的结构体:

/*定义结构体和公用体*/
typedef struct
{floatsetpoint;       //设定值floatproportiongain;     //比例系数floatintegralgain;      //积分系数floatderivativegain;    //微分系数floatlasterror;     //前一拍偏差floatpreerror;     //前两拍偏差floatdeadband;     //死区floatresult; //输出值
}PID;

接下来实现PID控制器:

void PIDRegulation(PID *vPID, float processValue)
{floatthisError;floatincrement;floatpError,dError,iError;thisError=vPID->setpoint-processValue; //得到偏差值pError=thisError-vPID->lasterror;iError=(thisError+vPID-> lasterror)/2;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;
}

3、总结

积分项的引入目的就是为了消除系统的余差,那么积分项的计算精度越高,对消除系统的余差就越有利。梯形积分相较于矩形积分其精度有比较大的提高,所以对消除余差也就越有效。

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SHA256 的C语言实现

前几天总结了SHA256的算法原理一文 SHA2系列的原理并不复杂,但是需要注意细节还是挺多的。不少中文博客贴出的代码都有错,这两天也踩了几个坑。 代码在这里!!!SHA256的C Code 代码实现主要依照的这个git仓库crypto-…

信息摘要算法之一:MD5算法分析及实现

MD5即Message-DigestAlgorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。 1、MD5算法简介 MD5在90年代初由…

非对称加密概述

非对称加密概述 前言 在阅读《精通比特币》的过程中,我发现比特币系统中有两个重要的概念需要利用非对称加密技术: 比特币地址的生成 交易合法性的验证 因此,我用了几天时间学习了密码学基础知识,尤其是非对称加密技术的原理…

信息摘要算法之二:SHA1算法分析及实现

SHA算法,即安全散列算法(Secure Hash Algorithm)是一种与MD5同源的数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。 1、概述 SHA算法…

2018数学建模A题的简单指导

之前写过一篇博客,介绍如何使用差分格式求解热传导方程 今天打开博客,突然发现评论区被这篇文章霸屏了 询问实验室的小伙伴才知,原来是被可爱的建模学子们攻占了 经过简单的了解,发现今年建模的A题的核心就是求解一个热传导方程…

PID控制器开发笔记之五:变积分PID控制器的实现

在普通的PID控制算法中,由于积分系数Ki是常数,所以在整个控制过程中,积分增量是不变的。然而,系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该…

使用SIFT匹配金馆长表情包

python使用opencv计算SIFT特征点的示例前言潜在的问题记录demo1:计算并绘制特征点demo2:使用SIFT匹配两幅图像参考文章地址前言 SIFT(Scale-invariant feature transform)是2004年提出的,至今已经经受住各种考验&…

PID控制器开发笔记之六:不完全微分PID控制器的实现

从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足。为了解决这个问题人们引入低通滤波方式来解决这一问题。 1、不完全微分的基…

使用Python实现简易的数据标注工具

使用Python实现简易的数据标注工具 以增加工作效率为目的,最近一直在着手构建一个AI ToolBox 这两天,我为其中的预处理工具目录添加了数据标注模块,本文所介绍内容的代码见这里 该数据标注模块包含以下几个demo gui_tkinter_exercise.py …

PID控制器开发笔记之七:微分先行PID控制器的实现

前面已经实现了各种的PID算法,然而在某些给定值频繁且大幅变化的场合,微分项常常会引起系统的振荡。为了适应这种给定值频繁变化的场合,人们设计了微分先行算法。 1、微分先行算法的思想 微分先行PID控制是只对输出量进行微分,而…

python实现视频关键帧提取(基于帧间差分)

python实现视频关键帧提取(基于帧间差分) 在很多场景下,我们不想或者不能处理视频的每一帧图片,这时我们希望能够从视频中提取出一些重要的帧进行处理,这个过程我们称为视频关键帧提取。 关键帧提取算法多种多样&…

PID控制器开发笔记之八:带死区的PID控制器的实现

在计算机控制系统中,由于系统特性和计算精度等问题,致使系统偏差总是存在,系统总是频繁动作不能稳定。为了解决这种情况,我们可以引入带死区的PID算法。 1、带死区PID的基本思想 带死区的PID控制算法就是检测偏差值,…

GPU环境配置指南(Ubuntu16.04+CUDA+CUDNN)

前言 这两天由于种种原因,反复重装系统并配置了深度学习开发环境,无意中便总结了一份环境配置指南出来,所幸再稍加整理,和大家分享出来。 本指南确认无误的环境是: 系统是Ubuntu16.04 GPU是NVIDIA GTX1070 CUDA安装8.…

在多任务(RTOS)环境中使用看门狗

最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章。从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁。为了阅读方便,有些航天领域名词本人添加了注释&#xf…

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享 一、前言 竞赛页面 团队名BugFlow,最终排名35/2157 虽然成绩一般,但是作为一支目标检测领域的新手队伍,仅仅有一块1070显卡,从零开始拿到这个排名,也算有一…

tensorflow 如何获取模型中想要的张量

当我们想要改造或者利用某一预训练模型来完成一些其它任务时,一个常用且必备的操作是从指定模型中获取到我们感兴趣的张量(tensor)。 例如我想使用一个已经训练好的CNN模型中间的某一层的结果作为特征向量来完成另一个相关任务,就…

信息摘要算法之三:SHA256算法分析与实现

前面一篇中我们分析了SHA的原理,并且以SHA1为例实现了相关的算法,在这一片中我们将进一步分析SHA2并实现之。 1、SHA简述 前面的篇章中我们已经说明过,SHA实际包括有一系列算法,分别是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-…

focal loss的几种实现版本(Keras/Tensorflow)

起源于在工作中使用focal loss遇到的一个bug,我仔细的学习多个靠谱的focal loss讲解及实现版本 通过测试,我发现了这样一个奇怪的现象,几乎每个版本的focal loss实现对同样的输入计算出的loss都是不同的。 通过仔细的比对和思考&#xff0c…

基于ARM Cortex-M和Eclipse的SWO单总线输出

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章,文章结构明晰,讲解透彻,本人深受启发,特意将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处…

包管理工具conda极简教程

包管理工具conda极简教程 conda的作用 Anaconda是目前非常流行的一个python包管理器,自带很多流行的python库,包括numpy,pandas等,当然还有conda。而Conda是一个开源的软件包管理系统和环境管理系统,用于安装多个版本…