STM32通过PWM控制SG90舵机

01 硬件介绍

舵机是一种高精度的伺服驱动装置,主要用于控制机械结构的角度或位置,广泛应用于机器人、无人机、遥控模型、自动化设备等领域。

它的核心特点是能够精确响应控制信号并保持在指定的角度,通常由直流电机、减速齿轮组、电位器(位置反馈装置)和控制电路组成。

SG90 9G的经典180度舵机用来模拟智能家居中开关门的功能,它是通过PWM控制来角度。转动的角度为180度,左右各90度。

供电电压范围为3~7.2V,这里我们使用3.3V进行供电即可。

02 控制原理

舵机通过接收PWM 信号(脉冲宽度调制)来控制角度。其核心特性是:

标准舵机的 PWM 信号周期固定为 20ms(即频率 50Hz)。

脉冲宽度决定旋转角度:

脉冲宽度 0.5ms 时,舵机转到

脉冲宽度 2.5ms 时,舵机转到 180°

脉冲宽度与角度成线性关系 ,即:脉冲宽度(ms) = 0.5 + (角度° × (2.5-0.5)/180) = 0.5 + 角度° × (2/180) = 0.5 + 角度°/90

03 代码实现

STM32Cubemx定时器配置与脉冲计算的关联

代码中通过定时器TIM2生成 PWM 信号,关键配置和计算如下:

  • 定时器预分频

    :__HAL_TIM_PRESCALER(&htim2, 72-1)假设系统时钟为 72MHz,预分频后定时器时钟为 72MHz / 72 = 1MHz,即每个计数周期为 1μs(1 微秒)。

  • PWM 周期

    :需要满足 20ms(20000μs)。因此定时器的自动重装载值(ARR)需设置为 20000(计数到 20000 时溢出,周期为 20000×1μs=20ms)。

sg90.c

公式解析:pulse = 500 + (int)(angle×100/9)

该公式的本质是将角度值线性映射到舵机所需的 PWM 脉冲宽度(以 μs 为单位),通过定时器生成对应脉冲,从而控制舵机旋转到目标角度。

  • 500

    :对应 0° 时的脉冲宽度。0° 时脉冲宽度为 0.5ms = 500μs,由于定时器每个计数单位是 1μs,因此计数值为 500。

  • angle×100/9

    :角度到脉冲的转换。180° 对应的脉冲宽度是 2.5ms = 2500μs,相对于 0° 的差值为 2000μs。因此:每度对应的脉冲数 = 2000μs / 180° = 100/9 μs/°所以,角度angle对应的脉冲增量为 angle × (100/9)。

  • 最终脉冲值:500 + angle×100/9,正好覆盖 0°(500)到 180°(500 + 180×100/9 = 2500)的脉冲范围,与舵机要求的 PWM 信号匹配

复制代码
#include "sg90.h"extern TIM_HandleTypeDef htim2;void Angle_Control(uint16_t angle){uint16_t pulse;	__HAL_TIM_PRESCALER(&htim2, 72-1);	pulse=500+(int)(angle*100/9);	__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,pulse);}void Close_Door(void){Angle_Control(0);}void Open_Door(void){Angle_Control(90);}void Toggle_Door(void){static uint8_t flag = 0;if(flag == 0)	{		flag = 1;Open_Door();	}else	{		flag = 0;Close_Door();	}}void SG90_PWM_Init(void){HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);}

sg90.h

复制代码
#ifndef _SG90_H_ #define _SG90_H_  #include "main.h"  void SG90_PWM_Init(void);void Open_Door(void); void Close_Door(void); void Toggle_Door(void); #endif