首页 数字经济

STM32驱动SG90舵机:打造智能垃圾桶的灵魂(PWM控制详解)

分类:数字经济
字数: (0700)
阅读: (0804)
内容摘要:STM32驱动SG90舵机:打造智能垃圾桶的灵魂(PWM控制详解),

在智能垃圾桶项目中,我们需要精确控制垃圾桶盖的开合,而舵机是实现这一功能的理想选择。本文将深入探讨如何使用 STM32 的 PWM 功能驱动 SG90 舵机,并分享一些实战经验和避坑指南。

问题场景重现

我们的目标是使用 STM32 控制 SG90 舵机,使其能够根据预设的角度旋转,从而实现垃圾桶盖的自动开启和关闭。遇到的典型问题包括:

  • PWM 频率和占空比设置不当导致舵机抖动或无法达到指定角度。
  • 舵机电源供电不足导致运行不稳定。
  • 程序逻辑错误导致控制不精确。

PWM 原理深度剖析

PWM (Pulse Width Modulation) 脉冲宽度调制是一种利用数字信号产生模拟效果的技术。通过改变输出信号的高电平持续时间(即占空比),可以控制输出电压的平均值。STM32 芯片通常内置多个定时器,可以配置为 PWM 输出模式。

STM32驱动SG90舵机:打造智能垃圾桶的灵魂(PWM控制详解)

对于 SG90 舵机,通常使用 50Hz 的 PWM 信号,即周期为 20ms。通过改变高电平持续时间(脉宽),可以控制舵机的旋转角度。

  • 1ms 脉宽对应 0 度
  • 1.5ms 脉宽对应 90 度
  • 2ms 脉宽对应 180 度

因此,我们需要根据目标角度,计算出对应的 PWM 占空比。

STM32驱动SG90舵机:打造智能垃圾桶的灵魂(PWM控制详解)

具体代码解决方案

以下是一个使用 STM32 HAL 库配置 PWM 并控制 SG90 舵机的示例代码:

#include "stm32f1xx_hal.h" // 根据你的 STM32 型号选择头文件

TIM_HandleTypeDef htim2; // 定义定时器句柄

void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 71; // 设置预分频系数,根据系统时钟调整
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式
  htim2.Init.Period = 19999; // 设置计数周期,产生 50Hz PWM (72MHz / (71+1) / 50 = 20000)
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM 模式 1
  sConfigOC.Pulse = 1500; // 初始脉宽 1.5ms (90 度)
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 高电平有效
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim2);
}

void SetServoAngle(float angle)
{
  // 将角度转换为脉宽值
  float pulseWidth = 1000 + (angle / 180.0) * 1000; // 1ms - 2ms 对应 0 - 180 度
  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, (uint32_t)pulseWidth);
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // 启动 PWM

  while (1)
  {
    SetServoAngle(0);  // 设置角度为 0 度
    HAL_Delay(1000);
    SetServoAngle(90); // 设置角度为 90 度
    HAL_Delay(1000);
    SetServoAngle(180); // 设置角度为 180 度
    HAL_Delay(1000);
  }
}

代码解释:

STM32驱动SG90舵机:打造智能垃圾桶的灵魂(PWM控制详解)
  1. MX_TIM2_Init() 函数初始化定时器 2,配置为 PWM 输出模式,频率为 50Hz。
  2. SetServoAngle(float angle) 函数将角度值转换为对应的脉宽值,并更新 PWM 的占空比。
  3. main() 函数循环设置舵机的角度,演示控制效果。

硬件连接:

  • SG90 舵机的信号线连接到 STM32 的 PWM 输出引脚(例如,PA0)。
  • SG90 舵机的 VCC 和 GND 连接到 5V 电源。

注意事项:

STM32驱动SG90舵机:打造智能垃圾桶的灵魂(PWM控制详解)
  • 确保 STM32 的时钟配置正确,以便计算出正确的预分频系数和计数周期。
  • SG90 舵机需要独立的 5V 电源供电,不要直接从 STM32 的 IO 口取电,否则可能导致供电不足,舵机运行不稳定。
  • 根据实际情况调整脉宽的范围,确保舵机能够正常旋转到目标角度。

实战避坑经验总结

  • 电源问题: SG90 对电源要求较高,建议使用独立的 5V 电源,并确保电流足够。如果使用面包板供电,要注意面包板的载流能力。
  • PWM 频率: 虽然通常使用 50Hz,但某些舵机可能对频率敏感,需要根据实际情况进行调整。
  • 占空比范围: SG90 的有效脉宽范围通常在 1ms 到 2ms 之间,但不同批次的舵机可能存在差异,需要进行校准。
  • 抖动问题: 如果舵机出现抖动,可以尝试增加滤波电容,或者优化 PWM 的精度。

通过本文的介绍,相信你已经掌握了使用 STM32 控制 SG90 舵机的基本方法。在实际项目中,还需要根据具体需求进行调整和优化,最终实现智能垃圾桶的稳定可靠运行。

在实际的物联网项目中,除了硬件控制,还需要考虑数据传输、云平台对接等问题。例如,可以使用 ESP8266 或 ESP32 Wi-Fi 模块将垃圾桶的状态数据上传到阿里云 IoT 平台或腾讯云物联网平台,实现远程监控和管理。同时,为了保证系统的稳定性和安全性,还需要考虑软件架构的设计,例如使用 FreeRTOS 实时操作系统,并采用模块化的设计思想,将不同的功能模块进行解耦,提高代码的可维护性和可扩展性。此外,对于高并发的场景,可以考虑使用 Nginx 作为反向代理服务器,实现负载均衡,提高系统的并发处理能力。同时,可以使用宝塔面板简化服务器的管理和维护工作。在网络通信方面,可以考虑使用 MQTT 协议,实现轻量级的消息传递,提高通信效率。最后,还需要对系统进行全面的测试,包括单元测试、集成测试和系统测试,确保系统的各项功能都能够正常运行。

STM32驱动SG90舵机:打造智能垃圾桶的灵魂(PWM控制详解)

转载请注明出处: 代码一只喵

本文的链接地址: http://m.acea4.store/blog/807171.SHTML

本文最后 发布于2026-04-13 13:55:03,已经过了14天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 路过的酱油 3 天前
    电源问题确实是个坑,我之前直接用开发板的 5V 供电,舵机一直抖动,换了独立电源就好了。
  • 彩虹屁大师 1 天前
    这篇教程太及时了,我正愁怎么用 STM32 控制舵机呢!感谢分享!
  • 非酋本酋 6 天前
    这篇教程太及时了,我正愁怎么用 STM32 控制舵机呢!感谢分享!
  • 修仙党 9 小时前
    电源问题确实是个坑,我之前直接用开发板的 5V 供电,舵机一直抖动,换了独立电源就好了。
  • 接盘侠 6 天前
    请问下博主,预分频系数和计数周期是如何计算的?有什么公式吗?