STM32 hal库驱动360度SG90
时间: 2025-04-30 11:01:29 浏览: 36
### STM32 HAL 库驱动 SG90 舵机实现 360 度旋转
#### 实现原理
SG90舵机通常设计用于接收PWM信号来定位到特定的角度位置,范围通常是0°至180°。然而,要使SG90舵机执行超过其标准工作角度即360度的连续转动,则需对其进行特殊配置或利用某些型号特有的功能。
对于大多数版本的SG90来说,并不支持真正的360度无限制旋转;这些设备被制造成具有固定行程角的伺服电机。如果确实存在能够做无限旋转运动的产品变种,在编程上仍然遵循基本相同的逻辑——通过改变发送给它的脉冲宽度调制(PWM)信号周期内的高电平持续时间来进行速度和方向上的调整[^1]。
#### 示例代码教程
下面提供一段基于STM32 HAL库编写用来尝试让兼容模式下的SG90模拟近似于360度自由旋转行为的例子:
```c
#include "main.h"
TIM_HandleTypeDef htim5;
// 初始化定时器设置为PWM输出模式...
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM5_Init(void);
/* USER CODE BEGIN 0 */
#define SERVO_MIN_PULSE_WIDTH 500 // 对应最左端(逆时针极限), 占空比约为5%
#define SERVO_MAX_PULSE_WIDTH 2500 // 对应最右端(顺时针极限),占空比约为7.5%
float mapFloat(float x, float in_min, float in_max, float out_min, float out_max){
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
/**
* @brief 控制舵机转向指定角度
* @param angle: 角度值,这里假设输入的是相对于中心点(-180 ~ +180)
*/
void Servo_Rotate(int16_t angle) {
uint16_t pulse_width;
if(angle >= -180 && angle <= 180){
// 将角度映射到实际使用的脉宽范围内
pulse_width = mapFloat((float)angle, -180, 180, SERVO_MIN_PULSE_WIDTH, SERVO_MAX_PULSE_WIDTH);
// 设置比较寄存器以更新PWM波形
__HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, pulse_width);
}
}
/* USER CODE END 0 */
int main(void){
/* Reset of all peripherals, Initializes the Flash interface and Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM5_Init();
while (1)
{
// 这里可以加入循环控制语句使得舵机能按照一定规律来回扫动,
// 或者根据外部传感器反馈实时调整角度
// 比如简单测试可以让它每秒转一圈:
for(int i=-180;i<=180;i++){
Servo_Rotate(i);
HAL_Delay(10); // 延迟一段时间以便观察效果
}
for(int i=180;i>=-180;i--){
Servo_Rotate(i);
HAL_Delay(10);
}
}
}
```
需要注意的是上述代码仅适用于那些能够在硬件层面支持这种操作方式的SG90舵机变体。对于普通的SG90而言,强行超出规定的工作区间可能会损坏内部机械结构或是电子元件[^2]。
阅读全文
相关推荐

















