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

别再被STM32的Tick溢出吓到了!用编码器测速的例子帮你彻底理解无符号数运算

从编码器测速到Tick溢出STM32无符号数运算的实战解析在嵌入式开发中时间管理和运动控制是两大核心需求。许多开发者第一次遇到无符号数溢出问题时往往是在调试STM32的HAL_Delay函数时——当系统运行超过49天后uwTick变量会从最大值回滚到零。但更令人惊讶的是这种溢出不仅不会导致延时错误反而是精确计时的关键。这种看似矛盾的现象其实在编码器测速应用中早已司空见惯。1. 编码器测速溢出不是错误而是特性电机控制系统中旋转编码器是最常见的位置反馈装置。当使用STM32的定时器编码器接口时开发者会配置一个16位或32位的计数器来记录脉冲数。以32位计数器为例当电机正转时计数器递增反转时递减这个计数值会不断累积。// 典型编码器初始化代码TIM2为例 TIM_Encoder_InitTypeDef encoder_config { .EncoderMode TIM_ENCODERMODE_TI12, .IC1Polarity TIM_ICPOLARITY_RISING, .IC1Selection TIM_ICSELECTION_DIRECTTI, .IC1Prescaler TIM_ICPSC_DIV1, .IC1Filter 0x0, .IC2Polarity TIM_ICPOLARITY_RISING, .IC2Selection TIM_ICSELECTION_DIRECTTI, .IC2Prescaler TIM_ICPSC_DIV1, .IC2Filter 0x0 }; HAL_TIM_Encoder_Init(htim2, encoder_config); HAL_TIM_Encoder_Start(htim2, TIM_CHANNEL_ALL);测速时的关键操作在固定时间间隔Δt内读取两次计数器值CNT₁和CNT₂通过差值计算脉冲数。当计数器从0xFFFFFFFF溢出到0x00000000时速度 (CNT₂ - CNT₁) / Δt这个减法运算的精妙之处在于即使发生溢出计算结果依然正确。例如场景CNT₁CNT₂实际脉冲数计算结果正常情况1000200010002000-10001000溢出情况0xFFFFFFF00x0000001032(16)-(0xFFFFFFF0)32提示这种自动纠错能力来源于无符号整数的模运算特性与HAL_Delay的原理完全一致2. HAL库时间管理的底层机制STM32的HAL库通过SysTick定时器维护一个全局变量uwTick通常配置为每毫秒递增一次。当我们需要实现10ms延时时void HAL_Delay(uint32_t Delay) { uint32_t tickstart HAL_GetTick(); uint32_t wait Delay; if (wait HAL_MAX_DELAY) { wait (uint32_t)(uwTickFreq); } while((HAL_GetTick() - tickstart) wait) { // 等待时间到达 } }关键点分析HAL_GetTick()返回当前的uwTick值tickstart记录开始延时的时间点wait是需要的延时时间毫秒减法运算HAL_GetTick() - tickstart使用无符号数运算当uwTick溢出时典型的时间点对比如下时间点uwTick值计算过程结果开始延时0xFFFFFFF0--中间时刻0xFFFFFFFF0xFFFFFFFF-0xFFFFFFF0151520 → 继续等待溢出时刻0x000000000x00000000-0xFFFFFFF0161620 → 继续等待结束时刻0x0000000A0x0000000A-0xFFFFFFF0262620 → 退出循环3. 无符号数运算的数学原理这种看似神奇的自动纠错能力实际上是计算机无符号数模运算的自然结果。对于32位无符号整数数值范围0 到 2³²-1 (0xFFFFFFFF)溢出时自动取模0xFFFFFFFF 1 0减法运算a - b ≡ a (2³² - b) mod 2³²运算特性对比表运算类型有符号数无符号数表示范围-2³¹ ~ 2³¹-10 ~ 2³²-1溢出行为未定义自动取模减法特性可能产生负数结果永远非负比较运算考虑符号位纯数值比较// 验证代码示例 uint32_t a 10, b 20; printf(a-b%u (0x%X)\n, a-b, a-b); // 输出a-b4294967286 (0xFFFFFFF6)注意在速度计算和延时函数中我们依赖的正是无符号数减法的这种模运算特性它保证了即使发生溢出时间差和位置差的测量依然准确4. 实战中的常见问题与解决方案虽然无符号数运算有这些优良特性但在实际项目中仍需要注意几个关键点1. 采样周期选择对于编码器测速Δt应小于计数器溢出时间的一半计算公式Δt (计数器最大值)/(2×最大转速对应脉冲频率)2. 32位与16位计数器的选择特性16位计数器32位计数器最大计数值6553542949672951MHz脉冲溢出时间65.5ms约49.7天内存占用2字节4字节适用场景低速、短时测量高速、长期运行3. 中断安全设计当跨越多线程访问计数器或uwTick时// 安全的跨线程读取示例 uint32_t GetSafeTick() { uint32_t tick1, tick2; do { tick1 HAL_GetTick(); tick2 HAL_GetTick(); } while(tick1 ! tick2); // 确保读取过程中没有发生中断 return tick1; }4. 长时间运行的累计时间如果需要统计超过49天的运行时间// 扩展的64位时间统计 volatile uint64_t total_ms 0; volatile uint32_t last_tick 0; void HAL_IncTick(void) { uint32_t current uwTick; uwTick uwTickFreq; if(current uwTick) { // 检测溢出 total_ms 0x100000000ULL; // 加上一个32位周期 } } uint64_t GetTotalMilliseconds() { return total_ms uwTick; }5. 进阶应用基于硬件定时器的高精度时间管理对于需要更高精度或更长计时周期的应用可以结合多个定时器主从定时器级联主定时器配置为溢出时间1秒从定时器用于微秒级计数每次主定时器中断时记录从定时器的状态// 定时器级联配置示例TIM1主TIM2从 TIM_MasterConfigTypeDef master { .MasterOutputTrigger TIM_TRGO_UPDATE, .MasterSlaveMode TIM_MASTERSLAVEMODE_ENABLE }; HAL_TIMEx_MasterConfigSynchronization(htim1, master); TIM_SlaveConfigTypeDef slave { .SlaveMode TIM_SLAVEMODE_EXTERNAL1, .InputTrigger TIM_TS_ITR0 }; HAL_TIM_SlaveConfigSynchronization(htim2, slave);RTC与SysTick结合用RTC记录日历时间SysTick处理毫秒级计时系统启动时同步两者动态调整策略根据运行时间自动切换计时策略短期任务使用SysTick长期统计使用RTC或扩展计数器在电机控制项目中我们曾遇到一个棘手的问题系统运行约50天后位置跟踪突然出现跳变。最终发现是开发者在计算位置积分时错误地使用了有符号数运算。改为无符号数处理后问题立即消失。这个教训让我们深刻认识到理解数据类型的底层行为有时比算法本身更重要。

相关文章:

别再被STM32的Tick溢出吓到了!用编码器测速的例子帮你彻底理解无符号数运算

从编码器测速到Tick溢出:STM32无符号数运算的实战解析 在嵌入式开发中,时间管理和运动控制是两大核心需求。许多开发者第一次遇到无符号数溢出问题时,往往是在调试STM32的HAL_Delay函数时——当系统运行超过49天后,uwTick变量会从…...

Unity 2022新API实战:手写一个艺术字生成器,深入理解Sprite与FontAsset底层机制

Unity 2022艺术字生成器开发指南:从Sprite到FontAsset的完整实现 在游戏UI设计中,艺术字是提升视觉表现力的重要元素。传统字体往往难以满足个性化需求,而使用图片作为字体又面临字符映射和动态生成的挑战。本文将带你深入Unity 2022的Sprite…...

Win11Debloat终极指南:快速清理Windows系统的免费优化工具完整教程

Win11Debloat终极指南:快速清理Windows系统的免费优化工具完整教程 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to decl…...

从‘闲鱼’到校园:拆解一个二手交易平台需要哪些UML图?我的踩坑与优化心得

从‘闲鱼’到校园:拆解一个二手交易平台需要哪些UML图?我的踩坑与优化心得 去年夏天,当我第一次在宿舍楼下看到毕业生们摆摊处理二手教材和电器时,一个想法突然击中了我——为什么不能把这些交易搬到线上?三个月后&…...

监管沙盒实测数据:Dify问答响应延迟>800ms时,合规风险指数飙升270%——审计时效性红线首度公开

更多请点击: https://intelliparadigm.com 第一章:监管沙盒实测数据揭示的合规时效性临界点 在金融与数据密集型行业的监管沙盒实测中,合规响应时间并非线性衰减,而是存在明确的时效性临界点——当业务请求从发起至完成全链路合规…...

深入Serv-U密码机制:从加密算法到安全实践,教你手动生成合规密码(附MD5工具)

Serv-U密码机制深度解析:从加密原理到安全加固实战 在FTP服务器管理领域,Serv-U以其稳定性和易用性长期占据重要地位。但鲜为人知的是,其独特的密码加密机制背后隐藏着一套精巧的安全设计逻辑。本文将带您深入Serv-U的密码世界,不…...

Dify 2026多模态集成终极 checklist:涵盖17个合规性节点、8类GPU显存泄漏模式、5种跨模态token截断策略

更多请点击: https://intelliparadigm.com 第一章:Dify 2026多模态集成全景概览 Dify 2026标志着低代码AI应用平台正式迈入原生多模态协同时代。其核心架构不再将文本、图像、音频与视频视为独立通道,而是通过统一的语义对齐中间表示&#x…...

别再让大PDF卡死你的页面了!用pdfjs配合这个‘延时队列’技巧,2秒出首屏

大PDF加载优化实战:用延时队列破解首屏卡顿难题 每次打开几十兆的PDF文档,看着那个转个不停的小圈圈,你是不是也和我一样想砸键盘?特别是当用户急着查看合同第一页时,却要被迫等待全部400页加载完成——这种反人类的体…...

Humaboam:AI与人类协同的实时招聘板架构与API实战指南

1. 项目概述:一个由AI与人类共同驱动的实时招聘板 如果你正在寻找一个能提供真实、新鲜、且经过验证的招聘信息的平台,那么Humaboam(原名openclaw-human-job-board)绝对值得你花时间深入了解。这不是一个简单的信息聚合器&#x…...

DLSS Swapper:游戏性能优化神器,一键升级DLSS版本提升帧率

DLSS Swapper:游戏性能优化神器,一键升级DLSS版本提升帧率 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper 是一款专为游戏玩家设计的智能工具,它能让你轻松管理游戏中的…...

GARbro终极指南:专业级视觉小说资源解析工具深度解析

GARbro终极指南:专业级视觉小说资源解析工具深度解析 【免费下载链接】GARbro Visual Novels resource browser 项目地址: https://gitcode.com/gh_mirrors/ga/GARbro GARbro是一款专为视觉小说爱好者和游戏资源开发者设计的专业资源浏览器,提供超…...

TweetNugget:基于OpenClaw的命令行灵感金句分发工具

1. 项目概述:一个为命令行注入灵感的工具在信息过载的时代,我们每天被海量的推文、文章和观点淹没,但真正能触动心灵、激发思考的“金句”却像沙里淘金一样难寻。TweetNugget 这个项目,就是为了解决这个痛点而生的。它不是一个复杂…...

【Docker 27 AI调度核弹级配置】:20年资深架构师亲授——5大智能调度策略+3类GPU感知编排公式,错过即落后AI运维代际

更多请点击: https://intelliparadigm.com 第一章:Docker 27 AI容器智能调度配置全景概览 Docker 27 引入了原生 AI 驱动的容器调度引擎(AI-Scheduler),通过嵌入轻量级推理模型实时分析工作负载特征、资源历史趋势与节…...

给你的随身WIFI(Mobian/Debian)装个“应用商店”:从换阿里源到必备工具包一键配置

打造随身WIFI的Linux应用生态:从镜像加速到开发工具链部署 把随身WIFI刷成Debian/Mobian系统只是第一步,真正让它成为得心应手的开发工具,需要构建完整的软件生态。就像新手机到手后第一件事是配置应用商店和基础APP,这个不到100克…...

ArcGIS 10.8安装避坑实录:从下载到汉化,我踩过的雷都帮你填平了

ArcGIS 10.8实战安装指南:避坑技巧与深度优化 第一次接触ArcGIS 10.8的安装过程时,我像大多数新手一样低估了它的复杂性。直到连续三个晚上被各种报错折磨得焦头烂额后,才意识到这远不是简单的"下一步"点击游戏。本文将分享我从多次…...

别再只盯着CNN和RNN了!用PyTorch手把手教你搞定图卷积神经网络(GCN)节点分类

图卷积神经网络实战:从PyTorch代码到社交网络分析 如果你曾经尝试用传统深度学习模型处理社交网络、推荐系统或分子结构数据,可能会发现CNN和RNN在这些场景下表现平平。这不是模型不够强大,而是它们天生不适合处理图结构数据。想象一下&#…...

别让银行卡里的数字,锁死了你人生的带宽

上周二,北京刮起了大风,气温也降了好几度。我在大兴一个老同事老李家里喝茶。老李以前是电信局出来的硬核老兵,现在在一家SaaS公司做技术总监。那天他坐在一张紫檀木椅子上,手里盘着两枚核桃,眼神却直勾勾地盯着手机里…...

Spatial-SSRL-4B模型:自监督三维场景理解技术突破

1. 项目背景与核心价值最近在计算机视觉领域,空间理解能力正成为评估模型性能的重要指标。我们团队开发的Spatial-SSRL-4B模型在多项空间理解基准测试中取得了突破性进展,特别是在三维场景重建和物体空间关系推理任务上表现尤为突出。这个4B参数规模的模…...

告别官方服务器!用自建ZeroTier Planet为你的Homelab打造超低延迟私有网络(Windows/macOS/Linux全平台客户端配置指南)

自建ZeroTier Planet服务器:构建高性能私有网络的终极指南 想象一下,你正在与异地队友联机游戏,却因官方服务器中转导致延迟飙升;或是深夜调试Homelab设备时,被缓慢的远程连接折磨得失去耐心。这些问题背后&#xff0…...

用Python和Pandas玩转GDELT全球新闻数据库:从数据下载到初步分析的保姆级教程

用Python和Pandas玩转GDELT全球新闻数据库:从数据下载到初步分析的保姆级教程 全球新闻事件数据库(GDELT)为研究者提供了一个独特的窗口,能够实时观察世界各地的社会动态。这个庞大的数据库记录了自1979年以来的新闻事件&#xf…...

Multisim教育版元件库保姆级使用指南:从虚拟器件到真实元件的快速上手

Multisim教育版元件库深度实战指南:从理论到三维仿真的高效探索 第一次打开Multisim教育版时,面对左侧密密麻麻的元件分类图标,我的鼠标指针在空中犹豫了至少三分钟——就像站在自助餐厅琳琅满目的取餐台前,明明饿得发慌却不知从哪…...

你的IoT设备数据丢过吗?聊聊AT24Cxx这类EEPROM的选型、寿命与数据保护策略

你的IoT设备数据丢过吗?聊聊AT24Cxx这类EEPROM的选型、寿命与数据保护策略 去年参与一个智能农业监测项目时,我们遇到过这样的问题:部署在田间的数百个传感器节点中,有5%的设备在运行半年后出现了配置信息丢失的情况。排查后发现…...

Adobe Illustrator脚本集合:设计师工作效率提升10倍的秘密武器

Adobe Illustrator脚本集合:设计师工作效率提升10倍的秘密武器 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否曾为Illustrator中重复繁琐的操作而烦恼&#xff1…...

Dify工业检索响应超时?不是算力问题——而是这6个元数据字段未标准化!(附GB/T 20984-2022合规映射表)

更多请点击: https://intelliparadigm.com 第一章:Dify工业检索响应超时的本质归因 Dify 在工业级 RAG 场景中出现的检索响应超时,往往并非单一环节故障,而是多层协同失配引发的系统性退化。其本质归因可解耦为三类核心矛盾&…...

Embedding 模型选型与向量化实战:从 BERT 到多模态

系列导读 你现在看到的是《RAG 检索增强生成系统设计:从原理到生产级部署的完整实践》的第 3/10 篇,当前这篇会重点解决:帮助读者在众多 Embedding 模型中做出理性选择,并掌握高效向量化的工程技巧。 上一篇回顾:第 2 篇《文档切分的艺术:Chunk 策略对检索质量的决定性…...

告别重复造轮子,用快马高效生成集成路径规划和热力图的地图模块

最近在开发一个需要集成地图功能的小项目时,发现每次都要从零开始写各种地图相关的功能特别费时间。特别是路径规划和热力图这种常用功能,虽然各大平台都有API文档,但每次都要重新查文档、调试参数,效率实在太低。后来尝试用InsCo…...

Anno 1800 Mod Loader终极指南:5个步骤打造个性化游戏体验

Anno 1800 Mod Loader终极指南:5个步骤打造个性化游戏体验 【免费下载链接】anno1800-mod-loader The one and only mod loader for Anno 1800, supports loading of unpacked RDA files, XML merging and Python mods. 项目地址: https://gitcode.com/gh_mirrors…...

Dify农业知识库离线版上线倒计时!仅剩72小时——附赠已通过农业农村部备案的NLP微调参数包

更多请点击: https://intelliparadigm.com 第一章:Dify农业知识库本地化部署案例 在智慧农业数字化转型中,构建可离线运行、数据主权可控的本地化AI知识库至关重要。Dify 作为开源大模型应用开发平台,凭借其低代码编排能力与模块…...

RevokeMsgPatcher:Windows平台防撤回补丁终极指南

RevokeMsgPatcher:Windows平台防撤回补丁终极指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/Gi…...

智能考勤自动化:跨设备远程打卡系统架构解析

智能考勤自动化:跨设备远程打卡系统架构解析 【免费下载链接】AutoDingding 钉钉自动打卡 项目地址: https://gitcode.com/gh_mirrors/au/AutoDingding 在数字化转型浪潮中,企业考勤管理面临着异地办公、多设备协同、数据安全等多重挑战。AutoDin…...