☰
带HALL传感器的BLDC电机控制:霍尔原理、六步换相与实战代码
2026/10/7 1:34:21 网站建设 项目流程

做电机控制这些年,带HALL传感器的三相直流无刷电机BLDC控制,算是我见过被低估得最厉害的一个方向。很多新手拿到电机和驱动板,第一反应是“插电就转”,结果霍尔信号没对齐、换相表配错、PWM电流过大烧管子,一连串问题背后其实都指向同一个核心:你还没建立起“转子位置决定通电方式”这个闭环思维。这篇文章作为系列第一篇,只讲带HALL传感器的有感BLDC控制,从霍尔原理、相位偏置角度、六步换相逻辑,到换相表、PWM调制、续流处理,再到一份可以直接折腾的C语言状态机代码,一次讲透。

内容适合正在入门电机控制的学生和嵌入式工程师,也适合想拿有感方案快速做产品原型的应用开发人员。看完之后,你至少能手写一个稳定转起来的霍尔BLDC开环控制程序,并且知道为什么某些电机“发闷”、为什么霍尔信号会抖动、为什么堵转必须保护,这些底层的“为什么”搞明白了,后面再切FOC或者无感方案都会轻松很多。

1. 先搞清楚:无刷电机为什么必须“换相”

1.1 三相绕组和转子的基本结构

BLDC的结构比有刷电机简单,但正因为简单,很多人反而忽略了它的核心矛盾。定子是三相绕组,最常见的是星形连接,三根相线引出来接到驱动板上;转子是永磁体,通常是表贴式结构,磁极按N、S交替排列。电机本身没有碳刷和换向器,所以绕组里的电流方向必须由外部电路来切换,这就是“电子换向”的由来。

驱动板上的核心是一组三相全桥逆变器,一共6个MOSFET,分成三个半桥。上桥和下桥分别控制每相接到母线正极还是负极,这是电机旋转的基础。注意,绝不能出现同一个半桥上下两个管子同时导通,否则母线直接短路,这属于炸管头号原因,后面调试部分我会再提。

有刷电机靠机械换向器,天生就是“自换向”的;无刷电机从原理上讲正常旋转的前提,是三相绕组的通电顺序必须始终跟随转子位置。这也是无感和有感方案最本质的区别:有感方案用霍尔传感器直接测转子位置,无感方案靠反电动势间接估算位置,但最终目的都一样——在正确的时刻把正确的相接通。

1.2 换相的本质是制造旋转磁场

换相到底在换什么?你可以把定子绕组通电视为在定子内腔产生一个合成磁场矢量,转子永磁体就是一块磁铁,它会努力转向外磁场的方向。如果我们想让转子一直朝同一个方向转,就不能让磁场矢量固定不动,而是要让它先于转子位置“跑”起来,像一个在前面领跑的人,磁铁在后面一直追。

三相BLDC最常见的通电方式是“六步换相”,也叫梯形控制。六步之间每步间隔60°电角度,每一步只让两相导通,第三相完全不通电。六个状态循环一次,合成磁场矢量就旋转了360°电角度,转子也跟着转一圈电角度。如果电机有P对极,那么转子机械上转一圈,电角度要走360°×P,也就是要执行6×P次换相。

这里需要强调一个初学者最容易搞错的概念:电角度和机械角度不是一回事。一个4对极电机,电角度是机械角度的4倍,霍尔传感器的120°分布通常指的是电角度,按机械角度安装时就得除以极对数。很多“转起来不对”的故障,最后排查下来就是这里算错了。

1.3 有传感器方案与无感方案的定位差异

经常有人问:既然无感方案可以省掉霍尔,为什么还要用有感的?答案在启动和低速场景。无感方案依赖反电动势过零点检测,而反电动势大小正比于转子转速,静止或低速时反电动势几乎为零,你根本没有可靠的“参考物”来获取转子位置。所以无感方案在启动阶段通常要用开环强拖,先给一组固定频率和幅值的脉冲把转子“拽”到能产生明显反电动势的速度,再切回闭环检测。这个过程在带载或重载场合非常容易失败,表现为启动顿挫、抖动甚至反转。

有感方案就不一样。霍尔传感器从上电那一刻起就能告诉你转子在哪个扇区,直接按当前位置换相,电机就能转起来,启动转矩大,控制逻辑也简单直接。电动工具、水泵、风机、助力车、工业风扇这类需要带载启动或低速大扭矩的设备,很多都优先考虑带霍尔方案。

所以我的建议是:不要神话无感,也不要觉得有感落后。快速做原型、追求稳定可靠、控制板空间允许装霍尔,选有感;如果电机内部空间极窄、环境温度很高、或者成本敏感到装霍尔都心疼,再上无感。两种方案的基本功都建立在六步换相逻辑上,把有感的霍尔换相吃透,无感的启动和切换算法你也能更快上手。

2. 霍尔传感器:用三个开关信号锁定转子位置

2.1 霍尔元件到底在测什么

需要先明确一个容易误解的点:霍尔元件不是角度传感器,它输出的是数字电平。开关型霍尔芯片内部有比较器和磁滞电路,当转子磁极的磁场极性翻转时,输出端会在高电平和低电平之间跳变,边沿对应的就是磁场过零的位置。这个信号本身只告诉你“转子磁极当前在我这边还是那边”,三个霍尔放在不同位置,组合起来才能判断转子大致处于哪个60°扇区。

三个霍尔一般命名为HA、HB、HC,输出编码只有6个有效状态,另外两个(000和111)在理想情况下不会出现。硬件上,很多霍尔传感器是开漏输出,必须加上拉电阻,否则电平逻辑不稳定。常见接法是3.3k到10k上拉到3.3V或5V,具体看MCU的电平范围。霍尔信号线最好用双绞线或屏蔽线,并且和功率线保持距离,不然MOSFET开关产生的di/dt噪声很容易耦合进霍尔信号。

我在实际项目里踩过一次很典型的坑:霍尔输出直接连到STM32的GPIO,没做电平转换,霍尔供电电压是5V,MCU是3.3V,运行几分钟后GPIO烧了。带霍尔的电路设计一定要先确认逻辑电平兼容,必要时加电阻分压或电平转换芯片,别偷懒。

2.2 120度与60度安装方式

霍尔安装方式常见两种:120°电角度间隔和60°电角度间隔。120°安装时,三个霍尔在定子圆周上互差120°电角度;60°安装则互差60°电角度。实际效果上,两者都能把一圈分成6个扇区,且每个扇区还是60°电角度,区别主要在于霍尔状态编码的序列顺序不同,以及安装机械结构上的差异。

从控制逻辑上看,你其实不需要纠结120°还是60°,因为最终都要通过实验确定换相表。但注意一点:霍尔安装时是有方向的,传感器的“感应面”必须面向转子磁钢,而且芯片丝印或引脚方向不同,输出极性也可能相反。更换霍尔型号后,原来正常的换相表可能整张反转,就是因为霍尔输出极性变了。

给个对比表格方便你记忆:

项目120°安装60°安装
霍尔间隔(电角度)120°60°
编码序列变化间隔60°60°
有效状态数66
状态顺序一种循环与120°相反或不同
控制逻辑差异换相表不同换相表不同

2.3 相位偏置角度:对齐问题必须认真对待

“相位偏置角度”这个热搜词背后,其实就是霍尔信号和反电动势之间的相位对齐问题。理想的霍尔边沿应该对应某相反电动势的过零点,这样换相时刻正好落在最佳位置。但由于霍尔安装位置、磁钢形状、极对数换算、PCB焊接偏差等因素,实际霍尔边沿和反电动势过零点之间往往存在一个固定偏差,这个偏差就是相位偏置角度。

为什么这么重要?因为六步换相的“最佳换相点”不在反电动势过零点,而是在过零点之后再延迟30°电角度的位置。也就是说,如果霍尔边沿恰好对齐反电动势过零点,那么在霍尔边沿触发的换相就已经是理想换相点了。但如果霍尔边沿和过零点有偏差,比如差了20°电角度,那实际换相点就会偏离最佳点,轻则电流波形畸变、电机“发闷”、效率下降,重则产生明显的扭矩波动,甚至导致启动失败。

我们在做工程时通常用两种手段处理相位偏置角度:第一种是硬件上调整霍尔PCB的安装角度,尽量让边沿对齐反电动势过零点,这是治本的办法,但受结构和工艺限制;第二种是在软件里添加角度补偿,通过延时或者换相表中的偏置项来修正,适合批量一致性较好但总有固定偏差的电机组合。

还有一个比较隐蔽的问题:如果电机是多极对结构,霍尔位置的机械偏差会被极对数放大。比如一个7对极电机,霍尔在机械上偏了1°,电角度就偏了7°,这个误差已经足以明显影响换相效果。所以拿到新电机,第一位的工作不是急着写PID,而是用示波器同时抓霍尔信号和反电动势,先看清楚相位关系。这个方法我后面还会详细讲。

3. 六步换相与PWM调制

3.1 六步换相逻辑

六步换相的具体通电顺序可以这样理解:假设三相命名为A、B、C,一个常见的循环是AB导相通电,然后AC,再BC,再BA,再CA,再CB,最后回到AB。每一步里的两个字母,第一个表示该相电流流入(接母线正极),第二个表示该相电流流出(接母线负极),第三相悬空。

为什么是这种顺序?因为每切换一步,绕组的合成磁场矢量就往前走60°电角度,正好追上转子位置。这里的关键是通电顺序必须和转子旋转方向、霍尔状态顺序一致。如果顺序反了,电机会反转;如果顺序和霍尔编码不匹配,电机就会卡顿甚至堵转。

以A+B-为例,开关管状态是上桥A导通、下桥B导通,其余管子全部关断。电流路径是:母线正极→A相上桥MOS→A相绕组→B相绕组→B相下桥MOS→母线负极。这时候电动势方向和电流方向关联很强,控制得好,扭矩输出最平顺。

3.2 换相表怎么来

换相表是所有BLDC控制程序里最核心的一张表。网上能下到很多现成模板,但我的经验是:直接抄十有八九不灵,因为霍尔编码顺序和电机相序、旋转方向密切相关,不同厂家的电机定义都可能不一样。正确做法是自己测一遍。

测换相表的流程很简单,但非常实用:

  1. 确认霍尔信号上拉和电平没问题,把HA、HB、HC接到逻辑分析仪或示波器上。
  2. 手动慢速旋转电机轴,记录一圈内霍尔状态变化的完整编码序列。
  3. 确定你期望的旋转方向(比如顺时针),然后根据编码序列推导出每个状态对应的转子位置。
  4. 在一个固定编码状态下,手动给驱动板发一组六个开关管的导通命令,观察转子受力的方向,找到能让转子沿期望方向受力的那一组。
  5. 将6个霍尔状态映射到6个导通状态,填进换相表。

实际调试中,这个方法虽然慢,但一次测完就心中有数。如果嫌手动测麻烦,还有一个折中方案:先用一个不装负载的电机,小电流限流跑一下,如果换相表某一步错,电机会在这个状态附近抖动或发闷,通过观察卡顿位置可以反向推断错误项。不过新手还是建议手动测,风险小。

常用的换相表数据结构就是8选1的数组,代码里用霍尔编码做索引。这里给一个示意,注意具体导通相要根据你的电机相序确认:

// 假设霍尔编码:bit0=HA, bit1=HB, bit2=HC // 下表内容仅为示例,请根据自己的电机实测结果修正 uint8_t comm_table[8] = { 0b000000, // 0b000 非法状态 0b100001, // 0b001 -> AB导通:A上桥开,B下桥开 0b001001, // 0b010 -> AC导通:A下桥开,C上桥开 0b001100, // 0b011 -> BC导通:B上桥开,C下桥开 0b010010, // 0b100 -> BA导通:B下桥开,A上桥开 0b100100, // 0b101 -> CA导通:C下桥开,A上桥开 0b010100, // 0b110 -> CB导通:C上桥开,B下桥开 0b000000 // 0b111 非法状态 };

这里每一位对应一个开关管,哪个位控制哪个管,取决于你的驱动板设计,实际项目中要经过仔细对应。

3.3 PWM调制与续流

换相只决定“哪两相导通”,PWM调制才决定电流大小。最简单的调制方式是不加PWM,六个管子全开或者全关,但这会带来两个问题:一是无法调速,二是全开瞬间电流不受控,很容易把电机和MOS管烧掉。所以我们通常在其中一个管子或两个管子上加PWM信号。

常见的调制策略有几种:

  • 上桥PWM、下桥常通(H_PWM-L_ON):最常用,下桥一直开通,电流路径固定,地线电流连续,方便做低侧采样电阻的电流检测。
  • 上桥常通、下桥PWM(H_ON-L_PWM):少部分应用使用,适合对共模噪声有特殊要求的场合,但稍麻烦。
  • 互补PWM(同步整流):上桥和下桥互为反相,关断期间电流从对面的MOS沟道续流,而不是从体二极管续流,可以降低损耗,但必须加死区时间防止上下桥直通。

这里就要讲清楚“续流”是什么。电机绕组是感性负载,在PWM关断的瞬间,绕组的电流不能突变,只能沿着原来方向继续流动。如果没有导通路径,相电压会瞬间飙升击穿MOS。所以必须提供一个续流回路,最基础的就是MOS管内部的反并联二极管。续流阶段,悬空相电压会受到续流状态的影响,波形会发生畸变。

对带霍尔方案来说,续流的影响主要体现在换相瞬间的扭矩波动、电磁噪声和母线电压尖峰,不会像无感方案那样直接干扰反电动势过零点检测,因为位置信息来自霍尔而不是电压波形。但这不代表可以不管,如果续流时间过长或PWM频率过低,电流纹波大,电机会明显啸叫,严重的时候会导致过流误触发。

我的工程建议是:第一版先跑H_PWM-L_ON,加一组RC吸收电路在母线或相线上,然后再考虑要不要上同步整流。把基础逻辑跑通了再看效率和噪声细节,不要一开始就扎进高级调制策略里。

4. 从原理到代码:一个能跑的换相示例

4.1 硬件接线准备

写代码之前,先确认接线。霍尔信号通常是三根线加电源和地,我建议每一路霍尔信号都加一个RC低通滤波,典型参数是10k电阻和100nF电容,截止频率大概160Hz,这个值比较保守,能滤掉大部分毛刺,对换相频率来说一般够用。如果电机转速非常高,可以适当提高截止频率,但不要为了追求极速响应把滤波去掉。

霍尔和MCU之间,前面说过要注意电平匹配。霍尔供电如果和MCU电压不同,上拉电阻应该接到霍尔供电端还是MCU供电端,要看芯片的绝对最大额定值。最简单可靠的方式是霍尔和MCU共用同一组电源轨,电压一致,电阻上拉到这个电源轨。

驱动板的功率地和控制地建议单点连接,霍尔信号尽量远离三相输出线。如果用了长线,建议在霍尔输入端串联一个几十欧姆的电阻,配合滤波电容形成低通网络,能显著降低高频干扰。

4.2 换相状态机的实现

核心代码可以很精简,我一般用一个枚举表示当前导通相,用一个数组做换相表,在霍尔边沿中断里完成换相。下面这个例子是典型的定时器轮询版本,适合理解逻辑;实际产品中建议改成外部中断或定时器捕获边沿。

typedef enum { PHASE_OFF = 0, PHASE_AB, // A上,B下 PHASE_AC, // A下,C上 PHASE_BC, // B上,C下 PHASE_BA, // B下,A上 PHASE_CA, // C下,A上 PHASE_CB // C上,B下 } Phase; static const Phase hall_to_phase[8] = { PHASE_OFF, // 0b000 PHASE_AB, // 0b001 PHASE_AC, // 0b010 PHASE_BC, // 0b011 PHASE_BA, // 0b100 PHASE_CA, // 0b101 PHASE_CB, // 0b110 PHASE_OFF // 0b111 }; uint8_t read_hall(void) { uint8_t h = 0; if (HALL_A_GPIO == 1) h |= 0x01; if (HALL_B_GPIO == 1) h |= 0x02; if (HALL_C_GPIO == 1) h |= 0x04; return h; } void set_phase(Phase p) { // 先全部关闭,再按枚举打开对应开关管 ALL_MOS_OFF(); switch (p) { case PHASE_AB: MOS_AH_ON(); MOS_BL_ON(); break; case PHASE_AC: MOS_AL_ON(); MOS_CH_ON(); break; // 其余状态类似,此处省略 default: break; } } // 在控制周期里调用,比如10kHz void bldc_tick(void) { uint8_t hall = read_hall(); Phase p = hall_to_phase[hall & 0x07]; if (p != PHASE_OFF) { set_phase(p); } }

这段代码最核心的只有两步:读霍尔编码,然后查表去控制开关管。但实际项目里不能这么裸奔,因为:

  • 什么时候换相?霍尔状态变化就应该立即换相,否则电流方向会在一段时间内和转子位置不匹配。用轮询方式的话,控制频率至少要高于换相频率的10倍,否则高性能应用会明显掉扭矩。
  • 换相瞬间要不要处理?如果直接强制关断旧相、打开新相,相电流在换相时刻会产生一个突变,导致扭矩脉动和噪声。高级一点的做法是做“换相重叠”或电流补偿,不过那是后续话题。

4.3 启动、调速和转速计算

有感的启动比无感简单太多。上电后直接读霍尔,当前处于哪个扇区就按哪个扇区换相,然后给一个小占空比的PWM,电机就会朝指定方向转动。但注意启动占空比别给太大。静止时没有反电动势,绕组阻抗只有导线电阻和电感阻抗,母线电压几乎全部加在绕组上,电流上升非常快。我推荐先把PWM占空比限制在10%以内,等电机转起来后再慢慢加到目标值。

调速对开环控制来说就是调PWM占空比。占空比越高,平均电压越高,稳态转速越快,但转速会随负载变化明显。如果要求稳速,就需要速度闭环,利用霍尔信号的频率算转速,再加PID。

霍尔转速换算其实很简单:每次霍尔状态变化都代表60°电角度,转子机械旋转一圈需要经历6×P次状态变化,P是极对数。所以:

转速RPM = 60 × f_comm / (6 × P) = 10 × f_comm / P

其中f_comm是每秒换相次数,也就是霍尔状态变化频率。如果用一个50ms的定时器统计霍尔跳变次数count,则:

RPM = 10 × (count / 0.05) / P = 200 × count / P

这里算出的是瞬时平均速度,适合做速度环反馈。如果希望更平滑,可以对多次计算结果做滑动平均。

5. 实际调试中的常见问题与排查技巧

5.1 霍尔信号抖动:电机嗡嗡叫的元凶之一

霍尔信号在临界位置出现抖动很常见,尤其是电机存在振动、线圈通断产生共模干扰、或者霍尔接近磁翻转点时。表现为:换相状态在两个相邻编码之间快速来回跳,电机发出高频“滋滋”或“嗡嗡”声,电流波形杂乱,转速不稳。

排查思路从简单到复杂走一遍:

  1. 先看硬件滤波,霍尔输出脚有没有RC滤波,没有就先加;
  2. 用示波器看霍尔信号,观察抖动发生在固定的机械位置上还是随机出现。固定位置抖动,通常是霍尔芯片磁滞不够大,或者霍尔安装位置刚好落在磁极边界上;随机抖动,多半是电气噪声耦合。
  3. 软件上做边沿去抖,检测到霍尔变化后延时几十微秒再确认,或者要求新状态保持一段稳定时间才执行换相。
  4. 检查霍尔信号是否与PWM频率产生差拍干扰,适当调整PWM频率或采样时刻。

我实际调过一个项目,电机在某个特定转速下啸叫很严重,后来发现是PWM频率和霍尔信号频率成整数倍关系,加上PCB布局不合理,噪声在固定相位被放大。改高PWM频率到25kHz并加了RC滤波后,问题就消失了。这类问题做产品时必须重视,否则量产时每一台的“临界转速”不同,排查起来非常痛苦。

5.2 堵转、过流和温度保护

带霍尔方案启动容易,但堵转问题一样危险。电机被卡住时,转子不转,霍尔状态不再变化,但PWM仍然按原状态给两相通电。绕组是电感加电阻,持续通直流电的结果就是电流一路飙升,直到MOS炸掉或绕组烧断。

所以启动和运行都必须加保护逻辑。最简单有效的是相电流检测:在低侧MOS下端串联一个采样电阻,用比较器或ADC实时监测。一旦电流超过阈值,立即关闭所有PWM,并进入故障锁定状态,需要人工复位或延时自动恢复。

另外可以写一个堵转检测:在运行状态下,记录最后一次霍尔状态变化的时间,如果在设定时间内没有新的跳变,而PWM占空比又大于某个值,就判定为堵转,执行关断。时间阈值一般根据最低允许转速换算,比如允许最低转速600RPM,四极电机,那么每秒至少有1000次状态变化,检测窗口设在5到10毫秒比较安全。

还有一点很容易被忽略:如果电机在运行中突然断电再上电,转子可能停在一个任意位置,霍尔状态是有效的,上电直接换相没问题;但如果再次上电之前电机还在靠惯性转,霍尔读取到当前状态后直接按下表换相,有可能会逆着旋转方向制动,产生很大电流冲击。对惯性旋转的场合,上电后应该先等待转子稳定或进行软关断,再进入正常启动流程。

5.3 有感和无感方案怎么选:不要被“省元件”冲昏头脑

聊到这儿,很多读者可能会想:“既然有传感器这么方便,为什么无感方案还这么火?”答案分几层看。无感方案省掉了霍尔传感器和对应线束,电机结构更紧凑,还能避免霍尔在高温环境下的退磁或失效问题,成本上确实有优势。它的核心是反电动势过零点检测:当转子旋转时,未通电那一相绕组的反电动势会随转子位置变化,找到过零点的时刻就能推算出换相点。但这个方法在静止和低速时基本失效,因为反电动势太小,所以无感启动必须用“开环强拖—反电动势检测—闭环切换”这种序列,逻辑复杂度和调试难度都比有感高不少。

反过来,有感方案的“传感器故障”也是一个真实风险。接插件松动、霍尔芯片损坏、信号线受干扰,都会导致控制失败。如果有安全认证需求,还要考虑传感器单点失效的问题。所以有些对可靠性要求苛刻的场合,反而会选择双通道霍尔或“有感+无感模式切换”的混合方案,启动用霍尔,运行中间歇校验反电动势,传感器坏了自动切到无感。

我的经验和建议是:产品迭代早期,先用带霍尔方案把电机参数、相序、负载特性摸清楚,这样可以快速验证机械结构和控制策略;等产品稳定、需要降本或缩体积时再评估切无感。切的时候也不要一步到位,可以先在同一个硬件平台上保留霍尔,写一套无感启动算法,用霍尔信号做参考,对比无感检测到的过零点和霍尔边沿是否一致,逐步减小对霍尔的依赖。

结尾再分享一个实用习惯

最后说一个我自己一直保留的习惯:每拿到一台新电机,不管资料上写得多清楚,我都会花十分钟做一次霍尔编码顺序和换相关系的实测。做法很简单——电机不通电,用示波器或逻辑分析仪挂住三个霍尔,手动缓慢转一圈,记录完整的编码顺序;然后通过小电流限流的定向通电测试,确定每个编码对应的转子受力方向。

这一步做完,后面所有调试都顺了。你可以把这个记录写成一个结构体存下来,作为这款电机的“驱动参数档案”,以后代码里直接加载,不用每次重新硬调。实践证明,这个档案在项目交接和批量生产中价值极大,因为它把隐性的调试经验变成显性的可复用数据了。希望这篇能帮你少走几条弯路,下篇我打算继续写霍尔BLDC的换相瞬态电流抑制和速度环调参,到时候再见。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询