首页 5G技术

STM32驱动SG90舵机:打造智能垃圾桶的精准控制核心

分类:5G技术
字数: (3246)
阅读: (7577)
内容摘要:STM32驱动SG90舵机:打造智能垃圾桶的精准控制核心,

在之前 STM32 智能垃圾桶的项目中,我们已经实现了红外传感器检测和超声波测距等功能。现在,我们要为垃圾桶加上一个自动开盖的功能,这需要用到舵机。本文将深入探讨 PWM 的工作原理,以及如何利用 STM32 的 PWM 功能控制 SG90 舵机,实现精准的垃圾桶开盖控制。

PWM 原理回顾:理解脉冲宽度调制

PWM (Pulse Width Modulation),即脉冲宽度调制,是一种通过改变方波的占空比来控制输出电压的有效技术。在 STM32 中,我们可以使用定时器(Timer)的 PWM 输出模式来产生不同占空比的 PWM 信号。占空比定义为一个周期内高电平持续的时间与整个周期时间的比值。例如,一个周期为 20ms 的 PWM 信号,高电平持续 1ms,则占空比为 5%。

STM32驱动SG90舵机:打造智能垃圾桶的精准控制核心

PWM 在电机控制、LED 亮度调节等领域应用广泛。在我们的智能垃圾桶项目中,通过控制 PWM 信号的占空比,我们可以精确地控制 SG90 舵机的转动角度。这就类似于我们调整 Nginx 服务器的反向代理配置,通过调整 upstream 权重,实现后端服务器的负载均衡,保证服务的高可用性。

STM32驱动SG90舵机:打造智能垃圾桶的精准控制核心

SG90 舵机控制原理

SG90 舵机是一种常用的微型舵机,它通过接收 PWM 信号来控制舵机的转动角度。SG90 舵机的控制信号通常是一个周期为 20ms 的 PWM 信号,其中高电平的持续时间决定了舵机的转动角度。一般情况下,高电平持续时间在 0.5ms 到 2.5ms 之间,对应舵机的转动角度范围为 0 度到 180 度。

STM32驱动SG90舵机:打造智能垃圾桶的精准控制核心

具体关系如下:

STM32驱动SG90舵机:打造智能垃圾桶的精准控制核心
  • 0.5ms:0 度
  • 1.0ms:45 度
  • 1.5ms:90 度
  • 2.0ms:135 度
  • 2.5ms:180 度

STM32 PWM 配置步骤

  1. 使能定时器时钟: 首先需要使能定时器和 GPIO 的时钟。
  2. 配置 GPIO 为复用功能: 将用于 PWM 输出的 GPIO 配置为复用功能,以便连接到定时器的 PWM 输出通道。
  3. 配置定时器: 设置定时器的时钟频率、计数模式、预分频系数等参数,以产生所需的 PWM 信号周期。
  4. 配置 PWM 输出通道: 配置定时器的 PWM 输出通道,设置 PWM 模式、极性、占空比等参数。

代码实现

#include "stm32f10x.h"

// 定义 SG90 舵机控制引脚
#define SERVO_PIN GPIO_Pin_6
#define SERVO_PORT GPIOB

// 初始化 PWM
void PWM_Config(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 1. 使能 GPIOB 和 TIM4 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    // 2. 配置 GPIOB.6 为复用推挽输出
    GPIO_InitStructure.GPIO_Pin = SERVO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SERVO_PORT, &GPIO_InitStructure);

    // 3. 配置 TIM4
    TIM_TimeBaseStructure.TIM_Period = 20000 - 1; // PWM 周期 20ms (72MHz / 3600 = 20kHz, 1/20kHz = 0.05ms, 20ms/0.05ms = 400, 实际测试发现要扩大50倍才能达到20ms周期,所以为20000)
    TIM_TimeBaseStructure.TIM_Prescaler = 3600 - 1;   // 预分频系数
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

    // 4. 配置 PWM 输出通道 1 (TIM4_CH1)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM 模式 1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
    TIM_OCInitStructure.TIM_Pulse = 1500;                // 初始占空比,对应 90 度 (1.5ms)
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   // 高电平有效
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);

    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); // 使能预装载寄存器

    TIM_ARRPreloadConfig(TIM4, ENABLE); // 使能 ARR 预装载寄存器

    // 5. 使能 TIM4
    TIM_Cmd(TIM4, ENABLE);
}

// 设置舵机角度
void Servo_SetAngle(uint16_t angle) {
    // 将角度转换为 PWM 脉宽 (0.5ms - 2.5ms, 对应 500us - 2500us)
    uint16_t pulseWidth = (uint16_t)(500 + (2000.0 / 180.0) * angle); // 计算脉宽
    TIM_SetCompare1(TIM4, pulseWidth);
}

int main(void) {
    PWM_Config(); // 初始化 PWM

    while (1) {
        // 示例:每隔一段时间改变舵机角度
        Servo_SetAngle(0);   // 转到 0 度
        for (volatile int i = 0; i < 1000000; i++); // 延时

        Servo_SetAngle(90);  // 转到 90 度
        for (volatile int i = 0; i < 1000000; i++); // 延时

        Servo_SetAngle(180); // 转到 180 度
        for (volatile int i = 0; i < 1000000; i++); // 延时
    }
}

实战避坑经验

  • PWM 频率选择: SG90 舵机对 PWM 信号的频率有一定要求,通常为 50Hz。在配置定时器时,需要根据 STM32 的时钟频率计算出合适的预分频系数和周期值,以产生所需的 PWM 频率。如果频率过高或过低,舵机可能无法正常工作。
  • 脉宽与角度映射: 需要根据 SG90 舵机的datasheet,确定脉宽与角度之间的映射关系。不同的舵机可能存在差异,需要进行实际测试和校准。
  • 电源稳定: 舵机对电源的稳定性要求较高。如果电源不稳定,舵机可能会出现抖动、不响应等问题。建议使用稳压电源为舵机供电,并添加滤波电容,以提高电源的稳定性。
  • GPIO 初始化: 确保正确配置 GPIO 的模式和速度。如果 GPIO 配置错误,可能会导致 PWM 信号无法正常输出。
  • 延时: 在控制舵机转动角度后,需要添加适当的延时,以等待舵机完成转动。如果延时过短,可能会导致舵机无法准确到达目标角度。

通过以上步骤和代码示例,我们就可以成功地利用 STM32 的 PWM 功能控制 SG90 舵机,实现智能垃圾桶的自动开盖功能。这其中,对 PWM 原理的深刻理解至关重要,就像理解 Nginx 的核心配置一样,能够帮助我们更好地解决实际问题。 以后可以考虑加入 OLED 显示,显示垃圾桶状态,就更完善了。

STM32驱动SG90舵机:打造智能垃圾桶的精准控制核心

转载请注明出处: CoderPunk

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

本文最后 发布于2026-04-19 16:36:15,已经过了8天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 社畜一枚 2 天前
    不错,学习了,最近也在研究STM32的PWM输出,受益匪浅!
  • 红豆沙 2 天前
    这篇文章写的真不错,PWM 原理和 SG90 舵机控制都讲得很清楚,代码示例也很详细,赞一个!
  • 麻辣烫 4 天前
    如果能加入 OLED 显示,实时显示垃圾桶状态就更好了,比如垃圾满了提示,或者电池电量低提示。
  • 月光族 1 天前
    楼主总结的避坑经验很实用,之前做项目就遇到过舵机抖动的问题,后来加了滤波电容才解决。