keil5 SG90舵机stm32
时间: 2025-06-01 15:50:57 浏览: 25
### 关于Keil5中使用SG90舵机与STM32配合的代码教程
#### 舵机工作原理概述
SG90舵机是一种位置伺服驱动器,通过接收特定的PWM信号来实现角度控制。对于180度范围内的舵机,其输入信号是一个周期为20ms的方波信号,其中高电平持续时间为0.5ms到2.5ms之间[^1]。具体来说:
- 高电平宽度为 **0.5ms** 对应舵机转至最小角度(通常为0°)。
- 高电平宽度为 **2.5ms** 对应舵机转至最大角度(通常为180°)。
因此,在实际应用中,可以通过调整PWM占空比来精确控制舵机的角度。
---
#### STM32硬件配置说明
为了驱动SG90舵机,需要完成以下硬件连接和软件设置:
1. **硬件接线**
- VCC 接入 5V 电源(可从 ST-LINK 的 5V 输出端获取)。
- GND 连接到系统的地线上。
- PWM 控制信号接入 STM32 的 GPIO 引脚(本例中使用 PA0,即 TIM2_CH1)[^1]。
2. **环境搭建**
使用 STM32CubeMX 初始化项目,并生成基于 Keil MDK 的工程文件。主要涉及如下外设配置:
- 启用 TIM2 定时器用于生成 PWM 波形。
- 设置定时器参数以满足 20ms 周期的要求。
---
#### 示例代码解析
以下是完整的代码示例及其功能描述:
```c
/* USER CODE BEGIN Includes */
#include "main.h"
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim2;
/* USER CODE BEGIN PV */
uint16_t duty_cycle = 50; // 初始占空比,默认指向中间位置 (约90°)
/* USER CODE END PV */
/* USER CODE BEGIN PFP */
void SetServoAngle(uint16_t angle);
/* USER CODE END PFP */
int main(void) {
/* MCU Initialization */
HAL_Init();
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init(); // GPIO初始化
MX_TIM2_Init(); // TIM2初始化
/* Start the PWM signal generation on Channel 1 of Timer 2 */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
/* Infinite loop to control servo motor angles dynamically */
while (1) {
uint16_t target_angle;
// Example: Rotate between two positions every second.
static uint8_t toggle_flag = 0;
if (!toggle_flag) {
target_angle = 0; // Move to minimum position (0°)
} else {
target_angle = 180; // Move to maximum position (180°)
}
toggle_flag ^= 1; // Toggle flag state
SetServoAngle(target_angle); // Call function to set new angle
HAL_Delay(1000); // Wait for one second before changing again
}
}
/**
* @brief Function to convert an angle value into corresponding PWM duty cycle and apply it.
* @param[in] angle Desired angle within range [0, 180].
*/
void SetServoAngle(uint16_t angle) {
float pulse_width_us = ((float)(angle / 180.0f)) * 2000 + 500; // Convert angle to pulse width in microseconds
uint16_t compare_value = (pulse_width_us / 10) * (SystemCoreClock / 1e6); // Calculate Compare Value based on system clock
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, compare_value); // Update Compare Register with calculated value
}
```
##### 代码解释
1. `SetServoAngle` 函数负责将目标角度转换成对应的 PWM 占空比值,并更新定时器通道的比较寄存器。
2. 在主函数中,通过改变变量 `target_angle` 来动态调整舵机的位置。
3. PWM 参数计算依据系统核心频率 (`SystemCoreClock`) 和所需脉宽时间进行比例缩放[^3]。
---
#### 注意事项
1. 确保 STM32 的时钟配置能够支持所需的分辨率。例如,如果设定 TIM2 的计数器频率过低,则可能无法提供足够的精度来区分不同角度下的脉宽差异。
2. 如果发现舵机抖动现象严重,可能是由于 PWM 更新速率不足或者外部负载过大引起;尝试优化电路设计或降低运行速度测试稳定性[^2]。
---
阅读全文
相关推荐

















