一篇教会你 位置式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微机电健康推导算法和系统模拟优化设计

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

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

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

Windows 部署ollama

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

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…

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

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

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…

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

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

必看!微信小程序必备证书!

微信小程序必备SSL证书。在日益增长的数字经济中&#xff0c;微信小程序已成为商家与消费者之间重要的交互平台。由于其便捷性和广泛的用户基础&#xff0c;越来越多的企业选择通过小程序来提供服务。然而&#xff0c;在开发和部署微信小程序时&#xff0c;确保数据安全是一个不…

Ubuntu22.04.4 LTS系统/安装Anaconda【GPU版】

安装过程 1.wget命令行下载 下载Anaconda并保存文件至本地指定目录 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh -P ~/Downloads/anaconda3 查看是否下载好了 2.安装Anaconda 2.1 bash命令安装 bash后面是anaconda3下载好的路径 bash …

学生选课管理系统(Java+MySQL)

技术栈 Java: 用于实现系统的核心业务逻辑。MySQL: 作为关系型数据库&#xff0c;用于存储系统中的数据。JDBC: 用于Java程序与MySQL数据库之间的连接和交互。Swing GUI: 用于创建图形用户界面&#xff0c;提升用户体验。 系统功能 我们的学生选课管理系统主要针对学生和管理…

vue3源码(六)渲染原理-runtime-core

1.依赖关系 runtime-dom 依赖于runtime-core,runtime-core 依赖于reactivity和sharedruntime-core提供跨平台的渲染方法createRenderer&#xff0c;用户可以自己传递节点渲染的渲染方法renderOptions&#xff0c;本身不关心用户使用什么APIruntime-dom提供了为浏览器而生的渲染…

MSI打包后门成安装包

目录 浏览器下载地址 启动>next 选择后门所在路径&#xff0c;和生成安装包后存放路径 next>Hidden 配置变量 Look up随便找个伪装&#xff0c;然后点击一下Creat New ​注册表Registry导入 ​点击否&#xff0c;不购买专业版 ​安装包生成成功​编辑 浏览器下…

(自用)共享单车服务器(一):服务器项目配置

项目目录结构 conf:用来存放配置文件 git:用来存放从git上克隆的项目 src:用来存放项目源文件 test:用来存放测试文件 third:用来存放第三方头文件、第三方库 安装iniparser(关于iniparser的使用需进一步学习) 1.项目目录中创建git文件夹&#xff0c;用于存放GitHub上克隆…

计算机网络-IGMPv1工作原理简介

一、IGMPv1的原理简介 前面我们大致了解了IGMP用于在连接组播组成员的组播路由器总通过交互IGMP报文生成IGMP组表项和IGMP路由表项。IGMP报文封装在IP报文中。到目前为止&#xff0c;IGMP有三个版本&#xff1a;IGMPv1、IGMPv2、IGMPv3。 今天主要学习IGMPv1的作用和工作原理。…

深度学习论文: LLaMA: Open and Efficient Foundation Language Models

深度学习论文: LLaMA: Open and Efficient Foundation Language Models LLaMA: Open and Efficient Foundation Language Models PDF:https://arxiv.org/pdf/2302.13971.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 本文介绍了LLaMA&#xff0…

数据开源 | Magic Data大模型高质量十万轮对话数据集

能够自然的与人类进行聊天交谈&#xff0c;是现今的大语言模型 (LLM) 区别于传统语言模型的重要能力之一&#xff0c;近日OpenAI推出的GPT-4o给我们展示了这样的可能性。 对话于人类来说是与生俱来的&#xff0c;但构建具备对话能力的大模型是一项不小的挑战&#xff0c;收集高…