1. TIMER定时器进阶应用概览
STM32的TIMER定时器功能远比简单的定时计数强大得多。在实际项目中,我们经常需要用到PWM信号控制电机转速、通过输入捕获测量脉冲宽度、或者利用编码器接口读取旋转设备的位置信息。这些高级功能才是TIMER定时器真正大显身手的地方。
记得我第一次用STM32做四轴飞行器项目时,需要同时控制四个无刷电机的转速。当时就是靠着TIMER的PWM输出功能,配合MOSFET驱动电路,实现了电机的精准调速。后来在做工业传感器采集时,又用输入捕获功能测量了各种传感器的脉冲信号。这些实战经历让我深刻体会到,掌握TIMER的进阶应用是STM32开发者的必备技能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PWM信号生成实战
2.1 PWM工作原理深度解析
PWM(脉冲宽度调制)是定时器最经典的应用之一。它的核心原理就像是一个高速开关的水龙头:通过调节开关开启和关闭的时间比例,来控制水流的大小。在电子电路中,这个"水流"就变成了电压的平均值。
具体到STM32的TIMER实现,PWM生成主要依赖三个关键寄存器:
- ARR(自动重装载寄存器):决定PWM波的周期
- CCRx(捕获/比较寄存器):决定PWM波的占空比
- CNT(计数器):实时计数值
当CNT计数到CCRx值时,输出电平翻转;计数到ARR值时,CNT复位并重新开始计数。通过调整CCRx与ARR的比值,就能得到不同占空比的PWM波。
2.2 标准库PWM配置步骤
下面以TIM3的通道1输出PWM为例,展示完整的配置过程:
c复制void TIM3_PWM_Init(uint16_t arr, uint16_t psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // PA6对应TIM3_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 定时器基础配置
TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// PWM模式配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
// 使能预装载寄存器
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
// 启动定时器
TIM_Cmd(TIM3, ENABLE);
}
使用时,可以通过以下函数动态调整占空比:
c复制void TIM3_SetDutyCycle(uint16_t duty)
{
TIM_SetCompare1(TIM3, duty);
}
2.3 PWM应用中的常见问题
在实际项目中,有几个坑我踩过多次:
- GPIO复用功能未正确配置:PWM输出需要将GPIO设置为复用推挽输出模式,很多新手会漏掉这一步
- 预装载寄存器未启用:如果不启用ARR和CCRx的预装载,修改参数时会产生毛刺
- 频率计算错误:PWM频率由ARR和PSC共同决定,公式为:Fpwm = Fcl
