ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

带HALL传感器的BLDC电机控制:霍尔原理、六步换相与实战代码

带HALL传感器的BLDC电机控制:霍尔原理、六步换相与实战代码 做电机控制这些年带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没做电平转换霍尔供电电压是5VMCU是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°电角度正好追上转子位置。这里的关键是通电顺序必须和转子旋转方向、霍尔状态顺序一致。如果顺序反了电机会反转如果顺序和霍尔编码不匹配电机就会卡顿甚至堵转。以AB-为例开关管状态是上桥A导通、下桥B导通其余管子全部关断。电流路径是母线正极→A相上桥MOS→A相绕组→B相绕组→B相下桥MOS→母线负极。这时候电动势方向和电流方向关联很强控制得好扭矩输出最平顺。3.2 换相表怎么来换相表是所有BLDC控制程序里最核心的一张表。网上能下到很多现成模板但我的经验是直接抄十有八九不灵因为霍尔编码顺序和电机相序、旋转方向密切相关不同厂家的电机定义都可能不一样。正确做法是自己测一遍。测换相表的流程很简单但非常实用确认霍尔信号上拉和电平没问题把HA、HB、HC接到逻辑分析仪或示波器上。手动慢速旋转电机轴记录一圈内霍尔状态变化的完整编码序列。确定你期望的旋转方向比如顺时针然后根据编码序列推导出每个状态对应的转子位置。在一个固定编码状态下手动给驱动板发一组六个开关管的导通命令观察转子受力的方向找到能让转子沿期望方向受力的那一组。将6个霍尔状态映射到6个导通状态填进换相表。实际调试中这个方法虽然慢但一次测完就心中有数。如果嫌手动测麻烦还有一个折中方案先用一个不装负载的电机小电流限流跑一下如果换相表某一步错电机会在这个状态附近抖动或发闷通过观察卡顿位置可以反向推断错误项。不过新手还是建议手动测风险小。常用的换相表数据结构就是8选1的数组代码里用霍尔编码做索引。这里给一个示意注意具体导通相要根据你的电机相序确认// 假设霍尔编码bit0HA, bit1HB, bit2HC // 下表内容仅为示例请根据自己的电机实测结果修正 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最常用下桥一直开通电流路径固定地线电流连续方便做低侧采样电阻的电流检测。上桥常通、下桥PWMH_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 霍尔信号抖动电机嗡嗡叫的元凶之一霍尔信号在临界位置出现抖动很常见尤其是电机存在振动、线圈通断产生共模干扰、或者霍尔接近磁翻转点时。表现为换相状态在两个相邻编码之间快速来回跳电机发出高频“滋滋”或“嗡嗡”声电流波形杂乱转速不稳。排查思路从简单到复杂走一遍先看硬件滤波霍尔输出脚有没有RC滤波没有就先加用示波器看霍尔信号观察抖动发生在固定的机械位置上还是随机出现。固定位置抖动通常是霍尔芯片磁滞不够大或者霍尔安装位置刚好落在磁极边界上随机抖动多半是电气噪声耦合。软件上做边沿去抖检测到霍尔变化后延时几十微秒再确认或者要求新状态保持一段稳定时间才执行换相。检查霍尔信号是否与PWM频率产生差拍干扰适当调整PWM频率或采样时刻。我实际调过一个项目电机在某个特定转速下啸叫很严重后来发现是PWM频率和霍尔信号频率成整数倍关系加上PCB布局不合理噪声在固定相位被放大。改高PWM频率到25kHz并加了RC滤波后问题就消失了。这类问题做产品时必须重视否则量产时每一台的“临界转速”不同排查起来非常痛苦。5.2 堵转、过流和温度保护带霍尔方案启动容易但堵转问题一样危险。电机被卡住时转子不转霍尔状态不再变化但PWM仍然按原状态给两相通电。绕组是电感加电阻持续通直流电的结果就是电流一路飙升直到MOS炸掉或绕组烧断。所以启动和运行都必须加保护逻辑。最简单有效的是相电流检测在低侧MOS下端串联一个采样电阻用比较器或ADC实时监测。一旦电流超过阈值立即关闭所有PWM并进入故障锁定状态需要人工复位或延时自动恢复。另外可以写一个堵转检测在运行状态下记录最后一次霍尔状态变化的时间如果在设定时间内没有新的跳变而PWM占空比又大于某个值就判定为堵转执行关断。时间阈值一般根据最低允许转速换算比如允许最低转速600RPM四极电机那么每秒至少有1000次状态变化检测窗口设在5到10毫秒比较安全。还有一点很容易被忽略如果电机在运行中突然断电再上电转子可能停在一个任意位置霍尔状态是有效的上电直接换相没问题但如果再次上电之前电机还在靠惯性转霍尔读取到当前状态后直接按下表换相有可能会逆着旋转方向制动产生很大电流冲击。对惯性旋转的场合上电后应该先等待转子稳定或进行软关断再进入正常启动流程。5.3 有感和无感方案怎么选不要被“省元件”冲昏头脑聊到这儿很多读者可能会想“既然有传感器这么方便为什么无感方案还这么火”答案分几层看。无感方案省掉了霍尔传感器和对应线束电机结构更紧凑还能避免霍尔在高温环境下的退磁或失效问题成本上确实有优势。它的核心是反电动势过零点检测当转子旋转时未通电那一相绕组的反电动势会随转子位置变化找到过零点的时刻就能推算出换相点。但这个方法在静止和低速时基本失效因为反电动势太小所以无感启动必须用“开环强拖—反电动势检测—闭环切换”这种序列逻辑复杂度和调试难度都比有感高不少。反过来有感方案的“传感器故障”也是一个真实风险。接插件松动、霍尔芯片损坏、信号线受干扰都会导致控制失败。如果有安全认证需求还要考虑传感器单点失效的问题。所以有些对可靠性要求苛刻的场合反而会选择双通道霍尔或“有感无感模式切换”的混合方案启动用霍尔运行中间歇校验反电动势传感器坏了自动切到无感。我的经验和建议是产品迭代早期先用带霍尔方案把电机参数、相序、负载特性摸清楚这样可以快速验证机械结构和控制策略等产品稳定、需要降本或缩体积时再评估切无感。切的时候也不要一步到位可以先在同一个硬件平台上保留霍尔写一套无感启动算法用霍尔信号做参考对比无感检测到的过零点和霍尔边沿是否一致逐步减小对霍尔的依赖。结尾再分享一个实用习惯最后说一个我自己一直保留的习惯每拿到一台新电机不管资料上写得多清楚我都会花十分钟做一次霍尔编码顺序和换相关系的实测。做法很简单——电机不通电用示波器或逻辑分析仪挂住三个霍尔手动缓慢转一圈记录完整的编码顺序然后通过小电流限流的定向通电测试确定每个编码对应的转子受力方向。这一步做完后面所有调试都顺了。你可以把这个记录写成一个结构体存下来作为这款电机的“驱动参数档案”以后代码里直接加载不用每次重新硬调。实践证明这个档案在项目交接和批量生产中价值极大因为它把隐性的调试经验变成显性的可复用数据了。希望这篇能帮你少走几条弯路下篇我打算继续写霍尔BLDC的换相瞬态电流抑制和速度环调参到时候再见。
返回列表