1. 预分频器:PWM波形生成的"调速器"
第一次用STM32做电机控制项目时,我被PWM频率调不准的问题折磨了整整三天。明明按照手册设置了参数,输出的波形却总是差那么几赫兹。后来才发现,问题出在对预分频器的理解不够透彻。这就像开车时只踩油门不看转速表,结果不是动力不足就是发动机嘶吼。
预分频器本质是时钟信号的"减速带",它通过整数分频将高速时钟变成适合外设工作的低频信号。以常见的72MHz系统时钟为例,直接驱动定时器会产生纳秒级计数,而电机控制通常需要kHz级别的PWM。这就好比用F1赛车引擎驱动电风扇,必须通过变速箱(预分频器)来匹配转速。
实际项目中,预分频器与自动重装载寄存器(ARR)配合工作,就像合唱团的指挥棒:
- 预分频器决定每次计数间隔(节拍快慢)
- ARR设定计数上限(每小节拍数)
- 两者共同决定输出频率(乐曲节奏)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 寄存器配置:直通硬件的钥匙
2.1 定时器寄存器解剖课
STM32的定时器就像瑞士军刀,而寄存器就是控制各个功能的开关。以TIM2为例,关键寄存器包括:
- CR1:控制计数方向(向上/向下)和使能
- PSC:预分频值寄存器(实际分频系数=PSC+1)
- ARR:自动重装载值(周期=ARR+1)
- CCR1:比较捕获寄存器(决定占空比)
配置时最容易踩的坑是忽略"寄存器值=实际值-1"这个规则。比如要7200分频,PSC要写7199。这就像给数组下标从0开始计数一样,是嵌入式开发特有的思维转换。
2.2 寄存器级配置实战
不用HAL库,直接操作寄存器反而更直观。下面是产生1kHz PWM的裸机配置:
c复制// 使能TIM2时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
// 配置预分频器(72MHz/7200 = 10kHz)
TIM2->PSC = 7199;
// 设置自动重装载值(10kHz/100 = 100Hz)
TIM2->ARR = 99;
// 配置PWM模式1(通道1)
TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
// 使能输出比较
TIM2->CCER |= TIM_CCER_CC1E;
// 启
