主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
舵机控制 | 电路连接,驱动原理,驱动程序,调用控制。 | 能写入角度值,为小车开发做准备。 |
师从洋桃电子,杜洋老师
📑文章目录
- 一、PWM控制舵机原理
- 1.1 舵机控制信号特性
- 1.2 定时器PWM模式
- 二、硬件系统架构
- 2.1 硬件连接方案
- 三、核心代码解析
- 3.1 主程序逻辑框架
- 3.2 PWM初始化函数详解
- 四、关键技术点解析
- 4.1 周期与占空比计算
- 4.2 重映射配置
- 五、扩展应用设计
- 5.1 多通道舵机控制
- 5.2 中央对齐模式应用
- 六、调试与优化
- 6.1 示波器测量要点
- 6.2 常见问题排查
- 七、相关资源
▲ 回顾上期🔍STM32驱动SG90舵机全攻略:从原理到代码实现(上) | 零基础入门STM32第八十二步
▲ 回顾上期🔍STM32驱动SG90舵机全攻略:从波形生成到实战应用(中上) | 零基础入门STM32第八十三步
一、PWM控制舵机原理
1.1 舵机控制信号特性
典型舵机控制信号参数:
参数 | 数值范围 | 对应角度 |
---|---|---|
周期 | 20ms (50Hz) | 固定不变 |
高电平时间 | 0.5ms-2.5ms | 0°-180° |

1.2 定时器PWM模式
STM32提供两种PWM模式:
/* PWM模式选择 */
TIM_OCMode_PWM1: 向上计数CNT<CCR有效,向下计数CNT>CCR无效
TIM_OCMode_PWM2: 向上计数CNT<CCR无效,向下计数CNT>CCR有效
二、硬件系统架构
2.1 硬件连接方案
模块 | 连接引脚 | 功能说明 |
---|---|---|
舵机信号线 | PB0 (TIM3_CH3) | PWM信号输出 |
OLED显示屏 | I2C接口 | 角度显示 |
触摸按键 | 独立GPIO | 角度选择控制 |
三、核心代码解析
3.1 主程序逻辑框架
int main(void) {// 系统初始化RCC_Configuration(); // 时钟配置TIM3_PWM_Init(59999,23); // PWM初始化(20ms周期)while(1) {// 按键扫描与角度设置if(按键A按下) Set_Angle(0); // 0.5msif(按键B按下) Set_Angle(45); // 1.5msif(按键C按下) Set_Angle(90); // 2.0ms if(按键D按下) Set_Angle(180); // 2.5ms}
}void Set_Angle(uint8_t angle) {uint16_t pulse = 1500 + angle*33; // 角度转脉冲计算TIM_SetCompare3(TIM3, pulse); // 修改CCR寄存器值
}
3.2 PWM初始化函数详解
void TIM3_PWM_Init(u16 arr, u16 psc) {// GPIO配置GPIO_InitTypeDef GPIO_InitStruct = {.GPIO_Pin = GPIO_Pin_0,.GPIO_Mode = GPIO_Mode_AF_PP, // 复用推挽输出.GPIO_Speed = GPIO_Speed_50MHz};GPIO_Init(GPIOB, &GPIO_InitStruct);// 定时器基础配置TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct = {.TIM_Period = arr, // 自动重装载值.TIM_Prescaler = psc, // 预分频系数.TIM_CounterMode = TIM_CounterMode_Up // 向上计数模式};TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);// PWM通道配置TIM_OCInitTypeDef TIM_OCInitStruct = {.TIM_OCMode = TIM_OCMode_PWM1,.TIM_OCPolarity = TIM_OCPolarity_High,.TIM_OutputState = TIM_OutputState_Enable};TIM_OC3Init(TIM3, &TIM_OCInitStruct);TIM_Cmd(TIM3, ENABLE); // 启动定时器
}
四、关键技术点解析
4.1 周期与占空比计算
计算公式:
示例参数分析:
TIM3_PWM_Init(59999, 23);
/*
TIM_CLK = 72MHz
T = (59999+1)*(23+1)/72,000,000 = 0.02s (50Hz)
脉冲分辨率 = 20ms / (59999+1) ≈ 0.33μs
*/
4.2 重映射配置
// 重映射配置函数
void GPIO_Remap_Config(void) {GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); // 部分重映射/* 默认通道映射:TIM3_CH1 -> PA6部分重映射:TIM3_CH1 -> PB4*/
}
五、扩展应用设计
5.1 多通道舵机控制
// 扩展TIM3其他通道
#define SERVO_NUM 3
uint16_t servo_pins[SERVO_NUM] = {GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_4};void Multi_Servo_Init(void) {for(int i=0; i<SERVO_NUM; i++) {GPIO_Init(GPIOB, servo_pins[i]); // 初始化多个PWM输出}// 配置各通道比较寄存器
}
5.2 中央对齐模式应用
// 配置中央对齐模式
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
/*
模式特点:
- 减少电机噪声
- 生成对称PWM波形
- 适合电机控制场景
*/
六、调试与优化
6.1 示波器测量要点
测量参数 | 预期值 | 调整方法 |
---|---|---|
PWM周期 | 20ms ±1% | 修改arr/psc参数 |
脉冲宽度 | 0.5-2.5ms | 调整CCR寄存器值 |
上升沿时间 | <1μs | 检查GPIO速度设置 |
6.2 常见问题排查
现象 | 可能原因 | 解决方案 |
---|---|---|
舵机无反应 | PWM极性设置错误 | 检查TIM_OCPolarity配置 |
角度控制不准确 | 脉冲计算错误 | 校验角度转换公式 |
多通道干扰 | 重映射配置冲突 | 检查AFIO重映射设置 |
七、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] PWM驱动舵机程序
[5] 定时器PWM程序分析.pptx
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨定时器PWM程序分析2,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-25)