搭建基于Arduino的H桥电机控制器

Arduino控制H桥的电路搭建指南,采用带自举高压侧驱动的MOSFET驱动集成电路。这些理论课程与电路构建技术将助您设计功能完备的单相/三相逆变器及电机驱动系统。

本文为该系列第4篇。继续之前,请研读以下链接内容,了解基础桥臂电路原理及完整H桥的工作理论。请特别关注自举电路,这是英飞凌(国际整流器)IR2110PBF等商用MOSFET栅极驱动器的核心设计,如图1所示。末篇链接同样重要,它详解了H桥运行机制,包括意外电流尖峰、续流二极管换向及电机制动等特殊现象。

1 :驱动Pololu直流电机的面包板Arduino控制H桥。采用Digilent Analog Discovery 3分析Arduino波形。

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

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

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

既然市售 H 桥唾手可得,为何还要自行搭建?

必须承认,高性能商用现成(COTS)H桥已十分普及。类似架构的实例可见Seeed(Cytron)MD13S。这款紧凑型板卡可驱动30VDC/13A持续电流的电机,而本实验中的面包板组装方案仅支持约1A电流。

但这并非重点。

DIY H桥电机驱动器犹如工程师的成人礼。由于电路的高功率与高频特性会挑战面包板的极限,搭建稳定电路极具挑战性。同样需要注意微控制器/FPGA设计,确保如本文所述正确控制半导体开关的换向。

技术提示 :我仍怀念初次DIY电机驱动的实验时光。当时没有可调电流的电源。但有成百上千从废料场回收的MOSFET——只要我肯拆解铝制散热片就能无限获取。想必您已猜到结局。失误常导致MOSFET爆炸性损毁,伴随一英尺高的火球。请以我为鉴。从小功率可调电源开始实验。

做好准备,这个实验可能代价不菲——学习过程中难免损毁若干MOSFET和驱动IC。记得用廉价手机充电器为微控制器供电,以保护电脑USB接口。

但您将在此过程中掌握宝贵的组装与故障排查技能。当你迈出下一步并在PCB上迭代设计时,期待指数级的学习,力求打造一个能优雅处理过载条件的紧凑电路。为了更大的挑战,可以添加第三个桥臂,为BLDC或同步电机设计一个三相驱动器。如果你仍在游戏中,可以继续研究IGBT和用于感应电机的三相矢量驱动,配备完整的变频驱动器(VFD)。

电路描述

如图2所示的原理图是之前介绍的桥臂的克隆。不同之处在于H桥使用了两个基于IR2110PBF的桥臂。总的来说,该桥使用了两个驱动IC,连接到四个IRF520PBF MOSFET,并以Arduino Nano Every作为控制元件。

之前的文章中,电机的正极连接到桥臂的中心,而负极连接到地。记得电机的速度可以控制,但方向无法控制。为方便起见,原理图包含在图3中。

注意电机的接地端现在连接到第二个H桥,如图2所示。这允许对直流电机进行完全的速度和方向控制。

2 :采用2个IR2110驱动器和Arduino Nano Every的H 桥原理图。Arduino通过其USB端口供电(未显示)。

3 :采用IR2110驱动器和Arduino Nano Every的桥臂原理图。电容器C2执行关键的升压操作。Arduino通过其USB端口供电(未显示)。

接线

请原谅我。除了原理图和作为图1的面包板极其不充分的图像外,我不会提供任何额外信息。我内心的教授不允许我提供更多。

明白你在构建电路时会犯错。在设计中进行故障排除非常有价值。这是一种被低估的技能,你需要培养它才能成功解决未来PCB设计中的问题。错误难免发生。例如,在构建第二个桥臂时,我不小心漏掉了低端驱动连接(IR2110的引脚1)。电路勉强——间歇性地——工作了。幸运的是,工作台电源的电流限制在MOSFET被毁之前激活了。提示:绝不要让MOSFET栅极浮空。

接线技巧

保持整洁与隔离。例如,图1中的驱动器和微控制器分别位于不同的面包板上。每个电路都独立搭建并测试。这实现了5伏直流与15伏直流电源的清晰隔离。这一点至关重要,因为若将15伏直流电源与任何Arduino输入/输出引脚接触,会立即损毁Arduino(伴随爆响和持续冒烟),还可能损坏USB电源(若殃及电脑则令人痛惜)。请参考先前关于使用端口隔离器或手机充电器为Arduino供电的安全建议。保护好您昂贵的设备!

切勿尝试一次性搭建整个电路。应分别搭建桥臂并独立排查故障。例如,将电机连接在桥臂与地线之间,通过向高端驱动器发送PWM信号进行测试。同理,将电机接在桥臂与正极母线之间,通过低端驱动器的PWM信号测试。

还需注意桥臂驱动器是复制的。每个部分应当完全一致。

代码描述

基础Arduino软件如本清单所示。这是无保护措施的(开环)暴力解决方案,MOSFET管毫无防护。

/**** 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 techniques, refer to https://forum.digikey.com/t/fast-pwm-for-the-arduino-nano-every/40023
 *
 */

#define LL_PIN 7
#define LH_PIN 6  // Fast PWM
#define RL_PIN 4
#define RH_PIN 3  // Fast PWM
#define VREF_PIN A7

#define MAX_PWM_VAL 250

enum Direction {
  CW = true, 
  CCW = false 
};

Direction direction;

void setup( ) {
  pinMode(LL_PIN, OUTPUT);
  pinMode(LH_PIN, OUTPUT);
  pinMode(RL_PIN, OUTPUT);
  pinMode(RH_PIN, OUTPUT);

  TCB0_CTRLA = 0b00000011;  // Fast PWM for pin D6
  TCB1_CTRLA = 0b00000011;  // Fast PWM for pin D3
}

void loop( ) {

  static uint16_t last_setpoint;
  uint16_t setpoint = analogRead(VREF_PIN);

  if (setpoint != last_setpoint) {

    last_setpoint = setpoint;

    // Potentiometer set to middle turns off the motor. Middle and above yields CW, while below middle yields CCW.
    // Recall that analogRead( ) returns a value from 0 to 1023 while analogWrite( ) accepts a value between 0 and 255.
    //
    if (setpoint > 512) {
      direction = CW;
      setpoint = (setpoint - 512) >> 1;
    } else {
      direction = CCW;
      setpoint = (512 - setpoint) >> 1;
    }

    if (setpoint > MAX_PWM_VAL) {
      setpoint = MAX_PWM_VAL;
    }

    analogWrite(LH_PIN, 0);  // Turn off all PWM to prevent shoot through
    analogWrite(RH_PIN, 0);
    digitalWrite(LL_PIN, LOW);
    digitalWrite(RL_PIN, LOW);

    if (direction == CW) {
      digitalWrite(RL_PIN, HIGH);
      analogWrite(LH_PIN, setpoint);
    } else {
      digitalWrite(LL_PIN, HIGH);
      analogWrite(RH_PIN, setpoint);
    }
  }
  delay(50);
}

Arduino 输入与处理

采用单个电位器控制H桥。通过analogRead()函数读取数值。调整后的设定值使中间位置(十进制512)对应电机关闭。从中点顺时针旋转可线性增加电机正转速度。从中点逆时针旋转则提升设备反转速度。缩放比例设定如下:

  • 512至1023对应0到250,方向布尔量设为顺时针
  • 511至0对应0到250,方向布尔量设为逆时针(CCW)
    其中250由MAX_PWM_VAL决定。

如视频1所示,可用信号发生器替代电位器。此处Digilent Analog Discovery 3设备生成缓慢变化的三角波,用于控制Pololu直流电机的速度和转向。

技术提示 :Arduino的analogRead()函数返回0到1023之间的值,而analogWrite()输出范围为0到255。常用编程技巧是通过右移运算符实现除以4运算,例如drive = setpoint >> 2;。程序中采用除以2运算,因为将512声明为零点已相当于将输入值减半。

使用防护机制检测输入值是否变化。若设定值改变,新数值将发送至控制引脚。

视频 1 :H桥电路对Digilent Analog Discovery所提供三角波信号的响应演示。

Arduino 输出

H桥使用四条控制线,包含每个桥臂的高边和低边驱动电路。代码通过方位(左/右)和层级(高/低)描述这些引脚。例如左侧高边驱动(IR2110芯片10号引脚)由这行代码定义。

#define LH_PIN 6  // fast PWM

注意代码实现了专用于Arduino Nano Every的高速PWM模式,详见本文说明。其采用32kHz频率替代960Hz PWM。这将电机嗡鸣声移至可听范围外,并可能提升系统效率。

Arduino通过先关闭所有H桥驱动器来准备发送新指令。此举可防止MOSFET出现意外直通。下一步是开启相应的MOSFET对,例如Q1/Q4和Q2/Q3。低边MOSFET保持常开状态,同时高边MOSFET接收来自设定值的PWM信号。

技术提示 :当占空比设为100%时,自举电容会逐渐放电。这种情况极其不利,因为高边MOSFET电阻增大将导致过热甚至损毁。因此典型控制算法会先激活低边MOSFET(如Q4),再对对应高边MOSFET(如Q1)进行PWM调制。该技术确保自举电容保持充电状态——前提是高边MOSFET占空比限制在约95%以内。在32kHz PWM的H桥电路中,MUR120G等超快恢复二极管是充电自举电容的关键元件,因其能在短暂窗口期内完成电容充电。

下一步

主要目标是学习电子技术知识。下一步是强化设计方案。潜在改进方向包括:

  • 设计一款定制PCB,重点采用最新(最小尺寸)表面贴装MOSFET及先进驱动电路。例如,可考虑使用Nexperia PXN012-100QSJ MOSFET,搭配Allegro A89506KLPTR全桥驱动器的所有先进特性。作为参考,国际整流器公司的IR2110已有约30年历史,至今仍广受欢迎。我还记得在纸质版应用笔记中读到过它的介绍。

  • 需包含过流检测与硬件关断功能。简单方案可添加保险丝,复杂方案则可集成电机电流监测与快速关断能力。这样驱动器就能在电机端子发生短路(如驱动电缆线间故障)时存活。

  • 安全集成市电供电电源。本文介绍的技术普遍适用于开关模式电源。需充分考虑安全因素。务必寻找导师指导电路设计与安全挑战。遵守所有地方、州和联邦法规。

  • 集成编码器反馈以感知和控制转速。例如本文所述的PID控制。

  • 实现方向、速度与转矩的完整四象限控制。

  • 软件遥测功能监测电流、电压、温度及故障。

  • 拓展至三相无刷直流电机,涵盖从小型遥控型号到基于IGBT的百马力变频驱动器(VFD)。

另一方面,也可选择DigiKey提供的15000种商用现成电机驱动器,它们集成部分或全部先进功能。将电机与控制器整合到设计中有大量学习机会。

各得其所。

最后的思考

世界需要懂电力转换技术的工程师。虽然本专题设计相对简单,但为复杂大功率驱动奠定了基础。半导体设计与软件控制相结合的多学科课题,构成了商业和工业电力系统的基础。计算机中的开关电源与最大规模的电网级电池储能系统(BESs)有许多共通点。

请在下面的空白处留下您的意见和问题。

相关信息

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

感谢 Lashley_Wang 分享这么清晰的 Arduino 纯正弦波逆变器方案!
之前自己尝试用方波逆变器驱动小电机时,确实遇到了电机嗡嗡响、发热的问题,
看了文章才更理解‘纯正弦波对敏感设备的必要性’—— 尤其是您提到‘先用电机构建电路调试,
再装变压器’的安全技巧,特别实用(之前踩过直接接变压器调试的坑,差点烧了 MOSFET)。
另外,图 4 里的交越失真我在自己的 H 桥电路里也遇到过,后来加了简单的 RC 滤波后略有改善,
不知道您后续有没有测试过不同滤波参数对波形的影响