STM32使用PWM控制舵机

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

一、引言

舵机是一种常见的执行机构,广泛应用于机器人、航模等领域。通过控制舵机的角度,可以实现各种复杂的动作。在STM32开发中,我们可以利用其强大的定时器功能产生PWM(脉冲宽度调制)信号来精确控制舵机的转动角度。本文将详细介绍如何使用STM32来实现PWM控制舵机,并给出相应的代码示例。

二、舵机工作原理

舵机一般由直流电机、减速齿轮组、角度传感器和控制电路组成。它通过接收PWM信号来控制转动角度。PWM信号的周期通常为20ms(50Hz),而舵机的转动角度与PWM信号的脉冲宽度有关。一般来说,脉冲宽度在0.5ms - 2.5ms之间变化时,舵机的转动角度从0° - 180°线性变化。具体对应关系如下:

  • 0.5ms 脉冲宽度 -> 0°
  • 1.5ms 脉冲宽度 -> 90°
  • 2.5ms 脉冲宽度 -> 180°

三、硬件连接

以STM32F103C8T6为例,我们选择一个定时器的PWM输出引脚来连接舵机的控制信号引脚。舵机的电源引脚连接到外部电源(一般为5V),接地引脚连接到开发板的GND。假设我们选择TIM3的通道1(PA6)作为PWM输出引脚,连接方式如下:

  • 舵机控制信号(橙色线) -> PA6
  • 舵机电源(红色线) -> 5V电源
  • 舵机接地(棕色线) -> GND

四、STM32定时器PWM模式配置

1. 定时器时钟使能

首先,我们需要使能定时器和GPIO的时钟。

#include "stm32f10x.h"

void TIM3_PWM_Init(u16 arr, u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 使能TIM3和GPIOA时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2. GPIO配置

将PA6配置为复用推挽输出模式。

    // 配置PA6为复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

3. 定时器基本参数配置

设置定时器的自动重装载值和预分频系数,确定PWM信号的周期。

    // 定时器TIM3基本参数配置
    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler = psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

4. PWM模式配置

配置定时器的PWM模式和输出比较参数。

    // 定时器TIM3的PWM模式配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);

    // 使能TIM3
    TIM_Cmd(TIM3, ENABLE);
}

五、控制舵机转动

1. 计算脉冲宽度

根据舵机的角度和PWM信号的周期,计算出对应的脉冲宽度。

// 计算舵机角度对应的脉冲宽度
u16 Servo_Angle_To_Pulse(u8 angle)
{
    // 0.5ms - 2.5ms对应0° - 180°
    // 20ms周期,ARR = 1999,PSC = 7199
    // 脉冲宽度范围:50 - 250
    return (u16)(50 + (200 * angle / 180));
}

2. 控制舵机转动到指定角度

// 控制舵机转动到指定角度
void Servo_Control(u8 angle)
{
    u16 pulse = Servo_Angle_To_Pulse(angle);
    TIM_SetCompare1(TIM3, pulse);
}

六、主函数代码

int main(void)
{
    // 初始化TIM3的PWM,ARR = 1999,PSC = 7199,周期为20ms
    TIM3_PWM_Init(1999, 7199);

    while (1)
    {
        // 舵机转动到0°
        Servo_Control(0);
        delay_ms(1000);

        // 舵机转动到90°
        Servo_Control(90);
        delay_ms(1000);

        // 舵机转动到180°
        Servo_Control(180);
        delay_ms(1000);
    }
}

七、总结

通过以上步骤,我们可以使用STM32的定时器产生PWM信号来精确控制舵机的转动角度。在实际应用中,我们可以根据需要调整定时器的参数和舵机的控制角度,实现更加复杂的动作。同时,需要注意舵机的电源供应,确保其稳定工作。

希望本文能帮助你快速掌握STM32使用PWM控制舵机的方法。如果你在实践过程中遇到任何问题,欢迎留言讨论。

注意事项

  • 舵机需要外部电源供电,不能直接使用开发板的电源,以免损坏开发板。
  • 不同型号的舵机可能具有不同的脉冲宽度与角度对应关系,需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值