一篇教会你 位置式PID 在写码中的应用。

                          前言:编写不易,仅供学习,参考,谢谢理解,请勿转载。

#位置式|增量式PID区别

        本系列的前两篇讲的是位置式PID  没有增量式  PID ,PID的变种有很多,常见的有  位置式PID  增量式PID   PI   PD  抗饱和PID  微分先行PID  自适应PID  模糊PID 这些都是PID算法的类型。

       位置式PID;这种PID算法应用在闭环系统中,输出影响下得到的值是新的输入值,这个新的输入值就是对整个闭环系统总共的作用量

                                公式:PID=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]

        增量式PID:顾名思义,增量式PID计算得出的值,是增量,是系统输入量的基础上再增加的量,增量并不是直接作用在闭环系统的值,这个值需要加上闭环系统原本的输入量,才是作用于闭环系统的输入值。

                                公式:PID=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]

        这两个公式Kp  还有Kd  是不一样的,如果在代码里面看到,计算相同的代码,就知道是增量式PID  还是位置式PID。

#位置式PID相关变量命名

         首先在闭环控制系统中,有期望值  目前值  还有差值,声明  期望值   和  目前值  差值   还有给 PID中的  P算法   I算法  D算法  先声明三个变量。

extern float Velcity_Kp,Velcity_Ki,Velcity_Kd;

          这里只讲位置式PID的代码,在位置式PID函数的作用下是一个闭环控制系统,也就是输出对输入有影响, CurrentVelocity 就是输出,那么这个值对输入有影响, CurrentVelocity 这个值要写到PID函数里面才能有影响,然后这个控制系统根据与 TargetVelocity 的差值,会产生一个新的输入值是 Control_Velocity,同理重复循环,形成了一个闭环控制系统,结论,TargetVelocity  Control_Velocity   是PID的参数之一。

int Control_Velocity;//  经过PID系统,新的作用系统的输出值。
 int CurrentVelocity ; //实际目前速度
int TargetVelocity;//目标速度

        同时 TargetVelocity  这个值,与 CurrentVelocity  进行比较的,计算出差值,这个差值经过PID算法后产生新的 Control_Velocity ,也就是说Error。这个参数也是PID控制系统所需要的。 

int Error;
Error = TargetVelocity - CurrentVelocity;//期望速度与目前速度的差值。

  

       

        同时 Kp  Ki  Kd 这三个变量因为组成了PID算法函数,是必须给数值的,同时调节PID参数也是调节这三个值的参数。从而达到更好的控制系统表现。

//定义PID参数
#define Kp  1.0
#define Ki  0.0
#define Kd  0.0

        前两篇讲解了,纯理论公式,同时也知道了,PID算法 由P算法(Kp)    比例   I算法(Ki)  积分  D算法(Kd)   微分   组成,实际应用中,更多的是使用这三种算法的组合形式,PI  PD  PID  。

        由于 D算法(Kd),是两次误差的值,如果差值过大,Kd也就越大对Kp的抑制也就越大,需要有三个参数,上次误差Last_Error,和Error,还有 derivate

        由于Ki算法,是对误差的累加算法,需要对其进行限制幅,这里需要两个参数  Ki_Max Ki*integral    因为是位置式PID 需要对Ki进行限幅度 ,如果是增量式PID 需要对输出限幅,同时Ki也就是积分是累加的,是用 integral(积分),进行命名。

        同时Kp算法,使用参数比较少,只需要Error,前面已经声明过了,到了这里,已经讲解了,位置式PID,需要用到的参数,如果像上面一个一个声明,太麻烦了,直接定义结构体,更好一点。下面定义结构体。

typedef struct //定义结构体参数
{float Velcity_Kp;float Velcity_Ki;float Velcity_Kd;float Error;float Last_Error;float integral;float derivate;int Control_Velocity;
}PID;

#相关PID组合函数进行编写

PID初始化函数编写

void PID_Init(PID*pid,float Velcity_Kp ,float Velcity_Ki,float Velcity_Kd)
{pid->Velcity_Kp = Velcity_Kp;pid->Velcity_Ki = Velcity_Ki;pid->Velcity_Kd = Velcity_Kd;pid->Error = 0;pid->Last_Error = 0;pid->integral = 0;pid->Control_Velocity = 0;pid->derivate = 0 ; 
}
//这里声明一个指针,然后对一个结构体 取地址& 代表要初始化的实例 

        首先定义初始化函数,用来对PID结构体里面的所有成员变量进行初始化,同时传入#define  kp | ki  | kd  的值,

        到这里将,前面所有讲解的代码整合,应该是这个样子的。

PI组合函数

        到了这一步还需要再声明一个函数,用来运行PID返回计算结果。

float   PID_Calculate (PID*pid,float Velcity_Kp ,float Velcity_Ki ,float Velcity_Kd )
{pid->Error    = pid->Current_Velocity  - pid->TargetVelocity;pid->integral +=pid->Error;pid->Control_Velocity  = pid->Velcity_Kp*pid->Error + pid->Velcity_Ki*pid->integral;     pid->Last_Error = pid->Error; return pid->Control_Velocity;}

PD组合函数

float   PID_Calculate (PID*pid,float Velcity_Kp ,float Velcity_Ki ,float Velcity_Kd )
{pid->Error    = pid->Current_Velocity  - pid->TargetVelocity;pid->derivate = pid->Error - pid->Last_Error;pid->Control_Velocity  = pid->Velcity_Kp*pid->Error  +pid->Velcity_Kd*pid->derivate;     pid->Last_Error = pid->Error; return pid->Control_Velocity;}

PID组合函数

float   PID_Calculate (PID*pid,float Velcity_Kp ,float Velcity_Ki ,float Velcity_Kd )
{pid->Error    = pid->Current_Velocity  - pid->TargetVelocity;pid->integral +=pid->Error;pid->derivate = pid->Error - pid->Last_Error;pid->Control_Velocity  = pid->Velcity_Kp*pid->Error + pid->Velcity_Ki*pid->integral +pid->Velcity_Kd*pid->derivate;     pid->Last_Error = pid->Error; return pid->Control_Velocity;}

        PID本身就是一个应用在 云台  编码电机上的东西,单讲PID不讲应用在云台或者电机,意义不大,本篇今天收藏过30,两天内立即更  PID应用在舵机云台,编码电机,附带调试细节,附带源码。

        最后整体程序是下图这个样子

//定义PID参数
#define Kp  1.0
#define Ki  0.0
#define Kd  0.0typedef struct //定义结构体参数
{float Velcity_Kp;float Velcity_Ki;float Velcity_Kd;float Error;float Last_Error;float integral;float derivate;int Control_Velocity;
}PID;void PID_Init(PID*pid,float Velcity_Kp ,float Velcity_Ki,float Velcity_Kd);int main()
{PID  servo;//声明PID 结构体 变量PID_Init(&servo,Kp,Ki,Kd);//这几个宏定义在PID.h文件里面。
while (1){int output = PID_Calculate(&servo,0,180);setAngle(0,output);}
}void PID_Init(PID*pid,float Velcity_Kp ,float Velcity_Ki,float Velcity_Kd)
{pid->Velcity_Kp = Velcity_Kp;pid->Velcity_Ki = Velcity_Ki;pid->Velcity_Kd = Velcity_Kd;pid->Error = 0;pid->Last_Error = 0;pid->integral = 0;pid->Control_Velocity = 0;pid->derivate = 0 ; 
}

                欢迎指正,希望对你,有所帮助!!!

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

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

相关文章

PHP7.4安装使用rabbitMQ教程(windows)

(1),安装rabbitMQ客户端erlang语言 一,erlang语言安装 下载地址1—— 下载地址2——https://www.erlang.org/patches/otp-27.0 二,rabbitMQ客户端安装 https://www.rabbitmq.com/docs/install-windows &#xff08…

PTC可复位保险丝 vs 传统型保险丝:全面对比分析

PTC可复位保险丝,又称为自恢复保险丝、自恢复熔断器或PPTC保险丝,是一种电子保护器件。它利用材料的正温度系数效应,即电阻值随温度升高而显著增加的特性,来实现电路保护。 当电路正常工作时,PTC保险丝呈现低阻态&…

昇思25天学习打卡营第1天|小试牛刀

这里写自昇思25天学习打卡营第1天|小试牛刀定义目录标题 昇思25天学习打卡营第1天学习了初学入门之基本介绍。了解了昇思MindSpore和华为昇腾AI全栈。训练营中的教程丰富,有初学入门、应用实践和量子计算等。学习打卡营是很好的提升自己的机会。 昇腾计算&#xff…

Python和MATLAB微机电健康推导算法和系统模拟优化设计

🎯要点 🎯惯性测量身体活动特征推导健康状态算法 | 🎯卷积网络算法学习惯性测量数据估计六自由度姿态 | 🎯全球导航卫星系统模拟,及惯性测量动态测斜仪算法、动态倾斜算法、融合算法 | 🎯微机电系统加速度…

python图形用户界面和游戏开发_day010

python图形用户界面和游戏开发 基于tkinter模块的GUI使用Pygame进行游戏开发在窗口中绘图加载图像实现动画效果碰撞检测事件处理 基于tkinter模块的GUI GUI是图形用户界面的缩写,图形化的用户界面对使用过计算机的人来说应该都不陌生,在此也无需进行赘述…

深入解析大数据核心概念:数据平台、数据中台、数据湖与数据仓库的异同与应用

大数据领域内的诸多概念常常让人困惑,其中数据平台、数据中台、数据湖和数据仓库是最为关键的几个。 1. 数据平台 定义: 数据平台是一个综合性的技术框架,旨在支持整个数据生命周期的管理和使用。它包含数据采集、存储、处理、分析和可视化…

上传图片,base64改为文件流,并转给后端

需求&#xff1a; html代码&#xff1a; <el-dialog v-model"dialogPicVisible" title"新增图片" width"500"><el-form :model"picForm"><el-form-item label"图片名称&#xff1a;" :label-width"10…

使用Python进行自然语言处理

哈喽,大家好,我是木头左! 自然语言处理(Natural Language Processing,NLP)是人工智能领域的一个重要分支,它致力于使计算机能够理解、分析和生成人类语言。随着大数据和深度学习的发展,NLP在各个领域都有广泛的应用,如机器翻译、情感分析、文本摘要等。本文将介绍如何…

Windows 部署ollama

一、简介 Ollama是在Github上的一个开源项目&#xff0c;其项目定位是&#xff1a;一个本地运行大模型的集成框架&#xff0c;目前主要针对主流的LLaMA架构的开源大模型设计&#xff0c;通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中&#xff0c;从而实现大模…

模型需要从txt中长文本中精准提炼出来文字

需要从txt中长文本中精准提炼出来文字&#xff0c;比如&#xff1a;文本&#xff1a;BERT 是由 Google 提出的预训练语言模型&#xff0c;具有出色的上下文理解能力。可以用于命名实体识别 (NER)、文本分类和问答系统等任务。问题&#xff1a;BERT能完成什么任务&#xff1f;输…

Mysql ORDER BY是否走索引?

在 MySQL 中&#xff0c;ORDER BY 子句是否使用索引取决于多种因素&#xff0c;包括查询的具体情况、索引的类型和结构、查询中的其他条件等。 使用索引的情况 单列索引和 ORDER BY&#xff1a; 当 ORDER BY 子句中的列有单列索引时&#xff0c;MySQL 可以利用该索引来加速排序…

imx6ull/linux应用编程学习(15) 移植MQTT客户端库/测试

1. 准备开发环境 确保你的Ubuntu系统已经安装了必要的工具和依赖项。打开终端并运行以下命令&#xff1a; sudo apt update sudo apt install build-essential cmake git2. 获取MQTT库 git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt.c3. 编译MQTT库 mk…

iOS 开发中,异步渲染和异步绘制

在 iOS 开发中&#xff0c;异步渲染&#xff08;Asynchronous Rendering&#xff09;和异步绘制&#xff08;Asynchronous Drawing&#xff09;虽然有相似之处&#xff0c;但它们并不是完全相同的概念。 异步渲染&#xff08;Asynchronous Rendering&#xff09; 异步渲染主要…

【SVN的使用- SVN的基本命令-SVN命令简写-注意事项-解决冲突 Objective-C语言】

一、SVN的更新命令:update 1.服务器如果新建了一个文件夹,yuanxing,版本变成6了, 我现在本地还只有三个文件夹,版本5, 终端里边,我们敲一个svn update, 我这儿就多了一个yuanxing文件夹, 这个就是更新,就是把服务器最新的代码下载下来, 假设服务器上大家提交了这…

react VS vue

什么是react 用于构建用户界面的js库 什么是vue 用于构建用户界面的渐进式js库 react是基于mvvm设计还是mvc设计 1、react是基于mvc设计的&#xff0c;但也不是完整的mvc模式 2、react把自己定义为view 3、组件逻辑定义为Controller层 4、虽然react不是完整的mvc模式&a…

KNIME 5.2.5 版本界面切换

1、安装完KNIME后&#xff0c;点击“Create workflow in your local space.” 2、发现是这个样子 4、进行切换。点击“menu”&#xff0c;最后点击“Switch to classic user interfaceto” 5、最终显示结果&#xff1a;

补光灯LED照明 2.7V4.2V5V升60V80V100V升压恒流芯片IC-H6902B

H6902B升压恒流芯片IC确实是一款为LED照明应用设计的稳定且可靠的解决方案。这款芯片具有以下几个显著特点&#xff1a; 高效率&#xff1a;效率高达95%以上&#xff0c;这意味着在驱动LED灯时&#xff0c;电源到LED的能量转换效率非常高&#xff0c;减少了能量损失&#xff0…

代码随想录算法训练营:30/60

非科班学习算法day30 | LeetCode452:用最少数量的箭引爆气球 &#xff0c;Leetcode435:无重叠区间 &#xff0c;Leetcode763:划分字母区间 介绍 包含LC的两道题目&#xff0c;还有相应概念的补充。 相关图解和更多版本&#xff1a; 代码随想录 (programmercarl.com)https:/…

centos磁盘空间满了-问题解决

报错问题解释&#xff1a; CentOS系统在运行过程中可能会出现磁盘空间不足的错误。这通常发生在以下几种情况&#xff1a; 系统日志文件或临时文件过大导致磁盘空间不足。 安装了大量软件或文件而没有清理无用文件。 有可能是某个进程占用了大量磁盘空间。 问题解决方法&a…

多服务下,服务与服务之间的调用(SpringCloudAlibaba入门一)

多服务下&#xff0c;服务与服务之间的调用&#xff08;SpringCloudAlibaba入门一&#xff09; 说明直接看代码 说明 在SpringBoot情况下&#xff0c;如果我们有多个子模块而且代码之间没有相互引用&#xff0c;那么子项目与子项目之间的调用方式就只能通过http请求的方式去调用…