STM32 使用 DRV8833 驱动电机

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

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

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

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

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

点击领取更多详细资料

一、DRV8833 简介

DRV8833 是德州仪器(TI)推出的一款双路 H 桥电机驱动芯片,可用于驱动两个直流电机或一个步进电机。它具有以下特点:

  • 宽电压范围:电源电压范围为 2.7V 至 10.8V,适用于多种电池供电的应用场景。
  • 低功耗:采用低导通电阻的 MOSFET 设计,降低了功耗,提高了效率。
  • 内置保护功能:具备过流保护、欠压锁定和热关断等保护功能,增强了系统的可靠性。
  • 简单的控制接口:通过两个逻辑输入引脚(IN1 和 IN2)可以控制电机的正反转和制动。

二、硬件连接

引脚功能

DRV8833 常见的引脚有:

  • VM:电机电源输入引脚,连接电机的电源。
  • GND:接地引脚。
  • IN1、IN2:控制引脚,用于控制电机的转动方向和状态。
  • OUT1、OUT2:电机输出引脚,连接到电机的两端。

与 STM32 的连接

将 DRV8833 的控制引脚(IN1、IN2)连接到 STM32 的 GPIO 引脚,VM 引脚连接到合适的电源,GND 引脚接地,OUT1 和 OUT2 引脚连接到电机的两端。以下是一个简单的硬件连接示例:

DRV8833 引脚STM32 引脚
IN1PA0
IN2PA1
VM5V
GNDGND
OUT1电机正极
OUT2电机负极

三、控制原理

DRV8833 通过 IN1 和 IN2 引脚的逻辑电平组合来控制电机的转动方向和状态,具体控制逻辑如下:

IN1IN2电机状态
00制动
01反转
10正转
11制动

四、代码实现(以 STM32F103 为例,使用 HAL 库)

#include "stm32f1xx_hal.h"

// 定义 DRV8833 控制引脚
#define DRV8833_IN1_PIN GPIO_PIN_0
#define DRV8833_IN2_PIN GPIO_PIN_1
#define DRV8833_GPIO_PORT GPIOA

// 初始化 DRV8833 控制引脚
void DRV8833_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 使能 GPIOA 时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // 配置 IN1 和 IN2 引脚为推挽输出模式
    GPIO_InitStruct.Pin = DRV8833_IN1_PIN | DRV8833_IN2_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(DRV8833_GPIO_PORT, &GPIO_InitStruct);

    // 初始状态设置为制动
    HAL_GPIO_WritePin(DRV8833_GPIO_PORT, DRV8833_IN1_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(DRV8833_GPIO_PORT, DRV8833_IN2_PIN, GPIO_PIN_RESET);
}

// 电机正转
void DRV8833_MotorForward(void) {
    HAL_GPIO_WritePin(DRV8833_GPIO_PORT, DRV8833_IN1_PIN, GPIO_PIN_SET);
    HAL_GPIO_WritePin(DRV8833_GPIO_PORT, DRV8833_IN2_PIN, GPIO_PIN_RESET);
}

// 电机反转
void DRV8833_MotorBackward(void) {
    HAL_GPIO_WritePin(DRV8833_GPIO_PORT, DRV8833_IN1_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(DRV8833_GPIO_PORT, DRV8833_IN2_PIN, GPIO_PIN_SET);
}

// 电机制动
void DRV8833_MotorBrake(void) {
    HAL_GPIO_WritePin(DRV8833_GPIO_PORT, DRV8833_IN1_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(DRV8833_GPIO_PORT, DRV8833_IN2_PIN, GPIO_PIN_RESET);
}

int main(void) {
    HAL_Init();
    DRV8833_Init();

    while (1) {
        // 电机正转 2 秒
        DRV8833_MotorForward();
        HAL_Delay(2000);

        // 电机制动 1 秒
        DRV8833_MotorBrake();
        HAL_Delay(1000);

        // 电机反转 2 秒
        DRV8833_MotorBackward();
        HAL_Delay(2000);

        // 电机制动 1 秒
        DRV8833_MotorBrake();
        HAL_Delay(1000);
    }
}

五、代码解释

1. DRV8833_Init 函数

该函数用于初始化 DRV8833 的控制引脚。首先使能 GPIOA 时钟,然后将 IN1 和 IN2 引脚配置为推挽输出模式。最后将引脚电平初始化为低电平,使电机处于制动状态。

2. DRV8833_MotorForward 函数

该函数用于控制电机正转,将 IN1 引脚设置为高电平,IN2 引脚设置为低电平。

3. DRV8833_MotorBackward 函数

该函数用于控制电机反转,将 IN1 引脚设置为低电平,IN2 引脚设置为高电平。

4. DRV8833_MotorBrake 函数

该函数用于控制电机制动,将 IN1 和 IN2 引脚都设置为低电平。

5. main 函数

在主函数中,首先调用 HAL_Init 函数进行 HAL 库的初始化,然后调用 DRV8833_Init 函数初始化 DRV8833。在无限循环中,依次执行电机正转 2 秒、制动 1 秒、反转 2 秒、制动 1 秒的操作。

六、注意事项

  • 电源供应:确保 VM 引脚的电源电压在 DRV8833 的工作电压范围内,并且电源能够提供足够的电流。
  • 电机选型:根据电机的功率和电流需求,选择合适的 DRV8833 型号,避免芯片因过流而损坏。
  • 散热问题:如果电机功率较大,DRV8833 可能会发热,需要考虑散热措施,如添加散热片。

通过以上的硬件连接和代码实现,你可以使用 STM32 轻松驱动 DRV8833 来控制电机的转动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值