好的!下面为你详细整理一份基于 DRV8870/AT8870 直流电机驱动芯片,结合 STM32CubeMX 配置,以及利用 PWM + DMA 实现可调速控制 的完整方案,包含硬件连接说明、CubeMX配置建议、驱动代码示例和关键点讲解,方便你快速上手开发。


直流电机驱动 — DRV8870/AT8870 【STM32CubeMX 配置 + 驱动代码 + PWM+DMA 可调速】


目录

  1. DRV8870/AT8870芯片简介
  2. 硬件连接说明
  3. STM32CubeMX配置建议
  4. PWM+DMA调速原理
  5. STM32驱动代码示例
  6. 调速示例说明
  7. 注意事项与拓展建议

1. DRV8870/AT8870芯片简介

  • DRV8870 是德州仪器TI出品的一款高效、单通道直流电机驱动芯片
  • 支持宽电压范围(6.5V~45V),最大输出电流可达3.6A
  • 内置过流保护、过温保护、短路保护等
  • 通过输入引脚控制电机的启停和转向(IN1、IN2)
  • 通过PWM输入控制电机转速

2. 硬件连接说明

DRV8870引脚STM32连接说明
VM电机电源6.5V~45V
GNDGND公共地
OUT1, OUT2接电机两端电机接这两个引脚
IN1STM32 PWM输出控制电机方向和PWM
IN2STM32 GPIO控制电机方向
nFAULTSTM32 GPIO(可选)监测故障信号
  • 电机两端连接 OUT1 和 OUT2
  • 通过 IN1 和 IN2 控制转向
  • PWM信号通过 IN1 进行调速控制

3. STM32CubeMX配置建议

  • 定时器配置:
    • 选择一个支持PWM输出的定时器(如TIM2)
    • 配置一个PWM通道,频率根据电机特性,一般1kHz~20kHz
    • 使能DMA请求(用于PWM占空比动态调整)
  • GPIO配置:
    • IN2 配置为普通GPIO输出,用于控制电机正反转
    • nFAULT 可配置为外部中断输入(如果需要监控故障)
  • DMA配置:
    • 关联PWM定时器通道对应的CCR寄存器,配置内存到外设传输

4. PWM+DMA调速原理

  • PWM 占空比决定电机的实际平均供电电压,进而控制转速
  • DMA自动更新PWM占空比寄存器,减少CPU负载,实现平滑转速控制
  • 通过预设占空比数组,DMA循环传输,实现动态调速效果

5. STM32驱动代码示例

#include "main.h"

TIM_HandleTypeDef htim2;
DMA_HandleTypeDef hdma_tim2_ch1;

// 模拟占空比数组,0~100%范围
uint32_t pwmDutyCycle[5] = {0, 250, 500, 750, 1000}; // 对应占空比0%,25%,50%,75%,100%

// 初始化PWM
void PWM_Init(void) {
    HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, pwmDutyCycle, 5);
}

// 设置电机转向,IN2控制
void Motor_SetDirection(uint8_t dir) {
    if(dir == 0) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // IN2=0,方向A
    } else {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);   // IN2=1,方向B
    }
}

// DMA传输完成回调(循环模式下,每5个占空比轮流更新)
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {
    // 可加业务逻辑,如调速调整
}

// 主循环示例
int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_TIM2_Init();

    PWM_Init();
    Motor_SetDirection(0);  // 设置方向

    while (1) {
        // 主循环可根据业务需求调整pwmDutyCycle数据,DMA会自动刷新
    }
}

6. 调速示例说明

  • PWM频率由 TIM2 的 Prescaler 和 Period 决定,比如:
    • 定时器时钟 72MHz
    • 预分频器 Prescaler = 71,计数频率 = 1MHz
    • 自动重载寄存器 Period = 999,PWM频率 = 1kHz
  • pwmDutyCycle数组中,值范围 [0, 1000] 对应占空比 0% ~ 100%
  • 通过DMA循环传输占空比数组,电机转速实现变化

7. 注意事项与拓展建议

  • 电机电源与STM32地线必须共地,避免地环路
  • DRV8870输入信号电压需符合芯片要求(一般3.3V MCU兼容)
  • 过流保护和散热设计不可忽略
  • DMA使用循环模式时,注意数据更新的同步问题
  • 可添加故障检测和限流反馈,提升可靠性