STM32定时器的PWM模式,从捕获/比较寄存器开始理解

发布时间:2026/7/8 0:57:17

STM32定时器的PWM模式,从捕获/比较寄存器开始理解
你有没有想过一个定时器的PWM输出说到底就是比较两个寄存器的值先看代码TIM_HandleTypeDef htim2; TIM_OC_InitTypeDef sConfigOC {0}; htim2.Instance TIM2; htim2.Init.Prescaler 71; htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 999; HAL_TIM_PWM_Init(htim2); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 500; sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1);这段代码配置完PA0引脚上会输出一个1kHz、占空比50%的方波。Prescaler71把72MHz的系统时钟先除以72得到1MHz的计数时钟。Period999意味着计数器从0走到999正好1000个计数步——1MHz / 1000 1kHz没错。Pulse500就是高电平持续500步占空比50%。一步步来先搞清楚PWM的底层是怎么运作的。核心硬件一个计数器CNT一个自动重装载寄存器ARR一个捕获/比较寄存器CCR。CNT在每个时钟脉冲后加1从0累加到ARR的值然后溢出回0如此循环。CCR里存的是比较阈值——硬件比较器在每一个时钟周期里比较CNT和CCR的大小。在PWM1模式下CNT CCR时输出有效电平CNT CCR时输出无效电平。所以方才那个配置里CNT从0走到499时输出高从500走到999时输出低。下一周期CNT回到0又重新开始。周期由ARR决定占空比由CCR决定。这两个寄存器的组合把PWM的频率和占空比完全解耦了——改频率只动ARR改占空比只动CCR互不影响。一个有意思的地方是CCR可以在运行时随时写入新值。这意味着占空比可以动态调整而且在修改的瞬间生效。做呼吸灯的话只需要在主循环里逐次改变Pulse的值uint16_t brightness 0; int8_t direction 1; while (1) { __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, brightness); brightness direction; if (brightness 999) direction -1; if (brightness 0) direction 1; HAL_Delay(2); }每次循环做一次寄存器写入LED的亮度就从暗到亮再回到暗。整个过程没有中断参与完全是硬件在背后默默地做比较。CPU每秒要跑成百上千次其他任务而PWM的精度丝毫不受影响——这就是硬件外设存在的意义。深入一步看。STM32的一个定时器里多个通道共享同一个ARR但每个通道拥有独立的CCR。这意味着我们可以用同一个定时器输出多路频率相同、占空比各自独立的PWM。驱动四路舵机或者一组RGB LED时这个设计特别实用——频率统一由ARR决定每路的脉宽单独调。不妨这样考虑如果反过来固定CCR、去读CNT的值捕获/比较单元就成了输入捕获——测量外部信号的脉宽或者周期。同一个寄存器块方向颠倒一下功能完全不同。PWM输出也好输入捕获也好一个定时器可以同时工作在多种模式下关键是理解它的工作机制。HAL库里有一个宏值得注意#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ (*(__IO uint32_t *)((__HANDLE__)-Instance-CCR1) \ (__CHANNEL__)) (__COMPARE__)本质上就是一次对CCR寄存器的内存写入。没有函数调用栈的开销没有参数校验没有状态检查。在控制BLDC电机或者做数字电源这类对响应时间有要求的场景里用这个宏直接写寄存器比调用HAL_TIM_PWM_SetPulseAnd duty要快得多。一层层函数调用下去最终做的是同一件事——往CCR写值。更深入一点高级定时器TIM1和TIM8支持互补PWM输出和可编程死区插入。做H桥驱动时上下管绝对不能同时导通死区时间就是上下管切换之间那个两路都关断的安全窗口。STM32的硬件死区发生器能精确到几个时钟周期比自己用软件延时去折腾可靠得多。从捕获/比较寄存器的视角去理解PWM整个机制其实很简洁的。频率由ARR控制占空比由CCR决定动态修改CCR就能实时调脉宽。无论用HAL库、LL库还是直接操作寄存器底层逻辑没有区别。换一个系列的MCU只要理解了比较器的工作方式上手只是换个寄存器名字的事。

相关新闻

FixMatch 与 UDA 实战:CIFAR-10 仅用 4000 标签实现 94.5% 精度的半监督图像分类

FixMatch 与 UDA 实战:CIFAR-10 仅用 4000 标签实现 94.5% 精度的半监督图像分类

2026/7/8 0:47:17

FixMatch与UDA实战:CIFAR-10半监督图像分类进阶指南1. 半监督学习的核心逻辑与价值主张当你在处理CIFAR-10这样的经典图像数据集时,最痛苦的莫过于标注成本——专业标注团队处理5万张图像可能需要数百工时。但FixMatch和UDA这类现代半监督方法告诉我们&a…

Midjourney V8.1随机风格参考功能解析与应用指南

Midjourney V8.1随机风格参考功能解析与应用指南

2026/7/8 0:47:17

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在 AI 绘画领域,Midjourney 的每一次版本更新都意味着创作效率和风格多样性的提升。V8.1 版本正式成为默认模型后&#xf…

Google Finance安卓应用评测:AI金融洞察与投资组合管理实战分析

Google Finance安卓应用评测:AI金融洞察与投资组合管理实战分析

2026/7/8 0:47:16

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看 Google Finance 全新 Android 应用的上线情况。作为 Google 在金融科技领域的最新布局,这款应用主打 AI 驱动…

ObjToSchematic:将3D模型智能转换为Minecraft建筑的完整指南

ObjToSchematic:将3D模型智能转换为Minecraft建筑的完整指南

2026/7/8 11:58:22

ObjToSchematic:将3D模型智能转换为Minecraft建筑的完整指南 【免费下载链接】ObjToSchematic A tool to convert 3D models into Minecraft formats such as .schematic, .litematic, .schem and .nbt 项目地址: https://gitcode.com/gh_mirrors/ob/ObjToSchemat…

对讲机频率规划与信道管理实操科普 哈尔滨政企通信有序应用指南

对讲机频率规划与信道管理实操科普 哈尔滨政企通信有序应用指南

2026/7/8 11:58:22

在哈尔滨及黑龙江全省政企、物业、市政、工矿、林区日常工作中,无线对讲机的通信质量,不仅取决于设备硬件性能,更依托科学的频率规划与信道管理。很多单位长期使用默认通用频率,未做专属信道划分与频段优化,极易出现同…

【Bug已解决】Claude Code --model flag not working / Wrong model in use — Claude Code 模型切换失效解决方案

【Bug已解决】Claude Code --model flag not working / Wrong model in use — Claude Code 模型切换失效解决方案

2026/7/8 11:58:22

【Bug已解决】Claude Code --model flag not working / Wrong model in use — Claude Code 模型切换失效解决方案 1. 问题描述 使用 --model 参数或 /model 命令切换模型时,Claude Code 仍然使用旧模型: # --model 参数不生效 $ claude --model sonnet …

基于ICM-42605和PIC18F26J11的6DOF运动追踪系统设计

基于ICM-42605和PIC18F26J11的6DOF运动追踪系统设计

2026/7/8 11:58:22

1. 项目背景与核心需求解析 在当今的智能硬件和物联网领域,精确追踪物体在三维空间中的运动和方向已成为许多应用的基础需求。无论是无人机飞控、VR/AR设备交互,还是工业机器人末端执行器的精确定位,都需要实时获取物体的6自由度(…

服装店想少压货,先算清这笔库存账

服装店想少压货,先算清这笔库存账

2026/7/8 11:58:22

做服装店的老板,几乎都经历过压货带来的焦虑。新款上市前信心满满,结果卖不动,库存堆了一屋子;好不容易等到季末促销,又发现热卖的货早早断码,补单又来不及。压货,本质上是库存计划和销售节奏没…

L9958与PIC18F97J94组合在电机控制中的优势与实践

L9958与PIC18F97J94组合在电机控制中的优势与实践

2026/7/8 11:48:22

1. 为什么选择L9958与PIC18F97J94组合在电机控制领域,芯片选型直接决定了系统性能上限。L9958作为意法半导体(ST)推出的多通道电机驱动芯片,其核心优势在于集成了4个独立的H桥驱动器,每个通道可提供高达1.5A的持续输出电流。这种设计允许单个…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/8 0:44:47

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/8 6:29:42

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/7 13:20:59

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

2026/7/8 0:07:15

1. 项目概述:这不是又一个笔记软件教程,而是一套可复用的“认知操作系统”搭建逻辑你有没有试过,在读完Andrej Karpathy那篇著名的《Software 2.0》之后,满脑子都是“神经网络即代码”的震撼,但合上网页,打…

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

2026/7/8 0:07:15

校园服饰细分赛道测算程序(Python)——学生平价国风 & 机能穿搭市场规模预估(TAM / SAM / SOM)一、实际应用场景描述(真实业务抽象)在《时尚产业与品牌创新》课程中,细分市场切入&#xff0…

Visual C++运行库完整解决方案:告别软件兼容性问题

Visual C++运行库完整解决方案:告别软件兼容性问题

2026/7/8 0:07:15

Visual C运行库完整解决方案:告别软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾为打开游戏时弹出的"DLL缺失"错误…