DRV8313 是一款高性能的三相无刷直流(BLDC)电机驱动器集成电路,集成了三个独立的半H桥,用于驱动三相电机。
核心特性与参数
| 特性 | 参数/描述 |
|---|---|
| 工作电压 | 8V 至 60V |
| 峰值输出电流 | 2.5A |
| 控制接口 | 6路PWM输入(独立半桥控制)或 3路PWM输入(xIN/xEN模式) |
| 电流检测 | 集成低侧电流感测放大器,支持单/双/三相电流采样 |
| 内置保护 | 过流保护(OCP)、短路保护、欠压锁定(UVLO)、过温关断(OTSD) |
| 电荷泵 | 集成,用于高侧N-MOSFET的栅极驱动,确保100%占空比工作 |
| 封装 | HTSSOP-28 |
典型应用电路与接口
DRV8313 常用于构建紧凑型电机驱动模块,其典型应用包括外部功率电路、电源转换和微控制器接口。
一个基本的驱动板设计通常包含以下部分:
- 主控芯片电路:DRV8313及其必要的外围滤波、配置电阻电容。
- 电源电路:为电机供电的高压(如24V)输入,以及通过降压芯片(如MP2451)为MCU和DRV8313逻辑部分供电的3.3V/5V电路。
- 接口电路:与MCU连接的PWM、使能、故障信号接口,以及用于调试或通信的接口(如CH340 USB转串口、I2C显示屏接口)。
基于STM32的驱动程序设计示例
以下代码展示了基于STM32 HAL库对DRV8313进行初始化和基本控制的框架。
- 引脚与SPI配置(头文件示例)
c
// drv8313.h
#ifndef __DRV8313_H
#define __DRV8313_H
#include "main.h"
//定义与DRV8313连接的硬件引脚
#define DRV_nFAULT_Pin GPIO_PIN_2
#define DRV_nFAULT_GPIO_Port GPIOA
#define DRV_nSLEEP_Pin GPIO_PIN_3
#define DRV_nSLEEP_GPIO_Port GPIOA
// DRV8313寄存器地址定义#define DRV8313_REG_CONTROL 0x00
#define DRV8313_REG_STATUS 0x01
// ... 其他寄存器定义
// 函数声明
void DRV8313_Init(SPI_HandleTypeDef *hspi);
void DRV8313_SetBridgeControl(uint8_t bridge, uint8_t state);
uint8_t DRV8313_ReadStatus(void);
void DRV8313_Enable(void);
void DRV8313_Disable(void);
#endif
- 初始化与控制函数(源文件示例)
c
// drv8313.c
#include "drv8313.h"
static SPI_HandleTypeDef *hspi_drv8313;
//初始化函数void DRV8313_Init(SPI_HandleTypeDef *hspi) {
hspi_drv8313 = hspi;
// 1. 配置硬件引脚(nSLEEP, nFAULT等)为输出/输入
//2. 拉低nSLEEP引脚,使芯片进入睡眠模式 HAL_GPIO_WritePin(DRV_nSLEEP_GPIO_Port, DRV_nSLEEP_Pin, GPIO_PIN_RESET);
HAL_Delay(10);
// 3. 拉高nSLEEP,唤醒芯片 HAL_GPIO_WritePin(DRV_nSLEEP_GPIO_Port, DRV_nSLEEP_Pin, GPIO_PIN_SET);
HAL_Delay(10); // 等待芯片稳定 // 4. 通过SPI配置芯片控制寄存器(例如,设置PWM模式、电流检测增益等)
uint8_t tx_data[2] = {DRV8313_REG_CONTROL | 0x80, 0x1F}; // 示例:写入控制寄存器
uint8_t rx_data[2];
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(hspi_drv8313, tx_data, rx_data, 2, 100);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET);
}
// 设置单个半桥状态 (IN/EN模式示例)
void DRV8313_SetBridgeControl(uint8_t bridge, uint8_t state) {
// bridge: 0,1,2 对应 A, B, C 相
// state: 0=高阻,1=高侧开,2=低侧开,3=刹车(高低侧同时开)
// 此函数需要根据具体的PWM输入模式,操作对应的MCU PWM输出引脚
// 例如,使用HAL_TIM_PWM_Start/Stop函数控制定时器通道
}
// 读取状态寄存器
uint8_t DRV8313_ReadStatus(void) {
uint8_t tx_data = DRV8313_REG_STATUS & 0x7F; // 读命令,最高位为0
uint8_t rx_data = 0;
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(hspi_drv8313, &tx_data, &rx_data, 1, 100);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET);
return rx_data;
}
// 使能电机驱动(拉高所有EN引脚或使能PWM输出)
void DRV8313_Enable(void) {
// 实现代码,例如将三个EN引脚置高
}
// 失能电机驱动void DRV8313_Disable(void) {
// 实现代码,例如将三个EN引脚置低
}
- 主程序应用示例
c
// main.c 片段
int main(void) {
// HAL初始化...
DRV8313_Init(&hspi1); // 初始化DRV8313 DRV8313_Enable(); // 使能驱动器
// 配置定时器产生三路互补PWM,用于FOC或六步换向控制 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
while (1) {
// 检查故障标志 if(HAL_GPIO_ReadPin(DRV_nFAULT_GPIO_Port, DRV_nFAULT_Pin) == GPIO_PIN_RESET) {
uint8_t status = DRV8313_ReadStatus(); // 读取状态寄存器确定故障原因
// 处理故障...
}
// 电机控制算法(如FOC)在此更新PWM占空比...
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty_cycle_a);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, duty_cycle_b);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, duty_cycle_c);
}
}
关键设计注意事项1. 电源去耦 :在 VM(电机电源)和 VDD(逻辑电源)引脚附近必须放置足够容量的滤波电容,以抑制电压尖峰和噪声。
- 电流检测 :利用芯片内部的低侧电流感测放大器,通过采样电阻将电流转换为电压,并连接到
SPx/SNx引脚。布局时需确保采样走线的对称性和低噪声。 - 热管理:芯片功耗与输出电流和MOSFET导通电阻有关。在持续大电流工作时,需要根据热阻参数计算结温,并设计足够的散热措施(如PCB散热焊盘、过孔、外加散热片)。
- 保护功能 :充分利用其内置的过流、短路、欠压和过温保护。
nFAULT引脚应连接到MCU的中断引脚,以便及时响应故障。