stm32G431RBT6pwmhal库控制舵机
时间: 2025-05-25 11:06:05 浏览: 30
### STM32G431RBT6 HAL库 PWM控制舵机
#### 配置步骤说明
STM32G431RBT6是一款高性能微控制器,支持通过TIMx定时器生成PWM信号来控制舵机。以下是详细的配置过程和代码示例。
---
#### 1. 硬件准备与引脚分配
舵机通常连接到MCU的GPIO引脚并通过PWM信号驱动其旋转。假设舵机连接至PA8(TIM1_CH1),需确保该引脚被正确配置为AF模式并映射到对应的定时器通道[^3]。
---
#### 2. CubeMX工程配置
在STM32CubeMX中完成如下配置:
- **时钟树设置**
设置系统时钟频率为最高值(如80MHz),以提高精度。
- **GPIO配置**
将PA8配置为`Alternate Function - TIM1 CH1`,启用相应的复用功能[^4]。
- **定时器配置**
配置TIM1用于生成PWM信号:
- 设定预分频系数(PSC)=79,使计数器时基频率为1 MHz (SYSCLK/80)。
- 自动装载寄存器ARR设为19999,得到周期约为20ms [(1/(1 MHz)) × (19999 + 1)]。
- 初始占空比CCR1设定为中间位置1500μs,即(1500 / 20000) × ARR ≈ 1500[^4]。
- **PWM模式选择**
在高级选项中选择Edge-Aligned Mode,并激活Output Compare Preload Register以减少抖动[^1]。
- **HAL库初始化**
导出项目后,在`main.c`文件中的`MX_TIM1_Init()`函数会自动生成所需的硬件初始化代码。
---
#### 3. 软件代码实现
以下是一个完整的代码示例,展示如何动态调整PWM脉冲宽度从而改变舵机的角度。
```c
#include "stm32g4xx_hal.h"
// 定义全局变量存储当前角度
float current_angle = 90;
void SetServoAngle(float angle) {
uint32_t pulse_width_us;
// 计算所需脉宽时间(us),范围从500us~2500us对应0°~180°
if(angle < 0){
angle = 0;
}
else if(angle > 180){
angle = 180;
}
pulse_width_us = ((angle * 2000UL)/180) + 500;
// 更新比较寄存器值
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pulse_width_us*10); // 因为ARR单位是10ns
}
int main(void) {
HAL_Init();
MX_GPIO_Init(); // 初始化GPIO
MX_TIM1_PWM_Init(); // 初始化TIM1 PWM
while (1) {
// 动态修改舵机角度测试
for(current_angle = 0;current_angle<=180;current_angle+=10){
SetServoAngle(current_angle);
HAL_Delay(500); // 延迟观察效果
}
for(current_angle = 180;current_angle>=0;current_angle-=10){
SetServoAngle(current_angle);
HAL_Delay(500); // 延迟观察效果
}
}
}
```
此程序实现了从0°到180°再返回的过程,每步增加或减小10°,每次停留约半秒[^4]。
---
#### 注意事项
- 不同型号的舵机可能具有不同的响应特性,请参照具体产品的规格书校准参数。
- 如果发现舵机动态性能不佳,可尝试降低PWM更新速率或者优化滤波电路设计[^3]。
---
阅读全文
相关推荐


















