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)有许多共通点。
请在下面的空白处留下您的意见和问题。
相关信息
请点击以下链接获取相关和有用的信息:


