STM32CubeMX使用SG90舵机角度0-180°
1. 配置步骤
1.1 硬件连接
-
舵机信号线 → STM32的PWM输出引脚(如
PA2
,对应定时器TIM2_CH3
)。 -
电源和地 → 外接5V电源(确保共地)。
1.2 定时器配置(以TIM2为例)
-
在STM32CubeMX中:
选择定时器(如TIM2
)的PWM模式。
设置预分频器(PSC)和自动重载值(ARR),生成 50Hz PWM。
使能TIM2和配置对应引脚(如 PA2
)。
参数计算:
- 主频为
72MHz
(STM32F1系列):-
预分频器
PSC
:根据主频调整,例如72-1
,使得分频后频率为1MHz
(每计数1次 = 1us)。 -
自动重载值
ARR
:决定PWM周期,例如20000-1
(对应20ms)。 -
定时器时钟分频后频率:
72MHz / (PSC + 1)
。 -
目标频率:
50Hz
→ 周期20ms = 20,000us
。
-
2. 代码实现
2.1 定时器初始化
在 main.c 中添加
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);//PA2
2.2 设置舵机角度
舵机控制基础
标准舵机通过PWM信号控制,一般要求:
- 周期为20ms (50Hz)
- 脉冲宽度0.5ms-2.5ms对应0°-180°
- 0.5ms脉宽 → 0°
- 1.5ms脉宽 → 90°
- 2.5ms脉宽 → 180°
代码实现步骤
- 角度限制:确保输入角度在0-180度范围内
- 脉宽计算:将角度转换为对应的脉冲宽度(微秒)
pulse_width = 500 + (angle / 180.0) * 2000
- 当angle=0时,脉宽=500μs
- 当angle=180时,脉宽=2500μs
- 占空比计算:将脉宽转换为定时器的比较值
ccr = (pulse_width / 20000.0) * (htim->Instance->ARR + 1)
- 其中ARR是定时器的自动重装载值,决定PWM周期
- 设置比较值:通过HAL库函数设置定时器的比较寄存器值
/*** @description: * @param {float} angle:0-180* @return {*}*/
void Servo_SetAngle(float angle)
{// 角度限制if (angle < 0)angle = 0;if (angle > 180)angle = 180;// 计算脉冲宽度(0.5ms–2.5ms)float pulse_width = 500 + (angle / 180.0) * 2000; // 单位:us// 计算占空比(ARR=19999对应20ms周期)uint32_t ccr = (pulse_width / 20000.0) * (Servo_SetAngle_TIM->ARR + 1);// 写入比较寄存器Servo_SetAngle_TIM_CCR = ccr;
}
/* 舵机============================================================================ */
#define Servo_SetAngle_htim htim2 // 定义舵机定时器句柄
#define Servo_SetAngle_TIM TIM2 // 定义舵机定时器
#define Servo_SetAngle_TIM_CCR TIM2->CCR3 // 定义舵机定时器通道TIMx-ch3
void Servo_SetAngle(float angle); // 舵机角度设置函数0-180度
2.3 主函数调用
while (1){Servo_SetAngle(0);HAL_Delay(1000);Servo_SetAngle(90);HAL_Delay(1000);Servo_SetAngle(180);HAL_Delay(1000);}
4. 注意事项
-
频率校准:
如果舵机抖动,检查PWM频率是否为 50Hz(示波器测量信号周期)。 -
电压匹配:
舵机供电需稳定(5V),避免直接从STM32的3.3V取电。