在面包板上搭建 Arduino 控制的 BLDC 电机驱动器

预览:

  • 通过自制面包板驱动器,使用Arduino控制无刷直流电机。本指南包含硬件及极简代码。

  • 需使用三相H桥电路。通过高端MOSFET的PWM实现变速控制。

  • 采用梯形驱动方式,换相取决于电机霍尔效应传感器的状态。

  • 该项目具有挑战性,但对提升搭建与故障排查能力大有裨益。

介绍

无刷直流电机(BLDC)应用广泛,常见于电动工具、四轴飞行器、伺服电机乃至洗衣机等家电中。典型系统包含电机本体与三相电机驱动器两部分。本文展示如图1所示的基于Arduino的自制电机控制器。此极简面包板设计可同时探索无刷直流电机的硬件与软件实现。

1 :前景为Arduino控制的三相H桥电路,背景是无刷直流电机与Digilent Analog Discovery Pro(ADP2230)。

安全提示 :启用15V直流电源时,请断开计算机USB端口以保护PC。这能防止15V直流电源与Arduino引脚意外连接。

忽视此警告可能导致 PC USB 端口、处理器或主板损毁。

建议改用独立电源(如廉价手机充电器)为Arduino供电。此外,也可考虑购买USB端口隔离器保护PC。

本文介绍基于Arduino的无刷直流电机驱动系统。其采用简易梯形控制系统,通过光学霍尔传感器获取转子位置反馈。本文为该系列第七篇。建议先阅读基础内容,特别是关于自举式Infineon(IR)IR2110PBF驱动器的说明。同时务必了解带光学(模拟)霍尔效应传感器的正交编码器工作原理。这些前置知识对理解无刷直流电机运行机制至关重要。

什么是无刷直流电机?

回想一下,普通直流电机包含三个基本组件:电枢、换向器/电刷组件以及作为磁场的永磁体。当电枢的电磁场与定子的永磁场相互作用时,便产生扭矩。

换向器和电刷组件是直流电机的关键部件,它们负责向电枢绕组换向电流。电刷与换向器共同构成机械开关,为电枢绕组提供极性正确的电流。

无刷直流电机(BLDC)与直流电机密切相关。在最基本的层面上,我们将直流电机描述为一种通过电刷和换向器实现机电换向的机器。无刷直流电机与之类似,但它是通过带有MOSFET或IGBT的驱动单元实现电子换向。两种情况下,换向都依赖于精确掌握转轴位置。这对直流电机来说是既定事实,因为电刷直接连接电枢。无刷直流电机的电子系统会感知转轴的旋转位置。

从技术上讲,无刷直流电机是一种采用永磁转子的同步三相电机。该电机可设计为内转子式(永磁体位于转子内部)或外转子式(永磁体位于外部转子)。多数四轴飞行器电机采用外转子结构,具有大型外部转子。大多数伺服电机采用内转子结构。这种线圈外置的结构提供了绝佳的散热途径。

技术提示 :无刷直流电机有多种换向方式,包括开环控制、物理霍尔效应传感器、模拟霍尔传感器的光学编码器,以及检测电机反电动势。配备物理传感器的电机可实现低速控制,包括转子静止时的保持扭矩。

无刷直流电机 H

如图1所示的三相H桥用于驱动电机线圈。它由三个桥臂组成,如先前文章所述,与本文介绍的全H桥最为相似。除了下一节将描述的换向过程外,关于该物理电路的介绍在基础文章中已基本涵盖。

无刷直流电机换向

图2所示蚀刻盘是这款无刷直流电机换向的起点。已识别出六种状态。这是一个3位格雷码,在任何给定时刻仅有一位且只有一位发生变化。该序列被识别为001、011、010、110、100、101循环。这一模式反映在图3的霍尔数据中(逻辑分析仪显示界面的上方三条轨迹)。本文后续的代码清单也体现了这一点。
需注意霍尔传感器用于识别转子的物理位置。这不是随机位置,而是与电机相位线圈对齐的位置。在先前文章中我们展示过霍尔传感器与电机相绕组对齐的配置。每个电机相位的电气过零点处,都对应着一个霍尔传感器上升沿跳变。

这一点再怎么强调都不为过:霍尔传感器用于确定转子的位置。基于此认知,我们可以在正确时间激活正确的相位绕组。

技术提示 :您可能从卡诺图中认出了这个格雷码。当我们在步骤间切换时,仅会发生单比特变化。

2 :显示编码器中断盘的近距离特写图像。橙色线条标识了相位槽的过渡点。

技术提示 :根据电枢旋转位置正确激活(换向)相位线圈对平稳运行至关重要。换向错误将导致磁极滑移,给系统带来严重的机械和电气应力。

换向评估

理想情况下,我们应向电机输入三相正弦信号。遗憾的是该技术较为复杂,超出本篇基础文章的讨论范围。我们将采用图3所示的三相梯形波控制方案作为替代。该技术相对简单,因为换向完全基于电机的三个霍尔传感器。

已知霍尔传感器在每个电气周期提供001、011、010、110、100、101的循环序列,我们可以构建状态机来激活对应线圈。结果如图 3 所示。注意观察:

  • 三个驱动信号显示在示波器图像的上半部分。注意相位输出可能被拉低、在续流二极管边界内浮动(高阻抗状态)或通过PWM主动控制。低电平有效部分与PWM有效部分均可清晰辨识。高阻抗状态呈现为模糊的梯形斜坡状。

  • 在任何给定时刻,一个高边MOSFET和一个低边MOSFET处于激活状态。我们对高边MOSFET施加PWM信号,对低边MOSFET施加持续开启信号。

  • 图中存在一个反复出现的模式,即信号向右上方移动。例如,我们从左侧开始对C相(绿色)进行PWM控制。向右上方移动时,我们对B相(蓝色)进行PWM控制。随后对C相(橙色)进行PWM控制。

  • 桥驱动信号显示为逻辑分析仪界面的下方6条轨迹。三条信号用于高边MOSFET的PWM控制,三条信号用于低边MOSFET的控制。这些信号在时间上与上方示波器显示的相位输出直接对应。

  • 相位输出与霍尔传感器相关联。此图暗示了一种反向关系,即第一个霍尔传感器的下降沿对应A相的正零交叉点。

  • 程序未进行优化。可以观察到霍尔传感器变化与驱动信号相应变化之间的微小延迟。

3 :运行中的BLDC驱动器相关波形,包括相位驱动(顶部)、三个霍尔传感器及六个MOSFET驱动信号。

代码

演示电路的代码如下所示。这是一个相对简单的Arduino实现,仅存在少数例外情况。

  • Arduino Nano Every采用了PWM技术。如视频1所示,为实现电机转速的平稳控制,PWM运行频率必须高于默认值。请注意,Arduino默认约1kHz的PWM频率几乎与电机电气频率相同。速度过慢。

  • 通过cli()函数关闭了中断,且代码始终不允许跳出loop()函数。虽然这些改动会破坏或影响Arduino的正常功能,但这是让Arduino跟上电机转速的必要措施。

代码核心是对变量hall进行开关判断。通过重复001、011、010、110、100、101的序列来激活正确的H桥驱动器。

视频 1 :无刷直流电机能迅速响应设定点电位器的变化。

/**** CAUTION ****  **** CAUTION ****  **** CAUTION ****  **** CAUTION ****  **** CAUTION ****
 *
 * This code is written specifically for an Arduino Nano Every. It will NOT work on other Arduino
 * microcontrollers as it depends on direct SFR manipulation to operate in a fast PWM mode.
 * For fast PWM technique refer to https://forum.digikey.com/t/fast-pwm-for-the-arduino-nano-every/40023
 *
 */

#define AL_PIN 10  // Phase A
#define AH_PIN 9   // PWM

#define BL_PIN 7  // Phase B
#define BH_PIN 6  // PWM

#define CL_PIN 4  // Phase C
#define CH_PIN 3  // PWM

#define H3_PIN 18  // Hall sensor inputs
#define H2_PIN 19
#define H1_PIN 20

#define VREF_PIN A7  // Duty cycle setpoint

#define MAX_PWM_VAL 250

void setup( ) {

TCA0.SINGLE.CTRLA = 0b00000011;  // All PWM to 32 kHz (ATMega4809 specific SFR)

  pinMode(AL_PIN, OUTPUT);
  pinMode(AH_PIN, OUTPUT);
  pinMode(BL_PIN, OUTPUT);
  pinMode(BH_PIN, OUTPUT);
  pinMode(CL_PIN, OUTPUT);
  pinMode(CH_PIN, OUTPUT);

  pinMode(H3_PIN, INPUT);
  pinMode(H2_PIN, INPUT);
  pinMode(H1_PIN, INPUT);

}

void loop( ) {

  cli( ); // Disable interrupts

  while (1) {

    static uint8_t last_hall, last_D;

    uint16_t setpoint = analogRead(VREF_PIN);

    uint8_t D = setpoint >> 2;
    if (D > MAX_PWM_VAL) {
      D = MAX_PWM_VAL;
    }

    uint8_t hall = 0x00;
    hall = hall + digitalRead(H3_PIN);
    hall = hall << 1;
    hall = hall + digitalRead(H2_PIN);
    hall = hall << 1;
    hall = hall + digitalRead(H1_PIN);

    if ((hall != last_hall) || (D != last_D)) {

      if (hall != last_hall) {   // All off for new commutation
        analogWrite(AH_PIN, 0);  // Upper PWM drivers off
        analogWrite(BH_PIN, 0);
        analogWrite(CH_PIN, 0);
      }

      last_hall = hall;
      last_D = D;

      switch (hall) {

        case 0b001:
          digitalWrite(AL_PIN, LOW);
          digitalWrite(BL_PIN, LOW);
          digitalWrite(CL_PIN, HIGH);
          analogWrite(AH_PIN, D);
          break;

        case 0b011:
          digitalWrite(AL_PIN, LOW);
          digitalWrite(BL_PIN, LOW);
          digitalWrite(CL_PIN, HIGH);
          analogWrite(BH_PIN, D);
          break;

        case 0b010:
          digitalWrite(BL_PIN, LOW);
          digitalWrite(CL_PIN, LOW);
          digitalWrite(AL_PIN, HIGH);
          analogWrite(BH_PIN, D);
          break;

        case 0b110:
          digitalWrite(BL_PIN, LOW);
          digitalWrite(CL_PIN, LOW);
          digitalWrite(AL_PIN, HIGH);
          analogWrite(CH_PIN, D);
          break;

        case 0b100:
          digitalWrite(AL_PIN, LOW);
          digitalWrite(CL_PIN, LOW);
          digitalWrite(BL_PIN, HIGH);
          analogWrite(CH_PIN, D);
          break;

        case 0b101:
          digitalWrite(AL_PIN, LOW);
          digitalWrite(CL_PIN, LOW);
          digitalWrite(BL_PIN, HIGH);
          analogWrite(AH_PIN, D);
          break;

        default:
          while (1) ;  // should never get here
          break;
      }
    }
  }
}

下一步

  • 本文是对电机控制的简要介绍。提升知识的途径多种多样:

  • 修改代码使电机可双向运转。

  • 集成正交编码器实现精密位置与速度控制。

  • 采用裸机技术编程ATmega4809以提升性能。一些例子包括:

    • 通过直接设置端口寄存器改变电机驱动I/O

    • 使用中断变化技术设置驱动I/O

  • 改用专为三相电机控制设计的高级微控制器。

  • 加入电流检测机制防止过载和短路。

  • 设计包含S曲线加速控制的完整位置与速度控制算法。

  • 尝试使用现代MOSFET/IGBT驱动器。请注意演示用的IRF2110PBF已有30多年历史,不推荐用于新设计。

  • 自行设计PCB电路板。

  • 采购商用现成(COTS)电机驱动器并探索应用方案。终极挑战:设计一个能快速转移卷筒纸的舞蹈机械装置。此处的"舞蹈"指机械臂通过张力调节和反馈机制确保纸张不断裂。

  • 最重要的是享受学习过程。

最后的思考

我们已证明无刷电机驱动可在面包板上搭建。使用Arduino微控制器即可实现控制(基本)不超出Arduino语言范畴。

做好准备,本项目将把面包板搭建和故障排查技能提升到新高度。虽未达到Ben Eater的巅峰水准,但已相去不远。预计会烧毁几个MOSFET和电机驱动芯片。另外,你阅读过开头的安全提示了吗?请保护好贵重设备,操作失误可能损毁Arduino或电脑——这就是电力电子实验的特性。

相关信息

请点击以下链接获取相关和有用的信息: