STM32驱动SG90舵机全解析:入门到精通的实战教程(上)
主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
舵机控制 | 电路连接,驱动原理,驱动程序,调用控制。 | 能写入角度值,为小车开发做准备。 |
师从洋桃电子,杜洋老师
📑文章目录
一、SG90舵机核心特性
1.1 基本参数
(图1:SG90示意图)
1.2 硬件连接方案
/* 典型接线定义 */
#define SERVO_PWM_PIN GPIO_Pin_15 // PA15作为PWM输出
#define SERVO_VCC 5V电源 // 独立供电
#define SERVO_GND 共地 // 必须与单片机共地
二、PWM控制原理深度解析
2.1 角度-脉宽对应关系
2.2 波形时序分析
角度 | 高电平时间 | 低电平时间 | 总周期 |
---|---|---|---|
0° | 0.5ms | 19.5ms | 20ms |
90° | 1.5ms | 18.5ms | 20ms |
180° | 2.5ms | 17.5ms | 20ms |
三、驱动程序实现分析
3.1 GPIO初始化配置
void SG90_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = SERVO_PWM_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SERVO_PORT, &GPIO_InitStruct);
}
3.2 角度控制函数解析
void SG90_angle(u8 angle) {
uint16_t high_time = 500 + angle * 11; // 0.5ms基准+角度换算
GPIO_SetBits(SERVO_PORT, SERVO_PWM_PIN);
delay_us(high_time); // 高电平持续时间
GPIO_ResetBits(SERVO_PORT, SERVO_PWM_PIN);
delay_us(20000 - high_time); // 低电平补足周期
}
四、关键应用电路设计
4.1 电源系统设计
4.2 信号整形电路
// 可选RC滤波电路参数
#define R_VALUE 100 // 单位Ω
#define C_VALUE 0.1 // 单位μF
五、工程实践注意事项
5.1 校准调试技巧
-
零点校准:
SG90_angle(0); // 理论0° // 实际测量后调整偏移量 high_time = 500 + calib_value;
-
满量程校准:
SG90_angle(180); // 理论180° // 机械限位检测调整
5.2 常见问题排查
现象 | 可能原因 | 解决方案 |
---|---|---|
舵机无反应 | 电源未接通 | 检查VCC-GND电压 |
角度偏差大 | 机械安装错位 | 重新校准零点 |
电机发热 | 堵转或过载 | 减少负载或增加散热 |
抖动严重 | PWM信号不稳定 | 添加硬件滤波电路 |
六、扩展应用设计
6.1 多舵机协同控制
// 使用定时器PWM输出(TIM3示例)
void TIM3_PWM_Init(void) {
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
// 时基配置
TIM_InitStruct.TIM_Period = 1999; // 20ms周期
TIM_InitStruct.TIM_Prescaler = 71; // 72MHz/72=1MHz
TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
// PWM通道配置
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 50; // 初始0.5ms
TIM_OC1Init(TIM3, &TIM_OCInitStruct);
TIM_Cmd(TIM3, ENABLE);
}
6.2 角度平滑过渡算法
void Smooth_Rotate(uint8_t target_angle) {
static uint8_t current_angle = 0;
while(current_angle != target_angle) {
current_angle += (current_angle < target_angle) ? 1 : -1;
SG90_angle(current_angle);
delay_ms(20); // 控制旋转速度
}
}
七、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] 延时函数驱动舵机程序
[5] 舵机原理与驱动.pptx
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨定时器PWM原理,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:v1.0 初始版本(2025-03-24)
作者:触角01010001