一、简介:
DRV91680RGZR 是德州仪器(Texas Instruments, TI)推出的一款高性能、高集成度的 三相无刷直流(BLDC)电机驱动芯片。它集成了 MOSFET 驱动器、电流检测、保护功能和控制逻辑,适用于各种无刷直流电机驱动应用,如家电、工业自动化、机器人、电动工具等。
二、主要特性:
高集成度:
集成了 三相 MOSFET 驱动器、电流检测放大器 和 保护电路,减少外部元件数量。宽电压范围:
工作电压范围为 8V 至 60V,适合多种电源环境。高输出电流:
支持高达 10A 的峰值输出电流,能够驱动大功率无刷直流电机。多种控制接口:
支持 PWM 输入、模拟电压输入 和 I²C 接口,提供灵活的控制方式。内置保护功能:
过流保护(OCP)、过热保护(TSD)、欠压锁定(UVLO)、短路保护等,确保系统安全运行。低功耗设计:
采用低功耗设计,适合电池供电或低功耗应用。高精度电流检测:
内置电流检测放大器,支持高精度电流检测和控制。封装形式:
采用 48 引脚 VQFN 封装,体积小,适合紧凑型设计。三、引脚定义:
引脚名称 | 功能描述 |
---|---|
VM | 电机电源电压(8V 至 60V) |
VCC | 逻辑电源电压(通常为 3.3V 或 5V) |
GND | 地 |
OUT_U, OUT_V, OUT_W | 三相电机输出引脚,连接电机的 U、V、W 相 |
PWM_U, PWM_V, PWM_W | 三相 PWM 输入引脚,用于控制电机输出 |
I2C_SCL, I2C_SDA | I²C 接口引脚,用于配置和控制芯片 |
VREF | 参考电压输入,用于设置电流限制 |
FAULT | 故障指示引脚,当检测到故障时输出低电平 |
EN | 使能引脚,高电平有效(使能芯片) |
四、工作原理:
PWM 控制:
通过 PWM_U、PWM_V、PWM_W 引脚输入 PWM 信号,控制三相电机的输出。电流检测:
内置电流检测放大器,实时检测电机电流,并通过 VREF 引脚设置电流限制。保护功能:
当检测到过流、过热、欠压或短路时,芯片会自动关闭输出,并通过 FAULT 引脚指示故障。I²C 接口:
通过 I²C 接口可以配置芯片参数,如电流限制、PWM 频率等。三相驱动:
根据输入的 PWM 信号,芯片驱动三相 MOSFET,控制电机的转速和方向。五、应用领域:
家电:
用于洗衣机、冰箱、空调等家电中的无刷直流电机驱动。工业自动化:
用于传送带、机械臂、泵等设备的电机控制。机器人:
驱动机器人关节的无刷直流电机。电动工具:
用于电钻、电锯等电动工具中的电机驱动。无人机:
用于无人机中的无刷直流电机驱动。六、drv91680.h头文件:
#ifndef DRV91680_H
#define DRV91680_H
#include "stm32l4xx_hal.h"
// 引脚定义
#define DRV91680_PWM_U_PIN GPIO_PIN_0
#define DRV91680_PWM_U_PORT GPIOA
#define DRV91680_PWM_V_PIN GPIO_PIN_1
#define DRV91680_PWM_V_PORT GPIOA
#define DRV91680_PWM_W_PIN GPIO_PIN_2
#define DRV91680_PWM_W_PORT GPIOA
#define DRV91680_EN_PIN GPIO_PIN_3
#define DRV91680_EN_PORT GPIOA
#define DRV91680_FAULT_PIN GPIO_PIN_4
#define DRV91680_FAULT_PORT GPIOA
// PWM 定时器定义
#define DRV91680_PWM_TIM TIM2
#define DRV91680_PWM_TIM_HANDLE htim2
// 函数声明
void DRV91680_Init(void);
void DRV91680_Enable(void);
void DRV91680_Disable(void);
void DRV91680_SetPWM(uint32_t pwm_u, uint32_t pwm_v, uint32_t pwm_w);
uint8_t DRV91680_CheckFault(void);
#endif // DRV91680_H
七、drv91680.c源文件:
#include "drv91680.h"
extern TIM_HandleTypeDef DRV91680_PWM_TIM_HANDLE; // 外部定义的 PWM 定时器句柄
// 初始化 DRV91680
void DRV91680_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能 GPIO 时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置 PWM 引脚
GPIO_InitStruct.Pin = DRV91680_PWM_U_PIN | DRV91680_PWM_V_PIN | DRV91680_PWM_W_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // 根据实际定时器选择 AF
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置使能引脚
GPIO_InitStruct.Pin = DRV91680_EN_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DRV91680_EN_PORT, &GPIO_InitStruct);
// 配置故障检测引脚
GPIO_InitStruct.Pin = DRV91680_FAULT_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(DRV91680_FAULT_PORT, &GPIO_InitStruct);
// 启动 PWM 定时器
HAL_TIM_PWM_Start(&DRV91680_PWM_TIM_HANDLE, TIM_CHANNEL_1); // U 相
HAL_TIM_PWM_Start(&DRV91680_PWM_TIM_HANDLE, TIM_CHANNEL_2); // V 相
HAL_TIM_PWM_Start(&DRV91680_PWM_TIM_HANDLE, TIM_CHANNEL_3); // W 相
// 默认禁用驱动器
DRV91680_Disable();
}
// 启用 DRV91680
void DRV91680_Enable(void) {
HAL_GPIO_WritePin(DRV91680_EN_PORT, DRV91680_EN_PIN, GPIO_PIN_SET);
}
// 禁用 DRV91680
void DRV91680_Disable(void) {
HAL_GPIO_WritePin(DRV91680_EN_PORT, DRV91680_EN_PIN, GPIO_PIN_RESET);
}
// 设置 PWM 占空比
void DRV91680_SetPWM(uint32_t pwm_u, uint32_t pwm_v, uint32_t pwm_w) {
__HAL_TIM_SET_COMPARE(&DRV91680_PWM_TIM_HANDLE, TIM_CHANNEL_1, pwm_u); // U 相
__HAL_TIM_SET_COMPARE(&DRV91680_PWM_TIM_HANDLE, TIM_CHANNEL_2, pwm_v); // V 相
__HAL_TIM_SET_COMPARE(&DRV91680_PWM_TIM_HANDLE, TIM_CHANNEL_3, pwm_w); // W 相
}
// 检查故障
uint8_t DRV91680_CheckFault(void) {
return HAL_GPIO_ReadPin(DRV91680_FAULT_PORT, DRV91680_FAULT_PIN) == GPIO_PIN_RESET;
}
八、主函数:
#include "stm32l4xx_hal.h"
#include "drv91680.h"
int main(void) {
// HAL 库初始化
HAL_Init();
// 系统时钟配置
SystemClock_Config();
// 初始化 DRV91680
DRV91680_Init();
// 启用 DRV91680
DRV91680_Enable();
// 设置 PWM 占空比(0 到 1000 之间)
DRV91680_SetPWM(500, 500, 500); // 50% 占空比
while (1) {
// 检查故障
if (DRV91680_CheckFault()) {
// 处理故障
DRV91680_Disable();
break;
}
// 主循环
HAL_Delay(10);
}
}
// 系统时钟配置函数
void SystemClock_Config(void) {
// 根据实际情况配置系统时钟
}