基于STM32L4XX、HAL库的DRV91680RGZR 驱动程序设计

一、简介:

        DRV91680RGZR 是德州仪器(Texas Instruments, TI)推出的一款高性能、高集成度的 三相无刷直流(BLDC)电机驱动芯片。它集成了 MOSFET 驱动器、电流检测、保护功能和控制逻辑,适用于各种无刷直流电机驱动应用,如家电、工业自动化、机器人、电动工具等。

二、主要特性:

  1. 高集成度

    集成了 三相 MOSFET 驱动器电流检测放大器 和 保护电路,减少外部元件数量。
  2. 宽电压范围

    工作电压范围为 8V 至 60V,适合多种电源环境。
  3. 高输出电流

    支持高达 10A 的峰值输出电流,能够驱动大功率无刷直流电机。
  4. 多种控制接口

    支持 PWM 输入模拟电压输入 和 I²C 接口,提供灵活的控制方式。
  5. 内置保护功能

    过流保护(OCP)、过热保护(TSD)、欠压锁定(UVLO)、短路保护等,确保系统安全运行。
  6. 低功耗设计

    采用低功耗设计,适合电池供电或低功耗应用。
  7. 高精度电流检测

    内置电流检测放大器,支持高精度电流检测和控制。
  8. 封装形式

    采用 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 使能引脚,高电平有效(使能芯片)

四、工作原理:

  1. PWM 控制

    通过 PWM_U、PWM_V、PWM_W 引脚输入 PWM 信号,控制三相电机的输出。
  2. 电流检测

    内置电流检测放大器,实时检测电机电流,并通过 VREF 引脚设置电流限制。
  3. 保护功能

    当检测到过流、过热、欠压或短路时,芯片会自动关闭输出,并通过 FAULT 引脚指示故障。
  4. I²C 接口

    通过 I²C 接口可以配置芯片参数,如电流限制、PWM 频率等。
  5. 三相驱动

    根据输入的 PWM 信号,芯片驱动三相 MOSFET,控制电机的转速和方向。

五、应用领域:

  1. 家电

    用于洗衣机、冰箱、空调等家电中的无刷直流电机驱动。
  2. 工业自动化

    用于传送带、机械臂、泵等设备的电机控制。
  3. 机器人

    驱动机器人关节的无刷直流电机。
  4. 电动工具

    用于电钻、电锯等电动工具中的电机驱动。
  5. 无人机

    用于无人机中的无刷直流电机驱动。

六、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) {
    // 根据实际情况配置系统时钟
}

你可能感兴趣的:(STM32,外设驱动程序设计,stm32,嵌入式硬件,单片机)