STM32F4定时器TIMx CHx输出比较模式配置及参数计算疑问
STM32F4定时器输出比较模式参数配置与多通道独立控制问题
核心需求
- 将STM32F4系列TIMx的CHx(CH1/CH2/CH3/CH4)配置为输出比较模式,通过对应通道的CCRx(配置参数中对应
Pulse值)独立控制每个通道的脉冲Ton时长 - 多通道配置时保持PSC(预分频器)不变,仅通过各通道的
Pulse值调整Ton时长
现有问题与困惑
- 参数计算逻辑混乱:对PSC、ARR(自动重装载寄存器)、
Pulse三者的关联计算理解不清,网上公式多样导致验证结果不匹配 - 实测异常现象:曾用
SYSCLK=100MHz、APB1/APB2=100MHz、PSC=9、ARR=99、Pulse=0生成10μs脉冲,但修改Pulse值不影响Ton时长,仅调整PSC有效 - 计算矛盾点:尝试计算10μs脉冲参数时,按公式得出
PSC=999、ARR=0,逻辑无法自洽 - 多通道控制疑问:已用
PSC=9、ARR=9配置CH1生成1μs脉冲,如何在保持PSC和ARR不变的情况下,让CH2生成1ms脉冲
关键原理梳理
定时器输出比较模式(OC)的核心逻辑:
- 定时器计数器CNT从0开始递增计数,到达ARR值时自动重载清零
- 输出通道的电平状态由CNT与CCRx(即配置中的
Pulse值)的比较结果决定:
若配置为「CNT < CCRx时输出高电平,CNT >= CCRx时输出低电平」(对应PWM1模式),则Ton时长等于CCRx个定时器计数周期 - 定时器计数周期公式:
T_cnt = (PSC + 1) / TIMx_CLK,其中TIMx_CLK在APB预分频系数为1时等于对应APB时钟(本例为100MHz)
参数计算与问题解决
1. 为什么之前修改Pulse无效?
你之前的配置中Pulse=0,意味着CNT从0开始就满足CNT >= CCRx,输出直接拉低,实际Ton时长由PSC和ARR决定——这是因为未正确配置输出比较的触发逻辑。必须将通道配置为PWM1模式,才能让Pulse(CCRx)真正控制Ton时长。
2. 正确的参数计算步骤
以SYSCLK=100MHz、APBx=100MHz为例:
- 确定计数周期:先设置PSC,计算
T_cnt = (PSC + 1) / 100MHz - 计算
Pulse值:Pulse = Ton / T_cnt(Ton为目标脉冲高电平时长) - 设置ARR:ARR需≥
Pulse值,确保CNT在到达ARR前先触发电平翻转,Ton完全由Pulse控制(ARR决定的是脉冲的重复周期)
3. 实例验证
配置CH1生成1μs Ton脉冲
- 设
PSC=9,则T_cnt = (9+1)/100MHz = 0.1μs - Ton=1μs,因此
Pulse = 1μs / 0.1μs = 10 - 设
ARR=200(只要≥100即可,此处定义脉冲重复周期为20μs) - 通道配置为PWM1模式,此时CH1输出高电平1μs,低电平19μs
保持PSC=9、ARR=10000,配置CH2生成1ms Ton脉冲
- 保持
PSC=9,T_cnt=0.1μs不变 - Ton=1ms=1000μs,因此
Pulse = 1000μs / 0.1μs = 10000 - 设
ARR=20000(确保ARR≥10000,定义脉冲重复周期为2ms) - CH2同样配置为PWM1模式,即可实现1ms高电平、1ms低电平的脉冲
4. 解决之前的计算困惑
你之前错误地将ARR与Ton绑定,实际上ARR是定时器的重复周期,Ton由Pulse(CCRx)决定。以10μs Ton为例:
- 设
PSC=9,T_cnt=0.1μs,则Pulse=10μs/0.1μs=100 - ARR只需≥100即可(比如设ARR=200),此时Ton为10μs,重复周期为20μs
配置注意事项
- 必须将通道配置为PWM1模式(HAL库对应
TIM_OC_InitStructure.OCMode = TIM_OCMODE_PWM1),才能让Pulse值有效控制Ton时长 - 确保
ARR ≥ Pulse,否则CNT会在到达Pulse值前重载,导致Ton等于整个定时器周期 - 多通道独立控制时,PSC和ARR为全局参数,各通道可独立设置
Pulse值,只要每个通道的Pulse ≤ ARR,即可实现各自独立的Ton时长
内容的提问来源于stack exchange,提问作者Ariarikta
相关产品推荐
相关产品推荐

