01 硬件介绍
舵机是一种高精度的伺服驱动装置,主要用于控制机械结构的角度或位置,广泛应用于机器人、无人机、遥控模型、自动化设备等领域。
它的核心特点是能够精确响应控制信号并保持在指定的角度,通常由直流电机、减速齿轮组、电位器(位置反馈装置)和控制电路组成。
SG90 9G的经典180度舵机用来模拟智能家居中开关门的功能,它是通过PWM控制来角度。转动的角度为180度,左右各90度。
供电电压范围为3~7.2V,这里我们使用3.3V进行供电即可。



02 控制原理

舵机通过接收PWM 信号(脉冲宽度调制)来控制角度。其核心特性是:
标准舵机的 PWM 信号周期固定为 20ms(即频率 50Hz)。
脉冲宽度决定旋转角度:
脉冲宽度 0.5ms 时,舵机转到 0°。
脉冲宽度 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