You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F103C8T6的TIM4 CH1生成指定参数PWM的配置疑问

STM32F103C8T6 TIM4 CH1 50Hz PWM配置指南(1.5-2ms脉宽)

一、确认20ms周期的配置正确性

你当前用PSC=1440、ARR=1000的计算,实际得到的频率为:

Frequency = 72MHz / [(1440+1)*(1000+1)] ≈ 49.95Hz

对应周期≈20.02ms,误差极小,完全满足需求。如果要精确50Hz/20ms周期,可以调整参数为:PSC=1439、ARR=999,此时:

(1439+1)*(999+1) = 1440*1000 = 1440000
Frequency = 72MHz / 1440000 = 50Hz

这样周期刚好是20ms,后续脉宽计算也更直观。

二、计算TIM4->CCR1的取值(对应1.5-2ms脉宽)

核心是计算每个定时器计数单位对应的时间:
以精确的PSC=1439、ARR=999为例,整个周期20ms对应1000个计数步(从0到999),每个步长的时间为:

20ms / 1000 = 20μs/步

由此可得:

  • 1.5ms脉宽对应计数数:1.5ms / 20μs = 75 → 设置TIM4->CCR1 = 75
  • 2ms脉宽对应计数数:2ms / 20μs = 100 → 设置TIM4->CCR1 = 100

如果用你最初的PSC=1440、ARR=1000,每个步长≈20.02μs,1.5ms对应≈74.9,取整75即可,误差可忽略。

三、完整寄存器级配置步骤

1. 开启时钟

// 开启TIM4时钟(APB1总线)
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
// 开启GPIOB时钟(TIM4 CH1对应PB6)
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;

2. 配置PB6为复用推挽输出

TIM4 CH1是复用功能引脚,需设置为复用推挽模式:

GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6); // 清空原有配置
GPIOB->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1; // 50MHz输出速度
GPIOB->CRL |= GPIO_CRL_CNF6_1; // 复用推挽输出

3. 配置TIM4基础参数

// 精确50Hz版本
TIM4->PSC = 1439;
TIM4->ARR = 999;

// 或者用你最初的参数
// TIM4->PSC = 1440;
// TIM4->ARR = 1000;

4. 配置PWM模式(模式1)

选择PWM模式1(向上计数时,计数器值<CCR1时输出有效电平),并开启CCR1预装载:

TIM4->CCMR1 &= ~TIM_CCMR1_OC1M; // 清空OC1M位
TIM4->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM模式1
TIM4->CCMR1 |= TIM_CCMR1_OC1PE; // 开启CCR1预装载

5. 开启CH1输出并设置脉宽

TIM4->CCER |= TIM_CCER_CC1E; // 开启TIM4 CH1输出
TIM4->CCR1 = 75; // 初始1.5ms脉宽,可动态修改为75-100之间的值

6. 启动定时器

TIM4->CR1 |= TIM_CR1_CEN; // 开启TIM4计数

四、关键注意事项

  • PWM模式选择:如果需要低电平有效,可改用PWM模式2,此时计数器值>CCR1时输出有效电平,CCR1取值逻辑不变。
  • 动态调整脉宽:程序运行中直接修改TIM4->CCR1的值即可实时改变脉宽,无需重启定时器。

内容的提问来源于stack exchange,提问作者M0000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:10:38