STM32入门教程:PWM舵机控制

一、PWM 舵机控制简介

舵机是一种特殊的直流电机,它通过接收驱动信号来控制转动角度,一般被广泛应用于机器人、遥控模型、机械臂等领域。PWM(Pulse Width Modulation,脉宽调制)是一种常用的控制舵机的方法,通过控制信号的脉宽来决定舵机的转动角度。

STM32 是一款强大的 32 位微控制器,具有丰富的外设资源和广泛的应用领域。在本教程中,我们将学习如何通过 STM32 的 PWM 外设来控制舵机的转动角度。

二、硬件准备

在开始之前,我们需要准备以下硬件:

  1. STM32 开发板
  2. 舵机
  3. 杜邦线

连接步骤如下:

  1. 将舵机的 VCC 线连接到开发板的 5V 电源引脚
  2. 将舵机的 GND 线连接到开发板的 GND 引脚
  3. 将舵机的信号线(一般为橙色线)连接到开发板的任意 GPIO 引脚(例如 PA0 引脚)

三、PWM 舵机控制代码实现

  1. 引入必要的头文件
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"

  1. 定义舵机相关的宏
#define PWM_TIM               TIM2
#define PWM_GPIO              GPIOA
#define PWM_GPIO_PIN          GPIO_Pin_0
#define PWM_GPIO_CLK          RCC_APB2Periph_GPIOA
#define PWM_TIM_CLK           RCC_APB1Periph_TIM2

  1. 初始化 GPIO 和 PWM 定时器
void PWM_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    TIM_OCInitTypeDef TIM_OCInitStruct;

    // 使能 GPIO 和 TIM 时钟
    RCC_APB2PeriphClockCmd(PWM_GPIO_CLK, ENABLE);
    RCC_APB1PeriphClockCmd(PWM_TIM_CLK, ENABLE);

    // 配置 GPIO 引脚为复用推挽输出模式
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Pin = PWM_GPIO_PIN;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(PWM_GPIO, &GPIO_InitStruct);

    // 配置 TIM 基本参数
    TIM_InitStruct.TIM_Prescaler = 72 - 1;
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_InitStruct.TIM_Period = 20000 - 1;
    TIM_InitStruct.TIM_ClockDivision = 0;
    TIM_TimeBaseInit(PWM_TIM, &TIM_InitStruct);

    // 配置 TIM 输出比较参数
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_Pulse = 1000 - 1;
    TIM_OC2Init(PWM_TIM, &TIM_OCInitStruct);

    // 使能 TIM 输出比较
    TIM_Cmd(PWM_TIM, ENABLE);
    TIM_CtrlPWMOutputs(PWM_TIM, ENABLE);
}

  1. 舵机角度控制函数
void Servo_SetAngle(int angle)
{
    uint16_t pulse = 1000 + angle * 10;
    TIM_SetCompare2(PWM_TIM, pulse - 1);
}

四、代码解析

  1. 初始化 GPIO 和 PWM 定时器

在 PWM_Init 函数中,我们首先使能了 GPIO 和 TIM 的时钟。然后,配置 GPIO 引脚为复用推挽输出模式,这样才能连接到 PWM 定时器输出引脚。接下来,配置 TIM 的基本参数,包括预分频系数、计数器模式、计数范围等。最后,配置 TIM 的输出比较参数,包括 PWM 模式、输出使能、极性设置和占空比等。最后,使能 TIM 的输出比较和 PWM 输出。

  1. 舵机角度控制函数

在 Servo_SetAngle 函数中,我们根据舵机的工作原理,通过改变 PWM 的脉宽来控制舵机的转动角度。我们使用变量 angle 来表示舵机的角度,将 angle 值乘以 10,并加上偏移量 1000 来计算 PWM 的脉宽。最后,使用 TIM_SetCompare2 函数将计算得到的脉宽值写入 PWM 定时器的捕获比较寄存器,从而改变 PWM 输出的脉宽。

五、使用 PWM 舵机控制函数

在主函数中调用 PWM_Init 函数初始化 PWM,并使用 Servo_SetAngle 函数来控制舵机的转动角度。

int main(void)
{
    PWM_Init();
  
    while (1)
    {
        Servo_SetAngle(0);  // 设置舵机角度为 0 度
        delay_ms(1000);     // 延时 1 秒
        
        Servo_SetAngle(90); // 设置舵机角度为 90 度
        delay_ms(1000);     // 延时 1 秒
        
        Servo_SetAngle(180);  // 设置舵机角度为 180 度
        delay_ms(1000);     // 延时 1 秒
    }
}

六、总结

通过上述代码实现,我们成功地使用 STM32 的 PWM 外设控制了舵机的转动角度。我们可以通过调整 Servo_SetAngle 函数中的 angle 参数来改变舵机的转动角度,从而实现更加精确的控制。

希望本教程对初学者了解 STM32 的 PWM 外设和舵机控制有所帮助。如有任何问题,欢迎留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值