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

搞嵌入式开发的小伙伴应该都遇到过PID调参这个头疼的问题吧?今天咱们直接上干货,聊聊怎么在STM32上玩转PID自整定和温度控制。先扔个核心代码片段镇楼

基于STM32开发的PID自整定和PID温控和PWM输出程序源码采用反馈法进行PID参数自动整定得出系统临界值比例增益自动计算调节使系统进入正常状态。 程序源码注释详细typedef struct { float Kp; float Ki; float Kd; float integral_max; // 积分限幅 float output_max; // 输出限幅 float last_error; float integral; } PID_TypeDef;这个结构体把PID的核心参数都打包了重点看integral_max这个参数——很多新手调PID时积分项爆表的问题就是靠它解决的。接下来看中断服务里的处理逻辑void TIM2_IRQHandler(void) { static uint32_t tick 0; if(__HAL_TIM_GET_FLAG(htim2, TIM_FLAG_UPDATE)) { __HAL_TIM_CLEAR_FLAG(htim2, TIM_FLAG_UPDATE); float current_temp DS18B20_Read(); // 读取当前温度 float error target_temp - current_temp; pid.integral error * dt; if(pid.integral pid.integral_max) pid.integral pid.integral_max; // 抗积分饱和 else if(pid.integral -pid.integral_max) pid.integral -pid.integral_max; float derivative (error - pid.last_error) / dt; float output pid.Kp * error pid.Ki * pid.integral pid.Kd * derivative; pid.last_error error; __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, (uint32_t)(output)); // 更新PWM占空比 } }这里有个细节处理得很妙在计算积分项时做了限幅处理避免系统启动时积分项过大导致的超调。dt是采样周期建议根据系统响应速度在50ms-200ms之间调整。自整定算法才是重头戏咱们用阶跃响应法找临界增益。核心逻辑是逐步增大比例增益直到系统出现等幅振荡void PID_AutoTune(void) { float Ku, Tu; float output 0; uint8_t oscillation_count 0; while(1) { output 0.5f; // 每次增加0.5%的PWM输出 __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, (uint32_t)output); HAL_Delay(100); float peak1 0, peak2 0; // 检测振荡波形 if(DetectOscillation(peak1, peak2)) { Ku output / (peak1 - peak2); // 计算临界增益 Tu CalculateOscillationPeriod(); // 获取振荡周期 break; } } // Ziegler-Nichols整定公式 pid.Kp 0.6 * Ku; pid.Ki 1.2 * Ku / Tu; pid.Kd 0.075 * Ku * Tu; }这段自整定代码需要配合信号采集实际操作中发现对于温控系统振荡周期通常在几十秒量级所以采样间隔不能太短。有个坑要注意自整定过程中需要断开积分项否则会影响振荡检测。基于STM32开发的PID自整定和PID温控和PWM输出程序源码采用反馈法进行PID参数自动整定得出系统临界值比例增益自动计算调节使系统进入正常状态。 程序源码注释详细最后看PWM配置这里用TIM3的通道1输出关键配置htim3.Instance TIM3; htim3.Init.Prescaler 84-1; // 84MHz/84 1MHz htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 1000-1; // 1MHz/1000 1kHz PWM htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1);这里把PWM频率设置在1kHz既避免高频噪声又能满足大多数加热元件的响应需求。实际调试时发现对于继电器控制需要把频率降到10Hz以下否则会缩短触点寿命。整套系统跑起来后实测从25℃升温到100℃的曲线超调控制在2℃以内稳定时间约3分钟。有个小技巧在温差较大时适当提高PWM上限温差小时自动降低能显著加快响应速度。代码里output_max这个参数就是干这个的可以根据当前误差动态调整。

相关文章:

搞嵌入式开发的小伙伴应该都遇到过PID调参这个头疼的问题吧?今天咱们直接上干货,聊聊怎么在STM32上玩转PID自整定和温度控制。先扔个核心代码片段镇楼

基于STM32开发的PID自整定和PID温控和PWM输出程序源码,采用反馈法进行PID参数自动整定,得出系统临界值比例增益,自动计算调节,使系统进入正常状态。 程序源码注释详细typedef struct {float Kp;float Ki;float Kd;float integral_…...

智能指针相关

零、预备知识 右值: 表示不可寻址的临时数据值。 根据C11标准,右值分为纯右值(如字面量、表达式结果)和将亡值(即将销毁的对象)。 右值具有不可修改、无持久内存地址的特性 右值引用&&、移动语义…...

当立体车库遇上PLC仿真

西门子1200PLC立体车库 33立体车库 博图触摸屏仿真 不需要实物 自带人机界面,动画,可以仿真 还有接线图原理图 现在拥有自动出入仓库的功能 IO表已列出最近捣鼓了个挺有意思的项目——基于西门子1200PLC的33立体车库仿真。不用焊线接电机,纯…...

HTML基础教程(一)

目录 一、HTML基本概念 二、基础HTML (Tag) 三、Html常用格式 一、HTML基本概念 什么是HTML文件? HTML的英文全称是Hypertext Marked Language,中文叫做“超文本标记语言”。和一般文本的不同的是,一个HTML文件不…...

AI基石 | 对齐技术:从 RLHF 到 DPO —— 赋予大模型“三观”的终极进化

AI基石 | 对齐技术:从 RLHF 到 DPO —— 赋予大模型“三观”的终极进化 前言 如果 SFT(监督微调)后的模型是一个“懂事”的练习生,那么对齐后的模型就是一个“老练”的专家。 练习生虽然知道问答的格式,但依然存在两个…...

俄罗斯RT-2PM2“白杨-M“(Topol-M)洲际弹道导弹系统完整技术报告

Comprehensive Technical Report on Russias RT-2PM2 Topol-M Intercontinental Ballistic Missile System 报告日期:2026年3月11日 保密级别:公开来源情报(OSINT) 摘要(Executive Summary) RT-2PM2"…...

Java线程池面试题50道(含答案解析)

在Java后端开发面试中,线程池(ThreadPool) 是并发编程的重要考点之一。 在高并发系统中,合理使用线程池可以 提高系统性能、减少线程创建开销、避免资源耗尽。 很多互联网公司在面试Java工程师时都会重点考察: 线程池原…...

Clawdbot 杀红眼了,几天怒斩 80k+ Star!你真正的 AI 数字员工来了!!(附保姆级安装使用教程)

最近一款 AI 开源工具 Clawdbot 杀疯了,人送外号:大龙虾,短短几天时间,GitHub 上 Star 数量暴涨到 80k,因为名称与 Claude 相似,还被 Anthropic 公司警告被迫改名:Moltbot。 Moltbot 的核心是它…...

Python3.9环境配置太麻烦?试试这个Miniconda镜像,一键部署

Python3.9环境配置太麻烦?试试这个Miniconda镜像,一键部署 还在为配置Python开发环境而头疼吗?从源码编译安装,要解决一堆依赖问题;手动下载安装包,又担心版本冲突和路径混乱。特别是当你需要Python 3.9这…...

从原理到代码:深度解析Halcon中segment_contours_xld的Ramer算法实现

从原理到代码:深度解析Halcon中segment_contours_xld的Ramer算法实现 在机器视觉的工程实践中,我们常常需要将相机捕捉到的、由像素点构成的连续轮廓,转化为更高级、更易于理解和处理的几何基元,比如直线、圆弧或椭圆弧。这个过程…...

Keil5 vs Keil6:如何选择?附带Keil5中STM32开发环境搭建全攻略(含FreeRTOS移植准备)

Keil MDK 进化论:从经典到现代,如何为你的STM32项目选择最佳开发环境 作为一名在嵌入式领域摸爬滚打了多年的开发者,我至今还记得第一次打开Keil MDK时那种既兴奋又茫然的心情。那个经典的蓝色界面,几乎成了ARM Cortex-M开发的代名…...

第三期:基于立创·梁山派开发板的游戏机扩展板训练营全记录

第三期:基于立创梁山派开发板的游戏机扩展板训练营全记录 大家好,我是老张,一个在嵌入式行业摸爬滚打了十几年的工程师。最近,我作为导师完整地跟进了立创EDA举办的“梁山派游戏机扩展板训练营”第三期。看到很多朋友对如何从零开…...

OAuth2.0中state参数的深度应用:业务数据的安全传输与防CSRF实践

1. 不只是防CSRF:重新认识OAuth2.0的state参数 很多刚开始接触OAuth2.0的开发者,一看到state参数,第一反应就是“哦,防CSRF的”。这个理解没错,但只对了一半。在实际项目中,尤其是在需要深度集成的场景里&a…...

Ubuntu20.04下拯救者笔记本亮度调节失效?NVIDIA驱动加载顺序问题全解析

Ubuntu 20.04 下拯救者笔记本亮度调节失效?NVIDIA 驱动加载顺序问题全解析 最近在联想拯救者系列笔记本上安装 Ubuntu 20.04 的朋友,可能都遇到过同一个令人头疼的问题:屏幕亮度过高,刺眼得让人无法工作,而无论是系统设…...

SAR动目标检测系列:【5】多基线联合处理下的三维速度解耦

1. 从二维到三维:为什么我们需要多基线联合处理? 在上一篇文章里,我们聊透了如何利用单天线或者双天线SAR系统,去估计动目标的二维速度(也就是方位向和距离向的速度)。这就像你用手机拍一个移动的物体&…...

Flink实战:如何用KeyedProcessFunction实现温度异常检测(附完整代码)

从零构建实时温度异常检测系统:深入Flink KeyedProcessFunction核心实战 最近在帮一个做智慧农业的朋友处理温室大棚的监控数据,他们部署了上百个温湿度传感器,数据像潮水一样涌来。最头疼的不是数据量大,而是如何从这些实时流里快…...

KITTI 3D 数据可视化:从点云到鸟瞰图的实战解析

1. 从零开始:理解KITTI数据集与3D点云 大家好,我是老张,在自动驾驶这个行当里摸爬滚打了十来年,跟激光雷达和相机数据打了无数次交道。今天,我想跟你聊聊一个非常基础但又极其重要的技能:如何把KITTI数据集…...

内存马二:Filter

Filter内存马 源码学习 首先写一个普通的Filter了解一下重点数据的传递过程,断点到内部的一行,往上找。回到的是org.apache.catalina.core.ApplicationFilterChain#internalDoFilter,这部分找到filters找filters的赋值的地方,找到…...

uni-id-pages配置email

uniappuniclouduni-id-pages 配置邮箱教程 安装uni-id-pages插件下载插件并导入HbuilderX 修改/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/verify/send-email-code.js文件内容,将测试代码注释,添加发送邮件代码 // -- 测试代码// awai…...

Android 休眠机制详解 ——WakeLock、Doze 模式与待机功耗优化实战

前言 待机功耗高、耗电快、手表 / 手机一觉醒来掉电很多,90% 都是 “休眠没睡进去”。 一、为什么要讲 Android 休眠? 对手机 / 手表 / IoT 设备来说: 亮屏 性能息屏待机 续航 功耗测试的核心,就是看设备能不能正常休眠、睡不睡…...

C++中的装饰器模式高级应用

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。find_if(begin, end, predicate):查找第一个满…...

LeetCode 3296.移山所需的最少秒数:优先队列

【LetMeFly】3296.移山所需的最少秒数:优先队列 力扣题目链接:https://leetcode.cn/problems/minimum-number-of-seconds-to-make-mountain-height-zero/ 给你一个整数 mountainHeight 表示山的高度。 同时给你一个整数数组 workerTimes,表…...

深入解析尺度空间理论及其在SIFT特征提取中的应用

1. 从“看画”说起:为什么我们需要尺度空间? 想象一下,你站在一幅巨大的油画前,比如梵高的《星空》。当你把鼻子都快贴到画布上时,你只能看到一小片区域,那里有清晰的、厚重的笔触和颜料的纹理。你后退一步…...

Spring Boot文件上传报错Failed to parse multipart servlet request的3种解决方案及适用场景

1. 问题重现:那个让人头疼的“Failed to parse multipart servlet request” 不知道你有没有遇到过这种情况:一个好好的Spring Boot文件上传功能,平时用着都挺顺溜,突然有一天,用户反馈说上传文件报错了。你赶紧去查日…...

0.96寸OLED取模实战:从基础字符到动态图像显示

1. 为什么你的OLED屏幕只能显示英文?聊聊取模这回事 你是不是也遇到过这种情况?兴冲冲地买回来一块小巧精致的0.96寸OLED屏幕,连上Arduino或者ESP32,跑了个示例程序,屏幕上“Hello World”亮起,感觉科技感满…...

【C++】MSYS2进阶:从零到一打造现代化C++工作流

1. 为什么你的C开发环境需要一个“瑞士军刀”? 如果你在Windows上折腾过C开发环境,大概率经历过一场噩梦:去MinGW官网下载编译器,手动配置环境变量,再单独安装CMake、Ninja、GDB……每个工具都有自己的安装包和路径&am…...

ESP32-C61 TIMG定时器与看门狗深度实践指南

ESP32-C61 定时器组(TIMG)与看门狗定时器深度实践指南1. TIMG 架构概览与中断机制解析ESP32-C61 的定时器组(TIMG)是系统级时间管理的核心硬件模块,集成于两个独立的定时器组(TIMG0 和 TIMG1)&a…...

提示工程架构师揭秘:AI提示系统个性化与用户画像结合的4大方法

提示工程架构师揭秘:AI提示系统个性化与用户画像结合的4大方法 摘要/引言 在当今AI技术飞速发展的时代,AI提示系统已广泛应用于各种场景。然而,通用的提示往往无法满足每个用户的特定需求。本文旨在解决如何通过将AI提示系统与用户画像相结合…...

立创Ai8051U测控开发板:从传感器采集到无线通信的综合嵌入式实战平台

立创Ai8051U测控开发板:从传感器采集到无线通信的综合嵌入式实战平台 最近有不少朋友问我,想找一个能“一站式”学习嵌入式系统所有核心环节的开发板,从最基础的GPIO控制,到传感器数据采集、存储、显示,再到无线通信和…...

立创开源复古辉光管时钟DIY全解析:ESP32-C3驱动IN-12A与170V升压电路设计

立创开源复古辉光管时钟DIY全解析:ESP32-C3驱动IN-12A与170V升压电路设计 最近在捣鼓一个特别有感觉的复古小玩意儿——辉光管时钟。看着那橘红色的数字在玻璃管里幽幽亮起,瞬间有种穿越回上世纪的感觉。很多朋友看了我做的成品都心痒痒,但一…...