sg90舵机stm32代码
时间: 2025-07-01 17:05:45 浏览: 17
SG90舵机是一种常用的微型舵机,广泛应用于机器人、自动化设备等嵌入式控制系统中。它通过PWM(脉宽调制)信号控制角度,通常支持0°到180°的旋转范围。在STM32系列微控制器上实现对SG90的控制,一般使用定时器输出PWM波形来驱动舵机。
### STM32 控制 SG90 舵机的基本步骤
1. **系统时钟配置**:根据所使用的开发库(标准外设库或HAL库),设置系统主频。
2. **GPIO 配置**:将用于输出PWM信号的引脚配置为复用推挽模式,并映射到相应的定时器通道。
3. **定时器配置**:选择合适的通用定时器(如TIM2、TIM3等),设置自动重载值(ARR)和预分频系数(PSC),以确定PWM波形的周期。
4. **PWM 初始化**:设置比较寄存器值(CCR),决定占空比,从而控制舵机的角度。
5. **角度控制函数编写**:根据角度计算出对应的CCR值,并封装成函数供主程序调用。
6. **主程序逻辑**:调用角度控制函数,使舵机按需转动。
### 示例代码(基于 HAL 库)
以下是一个简化的示例,展示如何使用 STM32 HAL 库控制 SG90 舵机:
#### 1. 定义舵机角度与 PWM 占空比的关系
```c
#define SERVO_MIN_PULSEWIDTH 500 // 0.5ms 对应 0度
#define SERVO_MAX_PULSEWIDTH 2500 // 2.5ms 对应 180度
#define SERVO_PERIOD 20000 // 20ms 周期
void set_servo_angle(TIM_HandleTypeDef *htim, uint32_t Channel, float angle)
{
uint32_t pulse = (uint32_t)(SERVO_MIN_PULSEWIDTH + ((angle / 180.0) * (SERVO_MAX_PULSEWIDTH - SERVO_MIN_PULSEWIDTH)));
__HAL_TIM_SET_COMPARE(htim, Channel, pulse);
}
```
#### 2. 定时器初始化(以 TIM3 CH2 为例)
```c
void MX_TIM3_Init(void)
{
htim3.Instance = TIM3;
htim3.Init.Prescaler = 72 - 1; // 72MHz / 72 = 1MHz
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = SERVO_PERIOD - 1; // 20ms 周期
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
}
```
#### 3. 主循环示例
```c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
while (1)
{
for (float angle = 0; angle <= 180; angle += 45)
{
set_servo_angle(&htim3, TIM_CHANNEL_2, angle);
HAL_Delay(1000); // 每次转动后延时1秒
}
}
}
```
### 注意事项
- 确保供电电压符合SG90的要求(一般为4.8V~6V)。
- 使用外部电源为舵机供电,避免因电流过大损坏MCU。
- 若使用多个舵机,建议使用独立的电源管理模块。
上述代码片段基于引用内容整合[^3],适用于 STM32F1 系列 MCU 的 HAL 库开发环境。开发者可以根据具体项目需求进行扩展和优化。
---
阅读全文