首页 数字经济

STM32智能垃圾桶:PWM舵机控制SG90,软硬件全解析

分类:数字经济
字数: (4301)
阅读: (7112)
内容摘要:STM32智能垃圾桶:PWM舵机控制SG90,软硬件全解析,

本文将深入探讨在 STM32 智能垃圾桶项目中如何使用 PWM 控制舵机 SG90。在之前的项目中,我们已经完成了基础的硬件搭建和软件框架设计。现在,我们需要实现自动开盖功能,而舵机正是完成这一任务的关键组件。本文将回顾 PWM 的基本原理,并详细介绍如何在 STM32 上配置 PWM,最终实现对舵机 SG90 的精确控制。

PWM 基础回顾

脉冲宽度调制 (PWM) 是一种通过改变数字信号的高电平持续时间(即脉冲宽度)来模拟模拟信号的技术。PWM 常用于控制电机速度、LED 亮度以及舵机的角度。在 STM32 中,我们可以利用其内置的定时器/计数器模块生成 PWM 信号。

PWM 的关键参数包括:

STM32智能垃圾桶:PWM舵机控制SG90,软硬件全解析
  • 频率 (Frequency):PWM 信号的重复频率,决定了信号变化的快慢。过低的频率可能导致舵机抖动,过高的频率则可能超出舵机的响应能力。
  • 占空比 (Duty Cycle):高电平持续时间与整个周期时间的比例,决定了输出电压的平均值。对于舵机控制,占空比与舵机的角度成正比。
  • 分辨率 (Resolution):PWM 信号的精度,决定了我们可以精细调节占空比的程度。STM32 的定时器通常提供较高的分辨率,可以实现对舵机的精确控制。

STM32 PWM 配置步骤

以 STM32CubeIDE 为例,配置 PWM 的一般步骤如下:

  1. 使能定时器时钟:首先,需要在 RCC (Reset and Clock Control) 模块中使能所选定时器的时钟。例如,使用定时器 TIM3:

    STM32智能垃圾桶:PWM舵机控制SG90,软硬件全解析
    __HAL_RCC_TIM3_CLK_ENABLE(); // 使能 TIM3 时钟
    
  2. 配置 GPIO:将定时器的 PWM 输出引脚配置为复用功能 (Alternate Function)。需要查找 STM32 的数据手册,确定哪个 GPIO 引脚对应于所选定时器的 PWM 输出通道。例如,TIM3 的通道 1 通常对应于 GPIOA 的引脚 6:

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
    GPIO_InitStruct.Pull = GPIO_NOPULL;    // 无上下拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; // 选择 TIM3 复用功能
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
  3. 配置定时器 (TIMx):配置定时器的基本参数,包括预分频值 (Prescaler)、计数模式 (Counter Mode)、自动重载值 (Auto-reload value)。预分频值用于降低定时器的计数频率,自动重载值决定了 PWM 的频率。例如,将 PWM 频率设置为 50Hz:

    STM32智能垃圾桶:PWM舵机控制SG90,软硬件全解析
    TIM_HandleTypeDef htim3 = {0};
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};
    
    htim3.Instance = TIM3;  // 选择 TIM3
    htim3.Init.Prescaler = 71; // 预分频,降低计数频率
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数
    htim3.Init.Period = 1999;  // 自动重载值,决定 PWM 频率 (72MHz / (71+1) / (1999+1) ≈ 50Hz)
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); }
    
    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; // 选择内部时钟源
    if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); }
    
    if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); }
    
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); }
    
  4. 配置 PWM 通道:配置 PWM 通道的模式 (PWM Mode)、极性 (Pulse Polarity)、占空比 (Pulse)。占空比的值决定了舵机的角度。例如,配置通道 1 为 PWM Mode 1,初始占空比为 0:

    sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM 模式 1
    sConfigOC.Pulse = 0;            // 初始占空比为 0
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 高电平有效
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 禁用快速模式
    if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); }
    
  5. 启动 PWM:启动定时器和 PWM 通道:

    STM32智能垃圾桶:PWM舵机控制SG90,软硬件全解析
    HAL_TIM_Base_Start(&htim3);    // 启动定时器
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 启动 PWM 通道 1
    

舵机 SG90 控制实现

舵机 SG90 通常需要一个 50Hz 的 PWM 信号,占空比在 0.5ms 到 2.5ms 之间,对应于 0 度到 180 度。由于我们的 PWM 频率为 50Hz,周期为 20ms,因此占空比的计算公式为:Pulse = (Angle / 180.0 * 2.0 + 0.5) / 20.0 * (ARR + 1),其中 Angle 为目标角度,ARR 为自动重载值 (1999)。

void setServoAngle(float angle) {
  uint32_t pulse = (uint32_t)((angle / 180.0 * 2.0 + 0.5) / 20.0 * 2000); // 计算占空比
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse); // 设置占空比
}

实战避坑经验总结

  • 电源问题:舵机在运行过程中需要较大的电流。如果使用 STM32 的 3.3V 电源直接驱动舵机,可能会导致电压不足,舵机无法正常工作。建议使用外部 5V 电源为舵机供电,并确保 STM32 的地与舵机的地连接在一起。
  • 抖动问题:舵机抖动可能是由于 PWM 频率不准确、电源不稳定、或者舵机本身质量问题引起的。可以尝试调整 PWM 频率、更换电源、或者更换舵机。
  • 角度范围:不同型号的舵机角度范围可能略有不同。在使用前,需要仔细阅读舵机的数据手册,确定其角度范围,并根据实际情况调整占空比的计算公式。
  • 软件延时:频繁地设置舵机角度可能会导致 STM32 的 CPU 占用率过高。建议在设置舵机角度后,添加适当的软件延时,以降低 CPU 占用率。

STM32 智能垃圾桶项目 PWM 舵机控制的优化方向

在实际项目中,我们可以考虑以下优化方向:

  1. PID 控制:使用 PID 控制算法,可以提高舵机控制的精度和稳定性。PID 控制器可以根据目标角度和实际角度之间的误差,自动调整 PWM 的占空比,从而使舵机更快更准确地到达目标位置。
  2. 自适应调整:根据垃圾桶的使用情况,自动调整舵机的开盖角度和速度。例如,在光线较暗的环境下,可以将开盖角度适当增大,以便用户更方便地投放垃圾。
  3. 低功耗设计:在垃圾桶空闲时,可以关闭舵机的电源,以降低功耗。当检测到有人靠近时,再重新启动舵机。

通过本文的介绍,相信读者已经掌握了 STM32 PWM 的基本原理和舵机 SG90 的控制方法。在实际项目中,可以根据具体需求进行调整和优化,最终实现一个功能完善、性能稳定的智能垃圾桶。

STM32智能垃圾桶:PWM舵机控制SG90,软硬件全解析

转载请注明出处: 不想写注释

本文的链接地址: http://m.acea3.store/blog/458949.SHTML

本文最后 发布于2026-04-27 17:18:10,已经过了0天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 绿豆汤 2 小时前
    舵机的电源问题确实是个坑,之前调试的时候就遇到过,感谢提醒。
  • 香菜必须死 2 天前
    这个代码示例很实用,直接复制粘贴就能用。