1. 项目概述:TIM3定时器PWM控制舵机实验
在嵌入式开发领域,PWM(脉冲宽度调制)信号控制舵机是最基础也最实用的技能之一。我最近用STM32F103的标准库完成了一个TIM3定时器生成PWM波控制舵机的实验,这个方案可以直接移植到各种需要角度控制的场景,比如机器人关节、摄像头云台或者智能家居中的窗帘控制。
标准库虽然不如HAL库那么"傻瓜式",但执行效率更高,对硬件资源的控制也更直接。选择TIM3是因为在STM32F103C8T6这类中容量产品上,TIM3是通用定时器中功能完整且引脚分配灵活的一个。实验中我用的舵机是常见的SG90,它的控制信号是周期20ms(50Hz),脉宽0.5ms-2.5ms对应0-180度转角。
2. 硬件设计与环境搭建
2.1 硬件连接要点
我的实验平台是STM32F103C8T6最小系统板,舵机信号线接在PA6引脚(TIM3_CH1)。硬件连接有三个关键细节:
- 一定要单独给舵机供电!单片机IO口的驱动能力有限,直接供电可能导致复位或电压跌落
- 共地处理:舵机GND必须与开发板GND连接
- 信号线长度不宜超过30cm,过长可能引入干扰
注意:如果出现舵机抖动现象,可以先尝试在信号线靠近舵机端加一个100nF的电容滤波
2.2 开发环境配置
使用Keil MDK 5.25开发,需要准备:
- 标准外设库文件:STM32F10x_StdPeriph_Lib_V3.5.0
- 在工程选项中勾选"Use MicroLIB"以减小代码体积
- 调试接口建议用SWD,比JTAG节省引脚
时钟树配置如下:
- HSE 8MHz外部晶振
- PLL倍频到72MHz系统时钟
- APB1总线时钟36MHz(TIM3挂载在此总线上)
3. PWM信号生成实现细节
3.1 定时器基础配置
TIM3的初始化分为三个关键步骤:
c复制// 1. 时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2. GPIO配置
GPIO_InitTypeDef GPIO_InitStructure;
