目录
前言:
一、硬件准备与接线
1.1 硬件清单
1.2 接线
二、 SG90舵机简介
1.1 外观
1.2 基本参数
1.3 引脚说明
1.4 控制原理
1.5 特点
1.6 常见问题
三、 单片机简介
四、 程序设计
4.1 定时器配置
4.2 角度控制函数
4.3 主函数调用
五、 总结
前言:
STM32F103C8T6 是一款性价比极高的ARM Cortex-M3内核微控制器,广泛应用于嵌入式开发。SG90舵机 则是小型舵机的代表,常用于机器人、智能家居等场景。本文将通过硬件连接、PWM信号配置、代码实现等步骤,详细讲解如何用STM32F103C8T6控制SG90舵机。
一、硬件准备与接线
1.1 硬件清单
器件 | 数量 | 备注 |
---|---|---|
STM32F103C8T6最小系统板 | 1 | 核心控制器 |
SG90舵机 | 1 | 工作电压4.8-6V,信号线需PWM |
5V电源模块 | 1 | 独立供电,避免板载电流不足 |
杜邦线 | 若干 | 连接电路 |
1.2 接线
SG90舵机 STM32F103C8T6 外部电源
棕色线(GND) → GND引脚 → GND
红色线(VCC) → 连外部5V → 5V
橙色线(信号) → PB0(TIM3_CH3)
注意:若需驱动多个舵机,建议使用独立电源供电,避免STM32板载电源过载。
二、 SG90舵机简介
1.1 外观
1.2 基本参数
参数 | 数值 |
---|---|
工作电压 | 4.8V - 6V(典型5V) |
电流消耗 | 100mA(空闲),250mA(运行) |
扭矩 | 1.2kg·cm(4.8V),1.6kg·cm(6V) |
转速 | 0.12秒/60°(4.8V),0.10秒/60°(6V) |
重量 | 9克 |
尺寸 | 22.2mm × 11.8mm × 31mm |
转动角度 | 180°(部分型号支持360°) |
齿轮材质 | 塑料(部分型号为金属齿轮) |
接口类型 | 3针(信号、电源、地) |
1.3 引脚说明
SG90舵机通常有3根线
棕色线(GND):接地。
红色线(VCC):接电源(4.8V-6V)。
橙色线(信号线):接收PWM信号控制角度。
1.4 控制原理
PWM信号控制:
-
信号周期:20ms(50Hz)。
-
脉冲宽度:0.5ms - 2.5ms,对应角度0° - 180°。
1.5 特点
优点:
-
体积小、重量轻:适合空间受限的项目。
-
价格低廉:成本低,适合批量使用。
-
易于控制:标准PWM信号接口,兼容性强。
缺点:
-
扭矩较小:仅适合轻负载场景。
-
塑料齿轮易磨损:长时间高负载工作可能导致损坏。
1.6 常见问题
1)舵机抖动或不转动:
-
检查电源电压是否足够。
-
检查PWM信号是否正确。
2) 舵机发热严重:
-
检查是否超负荷运行。
-
确保转动范围内无机械卡阻。
3) 角度不准确:
-
校准PWM信号脉冲宽度。
-
检查舵机齿轮是否磨损。
三、 单片机简介
STM32F103C8T6最小系统板:
本文使用的开发板为STM32F103C8T6最小系统板,SG90舵机使用到的引脚为PB0引脚。
四、 程序设计
4.1 定时器配置
使用 TIM3的通道3(PB0)生成PWM,步骤如下:
1) 时钟配置:
-
系统时钟设为72MHz(默认配置)。
-
TIM3时钟源为APB12总线(72MHz)。
2) 定时器参数计算:
-
PWM频率:50Hz → 周期20ms 。
-
预分频值(PSC):72MHz / (719 + 1) = 1MHz → 每个计数周期10μs。
-
自动重装载值(ARR):20,000μs / 10μs = 2000 →
ARR = 1999
(从0计数)。
3) 脉冲宽度计算(以90°为例):
-
1.5ms = 1500μs → 占空比 = 1500 / 20000 = 7.5%。
-
比较寄存器(CCR):1500 →
CCR = 1500 - 1 = 1499
。
定时器初始化代码如下:
void SG90_PWM_Init(u16 arr, u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;// 使能定时器TIM3时钟,注意TIM3时钟为APB1,而非APB2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 使能PWM输出GPIO口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 定时器TIM3的PWM输出通道3,TIM3_CH3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOTIM_TimeBaseStructure.TIM_Period = arr;//自动重装值TIM_TimeBaseStructure.TIM_Prescaler =psc; //时钟预分频数TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3//初始化TIM3_CH3的PWM模式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC3Init(TIM3, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能通道的预装载寄存器TIM_ARRPreloadConfig(TIM3, ENABLE); //使能重装寄存器TIM_Cmd(TIM3, ENABLE);//使能定时器TIM3,准备工作
}
初始化参数如下:
SG90_PWM_Init(1999,719); //初始化舵机
4.2 角度控制函数
将角度转换为对应的占空比,角度最大为180° 。
void SG90_Set_Angle(uint8_t angle)
{if (angle > 180)angle = 180;uint16_t duty = 10 * (angle + 45) / 9; // 角度转化为占空比TIM_SetCompare3(TIM3, duty); // 设置占空比
}
4.3 主函数调用
SG90_Set_Angle(0); //占空比2.5%,0度
delay_ms(1000);
SG90_Set_Angle(90); //占空比7.5%,90度
delay_ms(1000);
五、 总结
通过STM32F103C8T6的定时器PWM功能,可精准控制SG90舵机角度。关键在于正确配置定时器的预分频值和自动重装载值,并合理映射角度到脉宽。本方案成本低、可靠性高,适合机器人、智能家居等应用场景。