【零基础实战指南】STM32驱动DRV8833电机控制详解

系列文章目录

1.元件基础
2.电路设计
3.PCB设计
4.元件焊接
5.板子调试
6.程序设计
7.算法学习
8.编写exe
9.检测标准
10.项目举例
11.职业规划


文章目录

  • 一、DRV8833模块简介
  • 二、STM32选型建议
  • 三、硬件连接详解
  • 1. 接线示意图
  • 2. 电源注意事项
  • 四、核心控制原理
  • 1. PWM调速原理
  • 2. H桥工作原理
  • 五、软件编程实战
  • 1. GPIO初始化(CubeMX配置)
  • 2. PWM配置(以TIM2为例)
  • 3. 电机控制函数
  • 六、常见问题Q&A
  • Q1:电机不转怎么办?
  • Q2:如何避免芯片烧毁?
  • 七、实验效果展示
  • 一、DRV8833模块简介

    DRV8833 是一款双H桥电机驱动芯片,可同时驱动2个直流电机或1个步进电机。核心参数:

  • 工作电压:2.7V-10.8V
  • 单通道最大电流:1.5A(持续)/2A(峰值)
  • 支持PWM调速

  • 二、STM32选型建议

    推荐使用 STM32F103C8T6(Blue Pill开发板):

  • 72MHz主频,性能充足
  • 提供多路PWM输出
  • 丰富GPIO资源
  • 社区资料丰富

  • 三、硬件连接详解

    1. 接线示意图

    | DRV8833引脚 | STM32连接 | 作用 |
    |–|
    | AIN1/AIN2 | PA0/PA1 | 电机A控制信号 |
    | BIN1/BIN2 | PA2/PA3 | 电机B控制信号 |
    | VM | 7-12V电源正极 | 电机电源 |
    | GND | 共地 | 电源地 |

    2. 电源注意事项

  • 逻辑电源:3.3V由STM32提供
  • 电机电源:需独立7-12V供电
  • 共地处理:必须连接STM32与DRV8833的GND

  • 四、核心控制原理

    1. PWM调速原理

    通过调节 占空比(高电平时间占比)控制电机电压平均值:

  • 占空比0% → 电机停转
  • 占空比50% → 半速运行
  • 占空比100% → 全速运行
  • 2. H桥工作原理

    四个MOSFET组成H桥,通过不同导通组合实现:

    输入组合 电机动作
    AIN1=1, AIN2=0 正转
    AIN1=0, AIN2=1 反转
    AIN1=0, AIN2=0 刹车

    五、软件编程实战

    1. GPIO初始化(CubeMX配置)

    // 配置PA0-PA3为推挽输出
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    

    2. PWM配置(以TIM2为例)

    // 定时器初始化
    TIM_HandleTypeDef htim2;
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 71;          // 72MHz/72=1MHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 999;            // 1MHz/1000=1kHz PWM
    HAL_TIM_PWM_Init(&htim2);
    
    // PWM通道配置
    TIM_OC_InitTypeDef sConfigOC;
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 500;              // 初始占空比50%
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
    

    3. 电机控制函数

    void MotorA_SetSpeed(int speed) {
      // 限制PWM值在0-999之间
      speed = (speed > 999) ? 999 : (speed < 0) ? 0 : speed;
      
      // 设置方向
      if(speed >= 0) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
      } else {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
        speed = -speed;
      }
      
      // 更新PWM值
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, speed);
    }
    

    六、常见问题Q&A

    Q1:电机不转怎么办?

    1. 检查电源是否正常
    2. 确认共地连接
    3. 用万用表测量PWM输出
    4. 尝试提高占空比

    Q2:如何避免芯片烧毁?

    1. 确保散热良好
    2. 电机电流不超过1.5A
    3. 先上电逻辑电源再接通电机电源

    七、实验效果展示

    通过串口发送速度指令(-1000~1000),可观察到:

  • 正负值对应正反转
  • 绝对值大小决定转速
  • 0值实现急停刹车
  • 作者:【云轩】

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【零基础实战指南】STM32驱动DRV8833电机控制详解

    发表回复