✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对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 引脚 |
---|---|
IN1 | PA0 |
IN2 | PA1 |
VM | 5V |
GND | GND |
OUT1 | 电机正极 |
OUT2 | 电机负极 |
三、控制原理
DRV8833 通过 IN1 和 IN2 引脚的逻辑电平组合来控制电机的转动方向和状态,具体控制逻辑如下:
IN1 | IN2 | 电机状态 |
---|---|---|
0 | 0 | 制动 |
0 | 1 | 反转 |
1 | 0 | 正转 |
1 | 1 | 制动 |
四、代码实现(以 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 来控制电机的转动。