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
相关产品推荐
相关产品推荐

