主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
舵机控制 | 电路连接,驱动原理,驱动程序,调用控制。 | 能写入角度值,为小车开发做准备。 |
师从洋桃电子,杜洋老师
▲ 回顾上期STM32驱动SG90舵机全攻略:从原理到代码实现(上) | 零基础入门STM32第八十二步
▲ 回顾上期STM32驱动SG90舵机全攻略:从波形生成到实战应用(中上) | 零基础入门STM32第八十三步
典型舵机控制信号参数:
参数 | 数值范围 | 对应角度 |
---|---|---|
周期 | 20ms (50Hz) | 固定不变 |
高电平时间 | 0.5ms-2.5ms | 0°-180° |
STM32提供两种PWM模式:
/* PWM模式选择 */
TIM_OCMode_PWM1: 向上计数CNT<CCR有效,向下计数CNT>CCR无效
TIM_OCMode_PWM2: 向上计数CNT<CCR无效,向下计数CNT>CCR有效
模块 | 连接引脚 | 功能说明 |
---|---|---|
舵机信号线 | PB0 (TIM3_CH3) | PWM信号输出 |
OLED显示屏 | I2C接口 | 角度显示 |
触摸按键 | 独立GPIO | 角度选择控制 |
int main(void) {
// 系统初始化
RCC_Configuration(); // 时钟配置
TIM3_PWM_Init(59999,23); // PWM初始化(20ms周期)
while(1) {
// 按键扫描与角度设置
if(按键A按下) Set_Angle(0); // 0.5ms
if(按键B按下) Set_Angle(45); // 1.5ms
if(按键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寄存器值
}
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); // 启动定时器
}
示例参数分析:
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
*/
// 重映射配置函数
void GPIO_Remap_Config(void) {
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); // 部分重映射
/*
默认通道映射:
TIM3_CH1 -> PA6
部分重映射:
TIM3_CH1 -> PB4
*/
}
// 扩展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输出
}
// 配置各通道比较寄存器
}
// 配置中央对齐模式
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
/*
模式特点:
- 减少电机噪声
- 生成对称PWM波形
- 适合电机控制场景
*/
测量参数 | 预期值 | 调整方法 |
---|---|---|
PWM周期 | 20ms ±1% | 修改arr/psc参数 |
脉冲宽度 | 0.5-2.5ms | 调整CCR寄存器值 |
上升沿时间 | <1μs | 检查GPIO速度设置 |
现象 | 可能原因 | 解决方案 |
---|---|---|
舵机无反应 | 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)