当前位置: 首页 > news >正文

STM32_PID通用算法增量式和位置式

STM32_PID通用算法增量式和位置式

前言:
此算法为入门级PID算法,调试好参数后可应用于温度控制、舵机控制、直流电机的转速控制和直流电机的角度控制等等,下面就以温度控制举例

pid.c

#include "pid.h"
#include "sensor.h"
#include "dev_control.h"
#include "usbd_cdc_if.h"pidTypeDef_t  heatTemp_pid = {0};
pidPID_t tempPID = {0};void pidInit(void)
{tempPID.KP = 15;						//比例常数tempPID.KI = 0;							//积分常数tempPID.KD = 0.1;						//微分常数heatTemp_pid.PidMode = 0;				//使用增量式PIDheatTemp_pid.SetPoint = 0;       		//设定目标值heatTemp_pid.ActualValue = 0.0;  		//期望值输出heatTemp_pid.SumError = 0.0;     		//积分值heatTemp_pid.Error = 0.0;        		//当前偏差值heatTemp_pid.LastError = 0.0;    		//上次偏差值heatTemp_pid.PrevError = 0.0;    		//上上次偏差值heatTemp_pid.Proportion = tempPID.KP;  	//比例常数heatTemp_pid.Integral = tempPID.KI;    	//积分常数heatTemp_pid.Derivative = tempPID.KD;  	//微分常数
}void pidTask(void)//根据系统来计算调用该函数的周期
{if(devTypedef.devHeatAir.devHeatAirEnable == STATE_ENABLE){heatTemp_pid.SetPoint = (float)sensorData.ptcSensorData.ptcSensorData_target;heatTemp_pid.ActualValue = pidComputeCtrl(&heatTemp_pid, (float)sensorData.ptcSensorData.ptcSensorData_float);//¼ÆËã³öPIDÊä³öÖµif(heatTemp_pid.ActualValue < 0) heatTemp_pid.ActualValue = 0;if(heatTemp_pid.ActualValue > 100) heatTemp_pid.ActualValue = 100;devTypedef.devHeatAir.devHeatAirDuty = heatTemp_pid.ActualValue;//作用到控制设备上//调试信息usb_printf("%0.2f,%0.2f,%0.2f\r\n",heatTemp_pid.SetPoint,(float)sensorData.ptcSensorData.ptcSensorData_float,heatTemp_pid.ActualValue);}
}float pidComputeCtrl(pidTypeDef_t *PID, float feedbackValue)
{PID->Error = (float)(PID->SetPoint - feedbackValue);               												//计算偏差if(PID->PidMode == 1)                                            												//增量式PID{PID->ActualValue += (PID->Proportion * (PID->Error - PID->LastError))                      					//比例环节+ (PID->Integral * PID->Error)                                             //积分环节+ (PID->Derivative * (PID->Error - 2 * PID->LastError + PID->PrevError)); 	//微分环节PID->PrevError = PID->LastError;                                   											//更新历史偏差PID->LastError = PID->Error;}else                                                               												//位置式PID{PID->SumError += PID->Error;float pid_integral = 0;pid_integral = PID->Integral * PID->SumError;																//限积分算法if(pid_integral > 5) pid_integral = 5;PID->ActualValue = (PID->Proportion * PID->Error)                   										//比例环节+ pid_integral                    												//积分环节+ (PID->Derivative * (PID->Error - PID->LastError));							//微分环节PID->LastError = PID->Error;}return (PID->ActualValue);                               														//返回计算后的结果
}

pid.h

#ifndef __PID_H
#define __PID_H
#include "main.h"
#include "log.h"#define PID_TASK_PERIOD 1 //#define PID_LOG_EN 1
#if PID_LOG_EN#define PID_printf(format, ...) 		printf(RTT_CTRL_TEXT_WHITE format , ##__VA_ARGS__)//"\r\n"#define PID_info(format, ...)   		printf(RTT_CTRL_TEXT_GREEN"[pid]info:" format , ##__VA_ARGS__)#define PID_debug(format, ...)  		printf(RTT_CTRL_TEXT_WHITE"[pid]debug:" format , ##__VA_ARGS__)#define PID_warning(format, ...)  	printf(RTT_CTRL_TEXT_YELLOW"[pid]warning:" format , ##__VA_ARGS__)#define PID_error(format, ...)  		printf(RTT_CTRL_TEXT_RED"[pid]error:" format ,##__VA_ARGS__)
#else#define PID_printf(format, ...)#define PID_info(format, ...)#define PID_debug(format, ...)#define PID_warning(format, ...)#define PID_error(format, ...)
#endiftypedef struct
{float KP;float KI;float KD;
}	pidPID_t;extern pidPID_t pressurePID;
extern pidPID_t tempPID;//PID参数结构体
typedef struct
{float  SetPoint;            //设定目标值float  ActualValue;         //期望值输出float  SumError;            //积分值float  Proportion;          //比例常数float  Integral;            //积分常数float  Derivative;          //微分常数float  Error;               //当前偏差值float  LastError;           //上次偏差值float  PrevError;           //上上次偏差值unsigned int PidMode;		//使用PID模式
} pidTypeDef_t;extern pidTypeDef_t  heatTemp_pid;     				//加热系统PID参数结构体extern unsigned char pid_flag;void pidInit(void);
void pidTask(void);	
float pidComputeCtrl(pidTypeDef_t *PID, float feedbackValue);#endif

相关文章:

STM32_PID通用算法增量式和位置式

STM32_PID通用算法增量式和位置式 前言&#xff1a; 此算法为入门级PID算法&#xff0c;调试好参数后可应用于温度控制、舵机控制、直流电机的转速控制和直流电机的角度控制等等&#xff0c;下面就以温度控制举例 pid.c #include "pid.h" #include "sensor.h&q…...

Spark的数据输入、数据计算、数据输出

PySpark的编程&#xff0c;主要氛围三大步骤&#xff1a;1&#xff09;数据输入、2&#xff09;数据处理计算、3&#xff09;数据输出 1&#xff09;数据输入:通过SparkContext对象&#xff0c;晚上数据输入 2&#xff09;数据处理计算:输入数据后得到RDD对象&#xff0c;对RDD…...

Windows端口号被占用的查看方法及解决办法

Windows端口号被占用的查看方法及解决办法 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-10-14 22:58:32.069 ERROR 6488 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ***…...

Web3 整理React项目 导入Web3 并获取区块链信息

上文 WEB3 创建React前端Dapp环境并整合solidity项目&#xff0c;融合项目结构便捷前端拿取合约 Abi 我们用react 创建了一个 dapp 项目 并将前后端代码做了个整合 那么 我们就来好好整理一下 我们的前端react的项目结构 我们在 src 目录下创建一个 components 用来存放我们的…...

基于SpringBoot的旅游网站开题报告

一、选题背景 随着旅游业的蓬勃发展和人们对旅游需求的增长&#xff0c;开发一个基于Spring Boot的旅游网站具有重要的意义。传统的旅行社模式逐渐不能满足人们个性化、多样化的旅游需求&#xff0c;因此开发一个在线旅游网站能够为用户提供更加便捷、灵活、个性化的旅游服务&…...

基于SSM的班级事务管理系统

基于SSM的班级事务管理系统 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 登录界面 班委界面 学生界面 管理员界面 摘要 基于SSM&#xff08;Spring、Spring…...

基于Spring Boot开发的汽车租赁管理系统

文章目录 项目介绍主要功能截图:后台前台部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot开发的汽车租赁…...

精品基于django的高校竞赛比赛管理系统Python

《[含文档PPT源码等]精品基于django的高校竞赛管理系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScri…...

RustDay04------Exercise[01-10]

1.做题须知 这一题告诉我们可以尝试修改下面的输出,在觉得OK之后删除// I AM NOT DONE注释即可进入下一题 // intro1.rs // About this I AM NOT DONE thing: // We sometimes encourage you to keep trying things on a given exercise, even // after you already figured …...

ARM day9

src/key_it.c #include "key_it.h" #include "led.h" void key_it_config() {//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR | (0x1<<5);//设置PF9 PF7 PF8GPIO输入//PF9GPIOF->MODER & (~(0x3<<18));//PF8GPIOF->MODER & (~(0x3&l…...

【TensorFlow2 之013】TensorFlow-Lite

一、说明 在这篇文章中&#xff0c;我们将展示如何构建计算机视觉模型并准备将其部署在移动和嵌入式设备上。有了这些知识&#xff0c;您就可以真正将脚本部署到日常使用或移动应用程序中。 教程概述&#xff1a; 介绍在 TensorFlow 中构建模型将模型转换为 TensorFlow Lite训练…...

Java基础--阳光总在风雨后,请相信彩虹

1、今日任务 JAVA SE-韩顺平视频教程–30p以上&#xff08;今天得50p以上因为是基础&#xff09;计算机基础八股记忆总结刷题&#xff08;两题&#xff09;可以先用python 1、SSM ssm->Spring&#xff08;轻量级的文本开发框架&#xff09;/SpringMVC&#xff08;分层的w…...

高级网络调试技巧:使用Charles Proxy捕获和修改HTTP/HTTPS请求

今天我将与大家分享一种强大的网络调试技巧&#xff0c;那就是使用Charles Proxy来捕获和修改HTTP/HTTPS请求。如果您是一位开发人员或者网络调试爱好者&#xff0c;那么这个工具肯定对您有着很大的帮助。接下来&#xff0c;让我们一起来学习如何使用Charles Proxy进行高级网络…...

Discuz大气游戏风格模板/仿lol英雄联盟游戏DZ游戏模板GBK

Discuz大气游戏风格模板&#xff0c;lol英雄联盟游戏模板&#xff0c;DZ游戏娱乐模板GBK。模板名称&#xff1a;lol英雄联盟游戏&#xff08;m0398_lol&#xff09; 下载地址&#xff1a;https://bbs.csdn.net/topics/617408069...

206、SpringBoot 整合 RabbitMQ 的自动配置类 和 对应的属性处理类 的知识点

目录 ★ Spring Boot 为 RabbitMQ 提供的自动配置▲ 自动配置类&#xff1a;RabbitAutoConfiguration▲ 属性处理类&#xff1a;RabbitProperties相关配置 ★ AmqpAdmin的方法★ AmqpTemplate的方法代码演示创建一个springboot的项目。application.properties 配置属性 ★ Spri…...

网络链接失败怀疑是服务器处于非正常状态?如何用本地电脑查看服务器是否正常?

网络链接失败怀疑是服务器处于非正常状态&#xff1f;如何用本地电脑查看服务器是否正常&#xff1f; 网页会出现链接失败&#xff0c;可以实时用cdm大法&#xff0c;cdm可以更好的排查字节数据的返回&#xff0c;可以让我们更好的要检查服务器是否处于正常状态&#xff0c;接下…...

文件操作(打开关闭文件、文件顺序以及随机读写)

文章目录 写在前面1. 文件的打开与关闭1.1 文件指针1.2 文件的打开(fopen)与关闭(fclose)1.2.1 fopen函数1.2.2 fclose函数 2. 文件的顺序读写2.1. fgetc 和 fputc函数2.1.1 fputc函数2.1.2 fgetc函数 2.2 fgets 和 fputs函数2.2.1 fputs函数2.2.2 fgets函数 2.3 fscanf和fprin…...

HTTP 响应头 X-Frame-Options

简介 X-Frame-Options HTTP 响应头用来给浏览器一个指示。该指示的作用为&#xff1a;是否允许页面在 <frame>, </iframe> 或者 <object> 中展现。 网站可以使用此功能&#xff0c;来确保自己网站的内容没有被嵌套到别人的网站中去&#xff0c;也从而避免了…...

MongoDB 集群配置

一、副本集 Replica Sets 1.1 简介 MongoDB 中的副本集&#xff08;Replica Set&#xff09;是一组维护相同数据集的 mongod 服务。 副本集可提供冗余和高可用性&#xff0c;是所有生产部署的基础。 也可以说&#xff0c;副本集类似于有自动故障恢复功能的主从集群。通俗的讲就…...

random生成随机数的灵活运用

random返回的 [0,1) 之间的一个随即小数 思考&#xff1a;请写出获取 a-b 之间的一个随机整数&#xff0c;a,b均为整数&#xff0c;比如 a2 , b7 即返回一个数 x > [2,7]Math.random()*(b-a) 返回的就是 [0,b-a](int)(aMath.random()*(b-a1)) 》 (int)(2Math.random()*6) Ma…...

聊聊 Comsol 仿真方形锂离子电池那些事儿

comsol仿真 锂离子电池 电化学 仿真 comsol 方形锂离子电池的三维模型&#xff1a;三维模型有助于准确的评估电芯中的集流体和极耳等对电流、电位以及产热分布的影响。 模型基于三维 Newman 模型&#xff0c;其中包括了在颗粒尺度描述锂粒子插层和扩散的额外维度。 此外&#…...

Qwen2.5-14B-Instruct多轮记忆|像素剧本圣殿长剧本连贯性保障机制

Qwen2.5-14B-Instruct多轮记忆&#xff5c;像素剧本圣殿长剧本连贯性保障机制 1. 专业剧本创作的新范式 在创意写作领域&#xff0c;剧本创作一直面临着角色一致性、情节连贯性和风格统一性的挑战。传统创作工具往往只能提供片段式的辅助&#xff0c;而"像素剧本圣殿&qu…...

马西奎《电磁场与电磁波》学习记录-第 2 章学前准备-坐标系的深入 + 微分元(dl、dS、dV)

一、正交坐标系的一般概念1. 什么是正交曲线坐标系三组坐标面互相垂直正交单位矢量处处正交&#xff1a;​⊥​⊥​直角、圆柱、球坐标都属于这一类。2. 坐标变量与拉梅系数&#xff08;度量系数&#xff09;对一般正交曲线坐标 (,​,​)&#xff1a;坐标面&#xff1a;​常数、…...

自建轻量CI_CD:GitHub Actions + Docker + 自动版本号 + 自动回滚 实战教程

自建轻量CI/CD&#xff1a;GitHub Actions Docker 自动版本号 自动回滚 实战教程 &#x1f3f7;️ 标签&#xff1a;CI/CD、GitHub Actions、Docker、自动化部署、自动版本号、自动回滚、DevOps &#x1f4cc; 阅读指南&#xff1a;本文手把手带你搭建一套轻量、免费、稳定的…...

Nanobot技能扩展开发:自定义OpenClaw功能模块教程

Nanobot技能扩展开发&#xff1a;自定义OpenClaw功能模块教程 1. 引言 想给你的Nanobot智能助手添加一些个性化功能吗&#xff1f;比如让它帮你查天气、管理待办事项&#xff0c;或者连接你常用的办公软件&#xff1f;今天就来手把手教你如何为Nanobot开发自定义技能模块。 …...

Ostrakon-VL-8B效果展示:看AI如何从店铺图片中识别问题与机会

Ostrakon-VL-8B效果展示&#xff1a;看AI如何从店铺图片中识别问题与机会 1. 引言&#xff1a;当AI成为你的店铺巡检专家 想象一下这样的场景&#xff1a;你是一家连锁超市的运营经理&#xff0c;每天需要检查数十家门店的货架陈列、商品摆放和卫生状况。传统方法需要派遣大量…...

Swin2SR多帧超分:视频序列的时空信息融合

Swin2SR多帧超分&#xff1a;视频序列的时空信息融合 1. 引言 你有没有遇到过这样的情况&#xff1a;从监控录像中截取的关键画面模糊不清&#xff0c;或者老视频中的珍贵片段分辨率太低&#xff0c;无法看清细节&#xff1f;传统单帧超分技术往往力不从心&#xff0c;因为它…...

Qwen3.5-2B图文理解评测:在TextVQA、ChartQA等基准测试中的轻量级SOTA表现

Qwen3.5-2B图文理解评测&#xff1a;在TextVQA、ChartQA等基准测试中的轻量级SOTA表现 1. 模型概览 Qwen3.5-2B是Qwen3.5系列中的轻量化多模态基础模型&#xff0c;仅有20亿参数规模&#xff0c;却展现出超越参数量的强大图文理解能力。该模型专为低功耗、低门槛部署场景设计…...

基于COMSOL光学仿真的光子晶体光纤与微纳光学研究

comsol光学仿真光子晶体光纤&#xff0c;comsol光学方方向COMLOS微纳光学&#xff0c;仿真双芯光子晶体光&#xff0c;锥形光纤 光子晶体光光纤滤波器等&#xff0c;bpm&#xff0c;rsoft&#xff0c;fullware&#xff0c;论文复现在光学仿真领域&#xff0c;COMSOL Multiphysi…...

终极指南:如何通过OmenSuperHub高效掌控暗影精灵硬件性能

终极指南&#xff1a;如何通过OmenSuperHub高效掌控暗影精灵硬件性能 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 想要彻底摆脱官方Omen Gaming Hub的臃肿体验&#xff0c;获得纯净高效的暗影精灵硬件控制工具吗&#xf…...