预览:
-
通过自制面包板驱动器,使用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或电脑——这就是电力电子实验的特性。
相关信息
请点击以下链接获取相关和有用的信息: