基于PID控制参数法改变PWM的占空比的STM32F4温控实例

2023-11-19

  最近的工程要用到PID算法,在这里与大家分享一下。本文章适合直接上手PID,直接将PID与STM32结合运用起来,比较适合没有接触过PID的新人或者是算法与STM32结合不熟悉的新同学,如果要详细了解PID算法与调整算法还是需要深入了解一下PID算法。这里介绍一个讲PID算法很详细的博主         PID参数调整,个人经验(配输出曲线图)建议可以先看一下这篇文章再看我下文的内容。

首先我的工程是要STM32F4作为主控系统去实现温度控制在37℃,加热装置是一个很普通的通过大小不同的电流驱动的加热片,所以首先第一步是先搭建一个闭环的系统,即是一个封闭的系统(包括有加热模块,采集温度模块和处理模块)。接着我是通过控制不同占空比的PWM波驱动加热片进行加热,经过不断测试记录下来大概37℃的占空比,即记录自己的目标温度的驱动能力大概是多少。第二步就是确定三个参数:比例系数(P),微分系数(I),积分系数(D),笼统的来说PID算法就是设定一个温度,让系统可以最快速度的去升温到预定的温度,但是在即将到达预设温度通过PID算法就行缓冲和修正,防止温度过冲(专业的说法是防止超调量过大),让温度降下来,之后再快速修正并保持稳定在预设温度。我是通过一个自适应算法去获取三个参数的,自适应算法就是让温度达到一个稳定的震荡,接着采集当前的幅值,并通过公式计算出比例系数Kp,同时以计数作为微分时间。。。代码注释后面就是我获取的三个原参数,但是原来的参数的温度变化曲线并不理想,根据PID经典调整口诀调整参数直到温度曲线达到理想。第三步就是将计算出来的PID结果与单片机结合起来,比如我的是控制PWM波,就将PID算法结果与PWM修正结合起来。PID_out()函数就是将PID计算结果与占空比相结合,随着不断的误差更新不断调整占空比控制电流直到达到自己设定的预设温度。

void PID_Calc()  //pid计算
{
	float DelEk;	
	float out;                                             //PID输出
	pid.Kp              = 100;		                      //比例系数  38
	pid.Ki              = 0.10;                           //积分系数   0.3048
	pid.Kd              = 2;                              //微分系数  1.984375
	PID_Deal            = 1;                              //PID_Deal为1时表示进行PID计算
	if (PID_Deal == 1)
	{
		pid.Ek=pid.Sv-pid.Pv;                             //得到当前的偏差值
		pid.SEk+=pid.Ek;                                  //历史偏差总和
		DelEk=pid.Ek-pid.Ek_1;                             //最近两次偏差之差

		pid.Pout=pid.Kp*pid.Ek;                            //比例输出
		pid.Iout=pid.Ki*pid.SEk;  			               //积分输出
		pid.Dout=pid.Kd*DelEk;    			               //微分输出
		out= pid.Pout+ pid.Iout+ pid.Dout;
		kkk++;                                             //计数
		if(out>255)
		{
			kkk=0;
			pid.SEk=0;
		}
		if(out>255)
		{
			pid.OUT=255;
		}
		else if(out<0)
		{
			pid.OUT=0; 
		}
		else 
		{
			pid.OUT=out;
		}
		pid.Ek_1=pid.Ek;  //更新偏差
		PID_out();		
	}
}

这个是我将每一秒采集的温度打印到串口并输出出来拿到matlab画了个图,这属于比较合格的PID温控曲线。

 如果我表示的还不清楚,或者有什么讲错了讲得不好欢迎大家评论区指正。

非无偿开源,有需要可以私信。有自适应的PID算法与控制参数的PID算法。

 

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

基于PID控制参数法改变PWM的占空比的STM32F4温控实例 的相关文章

  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 已编译 LKM 的互换性

    是否可以使用可加载内核模块 编译为3 0 8 mod unload ARMv5 我自制的内核 在具有版本的内核中3 0 31 gd5a18e0 SMP preempt mod unload ARMv7 安卓股票内核 该模块本身几乎不包含任何
  • ARM、VFP、浮点、惰性上下文切换

    我正在为 ARM 处理器 Cortex A9 编写操作系统 我正在尝试实现浮点寄存器的延迟上下文切换 这背后的想法是 浮点扩展最初对线程禁用 因此不需要在任务切换上保存浮点上下文 当线程尝试使用浮点指令时 会触发异常 然后 操作系统启用浮点
  • 如何在数据部分(RAM)中保留一定范围的内存并防止同一应用程序使用该内存的堆/堆栈?

    我想在 RAM 中保留 分配一定范围的内存 并且同一应用程序不应覆盖或使用该范围的内存进行堆 堆栈存储 如何在内存中分配一定范围的内存以防止堆栈 堆覆盖 我考虑过向应用程序本身添加 或分配 一个数组并保留内存 但它被编译器优化了 因为它在应
  • 正确检测 ARM 平台上的混合端浮点格式

    我最近遇到了一个第三方库的问题 该库使用以下代码来测试 ARM 平台上的混合字节序浮点格式 if defined arm ARM EABI 此检查在 Android 平台上错误地检测到混合字节序格式 但在 iOS 平台上工作正常 经过一番研

随机推荐

  • leetcode刷题__删除有序数组中的重复项

    文章目录 题目描述 Java解决方法 题目描述 Java解决方法 class Solution public int removeDuplicates int nums int len nums length if len 0 return
  • Day81-爱心代码音乐版

    项目地址 截止到2023 9月有效 点击跳转 先看效果 素材来自网络 自己加了播放音乐的效果 直接上代码
  • 快速排序算法及其改进算法实现

    快速排序算法不稳定 快速排序算法在大多数的计算机上运行得都比其他排序算法快 而且排序算法消耗资源少 就平均时间而言快排是所有内部排序中最好的一个 对于已经排好的数组 最速排序有最坏时间复杂度为o n 2 当数组长度很小时 快排往往比其他排序
  • 【openGL2021版】链接FBX模型库

    openGL2021版 链接FBX模型库 大家好 我是Lampard猿奋 欢迎来到船新的openGL基础系列的博客 今天主要实现的是链接FBX模型第三方库 一 demo回顾 上周我已经实现了粒子系统 可以看到场景中已经存在着像萤火虫一样的闪
  • Wsl 开发环境配置

    Apt换源 切换清华源 sudo sed i s http archive ubuntu com https mirrors tuna tsinghua edu cn g etc apt sources list sudo sed i s
  • 图文详解 排序算法对比以及能解决的问题

    我们会使用的排序算法 总结源自 极客时间 王争老师 地址 https time geekbang org column intro 126 能看到所有的算法和数据结构的网站 https visualgo net en 这里是关于排序算法的链
  • 六大设计原则--开闭原则

    定义 software entities like classes modules and functions should be open for extension but closed for modifications 一个软件实体
  • php background,CSS BACKGROUND定位背景上下左右偏移

    css中我们经常使用background加载图片作为背景 这个背景图片可以通过具体属性的设置调整其上下左右偏移 调整背景图的上下左右偏移可以通过设置background属性或background position属性来实现 我们以div加背
  • Linux:非root、普通用户安装rpm(fontconfig、fc-cache命令)、中文字体

    前提 非root帐号 普通帐号 不能使用yum rpm命令 没root权限 安装fontconfig 测试是否安装 安装字体后需要使用fontconfig包的fc cache fv命令刷新字体缓存 可以使用下面命令测试 二选一就行 fc l
  • java版kafka producer实现

    需求 1 kafka server已经配置完全 且设定了访问限制 基于这一点 必须要设定认证 及预先分配的账号密码 2 由于项目开发环境是java 且不允许使用LogStash 基于这一点 必须实现一个java版的producer 先贴一份
  • error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

    原因是你两个类的头文件互相包含了 这样是有问题的 参考博客 error C4430 缺少类型说明符 假定为 int 注意 C 不支持默认 int 很多不懂呀 博客园
  • CountDownLatch、CyclicBarrier、Semaphore源码解析

    1 CountDownLatch 计数器 CountDownLatch CountDownLatch 类位于java util concurrent包下 利用它可以实现类似计数器的功能 比如有一个任务A 它要等待其他4个任务执行完毕之后才能
  • Spring Boot + Vue + Shiro 实现前后端分离

    前后端分离思想 前端只利用 Json 来和后端进行交互 后端不返回页面 只返回 Json 数据 前后端之间完全通过 public API 约定 Springboot 就不再赘述了 Controller 层返回 Json 数据 Request
  • Matlab - Solidworks 机器人建模(1)—— 浅谈Matlab机器人建模思路

    本文的讨论对象仅局限于刚体模型 Matlab建立机器人模型主要有两个方面 当然不排除有其他的 我只说我知道的 Rigidbody tree 坐标系模型 Simsacpe 物理模型 建立rigidbody tree模型主要是为了能够使用mat
  • 2017 ICM/MCM D题 Optimizing the Passenger Throughput at an Airport Security Check

    问题描述 参考链接 问题描述 在机场安全检查站优化乘客吞吐量 继2001年9月11日美国发生恐怖袭击事件后 全世界的机场安全状况得到显着改善 机场有安全检查站 在那里 乘客及其行李被检查爆炸物和其他危险物品 这些安全措施的目的是防止乘客劫持
  • 七层模型和五层模型

    高可用 负载均衡 高可用 不要因为技术而技术 七层模型 OSI开放式系统互联通信参考模型 OSI将计算机网络体系结构 architecture 划分为以下七层 物理层 将数据转换为可通过物理介质传送的电子信号 相当于邮局中的搬运工人 数据链
  • Linux系统制作Ubuntu18.04启动盘

    转自 https blog csdn net xiaoma 2018 article details 85059930 首先进入 Ubuntu 官网下载 Ubuntu18 04 ios 镜像包 下载的镜像包为 ubuntu 18 04 1
  • Redis视野打开篇

    1 String格式 一般存一个对象 是用这个对象的ID为键 将对象的所有属性格式化为json对象字符串 作为值 然后set ID json 进去 但是这种方式 在只需要修改这个对象中的其中一个属性时 就需要把json转为对象 改变值 然后
  • stm32定时器输入捕获配置步骤及实例笔记

    输入捕获的一般配置步骤 初始化定时器和通道对应IO的时钟 初始化IO口 模式为输入 GPIO Init GPIO InitStructure GPIO Mode GPIO Mode IPD 初始化定时器ARR PSC TIM TimeBas
  • 基于PID控制参数法改变PWM的占空比的STM32F4温控实例

    最近的工程要用到PID算法 在这里与大家分享一下 本文章适合直接上手PID 直接将PID与STM32结合运用起来 比较适合没有接触过PID的新人或者是算法与STM32结合不熟悉的新同学 如果要详细了解PID算法与调整算法还是需要深入了解一下