尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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只要理解了比较器的工作方式上手只是换个寄存器名字的事。
RELATED

相关推荐

S2B2B系统开发服务商推荐:2026年最新测评

S2B2B系统开发服务商推荐:2026年最新测评

一、2026年S2B2B系统发展现状与技术趋势在数字经济与产业互联网深度融合的2026年,S2B2B(Supply Chain Platform to Business to Business)模式已从传统的供应链整合工具进化为驱动产业生态重构的核心操作系统。随着全球B2B电商市场规模突破36…

📅 2026/11/4 15:21:20
A3910与PIC18LF46K22电机驱动方案详解

A3910与PIC18LF46K22电机驱动方案详解

1. 认识A3910与PIC18LF46K22这对黄金搭档在嵌入式控制领域,电机驱动与微控制器的组合就像赛车引擎与驾驶员的配合。A3910作为一款高性能全桥电机驱动芯片,能够输出高达2A的持续电流(峰值可达3A),而PIC18LF46K22则是Mic…

📅 2026/9/16 1:42:00
QRazyBox终极指南:免费修复无法扫描的二维码

QRazyBox终极指南:免费修复无法扫描的二维码

QRazyBox终极指南:免费修复无法扫描的二维码 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾面对一张模糊、破损或部分缺失的二维码束手无策?QRazyBox正是为解…

📅 2026/9/7 1:51:21
MORE NEWS

更多资讯

📰

从零搭建AI工程能力:避开项目初始化与数据处理中的常见陷阱

1. 从零搭建AI工程能力,为什么大多数人卡在第一步就放弃了很多人对“AI工程”这四个字的理解,停留在“会调个API、跑个demo”的层面。我刚开始接触这个方向的时候也是这么想的——装个环境、拉个开源模型、跑通一个推理脚本,就觉得自己摸到门…

📰

自动化立体仓库规划:从参数计算到刚性约束的闭环设计方法

简介:本资源是一份面向物流工程、智能仓储系统设计人员及高校相关专业师生的《自动化立体仓库规划与评估》实务指南,聚焦现代物流系统中高密度存储与高效作业的核心痛点。文档系统梳理了立体仓库的五大核心优势(空间利用率提升、作业效率跃升…

📰

STM32 SMBus从零配置:时序、PEC校验与总线恢复实战

SMBus 这个总线,很多做嵌入式的朋友都是“先听说、后踩坑”。它长得跟 I2C 几乎一模一样,两根线一挂,时序图看上去也没什么差别,于是不少人第一次遇到 SMBus 设备的时候,直接拿普通 I2C 的初始化代码怼上去&#xff0c…

📰

Superpowers 技能框架:让 Claude Code 与 Codex CLI 更靠谱地写代码

1. 从“superpowers”说起:这套技能框架到底在解决什么问题第一次看到“superpowers”这个词,很多人会以为是某个超级英雄题材的游戏或者插件。但如果你最近在折腾 Claude Code、Codex CLI 这类命令行 AI 编程工具,大概率已经在各种社区里刷到…

📰

县域中心药房:数字化药品供应链管理实践

1. 中心(云)药房的概念与背景中心(云)药房,全称"县域医疗卫生共同体中心药房(云药房)",是近年来医药卫生体制改革中涌现出的创新模式。简单来说,它就像是一个县…

📰

MySQL查询生命周期与性能优化全解析

1. 一条SQL查询的生命周期探秘当你在MySQL客户端敲下SELECT * FROM users WHERE id1;并按下回车时,这条看似简单的查询语句实际上经历了一场精心编排的数据库交响乐。作为从业十余年的数据库工程师,今天我想带大家深入MySQL内核,看看这条查询…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬