不少刚接触 BLDC 的朋友都有个执念:想让它转得准,就得老老实实装编码器。这个思路本身没错,但在很多实际产品里,编码器反而成了麻烦的来源——成本翻倍、线束变多、震动工况下还容易坏。而反电动势定位这条不用编码器的路,被无人机电调、电动工具、水泵风机这些行业反复验证过,稳定性和成本优势都非常明显。这篇文章我就用自己的实战经验,把 BLDC 反电动势定位的原理、启动、电路和调试完整梳理一遍,手把手带你把这个“免费传感器”用明白。
1. 方案选型:为什么不用编码器也能定位转子
1.1 编码器方案与反电动势方案的真实取舍
先说说我在实际项目中体会到的差别。编码器方案的好处是位置信息绝对准确,从 0 转开始就能知道转子在哪,控制上非常省心,启动大负载也不慌。但代价也很具体:一个 100 线的磁编码器或光电编码器,采购成本从几块钱到几十块钱不等,还要占用 MCU 的定时器接口或 SPI 接口,PCB 上要多留一块安装位置,结构上还得考虑同心度和防尘防振。
反电动势方案则完全不同。它不需要额外传感器,只需要利用电机三相绕组的电压信号,就能算出转子大概在什么位置。成本上几乎为零,硬件上只需要几个电阻和一个比较器(或者直接用 MCU 的 ADC),可靠性也高,因为没有额外活动部件。代价是零速和低速时反电动势信号太小,几乎无法检测,必须用另外的办法启动,而且负载突变时容易失步。
所以我的判断是:如果你的产品是风扇、水泵、小型无人机、电动工具这类对启动扭矩要求不是极端苛刻、工作转速范围中高速为主的应用,反电动势方案是性价比极高的选择。如果是伺服电机、机器人关节、车规级转向系统这类需要零速大扭矩和闭环位置控制的场景,老老实实装编码器才是正解。
1.2 反电动势“定位”到底在定什么位
很多人一听“反电动势定位”就以为是用算法测出转子的绝对角度,其实这里要分清楚。BLDC 控制里说的“定位”通常指两件完全不同的事。
第一件事是启动前的“预定位”,也就是在电机静止状态下,给某相通电一小段时间,让转子转到已知位置。这是无感方案启动必须做的一步,因为零速反电动势为零,你根本不知道转子朝哪。第二件事是运行过程中的“位置观测”,利用反电动势过零点推算出转子磁极换向时刻,从而维持同步运转。严格说,反电动势法给出的不是连续角度,而是 6 个离散的换向点,对 BLDC 方波控制来说这已经足够用了。
| 对比项 | 编码器方案 | 反电动势方案 |
|---|---|---|
| 成本 | 高,传感器+接口电路 | 极低,几个电阻加比较器 |
| 可靠性 | 受安装、振动、污染影响 | 无额外传感器,故障点少 |
| 低速性能 | 0速可定位、可大扭矩 | 零速/低速失效 |
| 控制精度 | 连续位置,可精确换相 | 离散6步换向,足够方波控制 |
| 适用场景 | 伺服、机器人、车规 | 风扇、水泵、无人机、电动工具 |
2. 反电动势过零检测的核心原理与实现方式
2.1 三相绕组里藏着的“免费位置传感器”
理解反电动势定位,先要明白一个最基本的物理事实:BLDC 转动的时候,每相绕组在磁场中运动,会产生一个与转速成正比的电压,这就是反电动势(Back-EMF,简称 BEMF)。转子转得越快,BEMF 幅值越大;转子位置不同,三相 BEMF 的相位也就不同。
如果我们把三相绕组的 BEMF 波形画出来,会发现它近似是梯形波,三相互差 120 度。在 Y 形连接的三相电机里,每相 BEMF 都会在某个时刻穿过零电压点,这个时刻恰好对应转子磁极经过该相绕组几何中性面的位置。而我需要做的,就是把这个“过零时刻”捕捉到,然后往后再拖延 30 度电气角,就是最佳的换相点。
这就像我们骑自行车,不看码表也能感觉到脚踏板什么时候该发力——脚踏转到某个角度时你腿上的反作用力会变向,那个点就是换向点。反电动势过零检测就是用电信号还原了这种“脚踏感”。我在实际做项目时,经常用示波器同时看相电压和中性点电压,看到两路信号交叉的瞬间,就是过零点。
2.2 电压比较法:用硬件简化逻辑判断
反电动势检测有两种主流实现路径,我建议入门先从比较器法开始。它的思路很简单:把不导通那一相的 BEMF 与中性点电压做比较,当两者相等时,比较器输出跳变,触发 MCU 中断。
但这里有个工程陷阱:电机的中性点不总是能引出来。很多无感 BLDC 的电路里,中性点并没有单独引线。我的做法是做一个“虚拟中性点”,用三个等值电阻(通常是 10k 到 100k 欧姆)分别接到三相线上,另一端短接在一起,这个短接点的电压基本上就接近真实中性点电压了。
电路接好之后,还要处理两件事。一是分压,电机母线电压如果是 24V 或更高,直接送进比较器会把芯片烧了,需要电阻分压把电压降到 MCU 和比较器的工作电压范围内。二是滤波,PWM 斩波带来的高频噪声会污染反电动势信号,不加 RC 滤波的话比较器输出会反复抖动,必须加一个小电容把它滤平滑。
我调试中的经验是,RC 滤波截止频率不要选得太低,否则过零点的相位会延迟得很厉害,导致换相点大幅偏移。一般情况下,截止频率放在 10kHz 到 50kHz 之间比较合理,具体数值取决于 PWM 频率和电机最大转速对应的 BEMF 基频。拿一个实际例子来说,PWM 频率 20kHz,极对数为 4,最高转速 30000rpm,对应的电频率就是 2000Hz,这时 RC 滤波截止频率选 20kHz 左右,相位延迟大约只有几度,控制起来手感还在。
2.3 ADC 采样法:让软件接管更多逻辑
比较器法是硬件实时响应的,速度快,但电路要额外加芯片或比较器。如果 MCU 自带 ADC 且性能不错,也可以直接用 ADC 采样来做软件过零检测。
软件法的做法是:在 PWM 的某个固定时刻(比如下管导通的斩波区间),依次采样不导通相的电压和虚拟中性点电压,然后由软件判断是否过零。好处是省掉了比较器芯片,电路更简洁,而且可以灵活调整滤波算法和阈值补偿。缺点是 MCU 在 PWM 中断里要干的事情更多,时序要求更严格,运算量也大一些。
我个人的建议是,初学阶段先用比较器法把手感摸清楚,等理解了过零检测的完整流程之后,再切换到 ADC 采样法做产品化封装。因为比较器法调试时逻辑简单、现象直观,容易建立信心;ADC 采样法虽然灵活,但会引入采样窗口、噪声平均、相位补偿等一系列参数,出了问题不容易定位。
3. 启动前的预定位:让转子听你的话
3.1 为什么不给电门电机不转
很多第一次调无感 BLDC 的朋友会遇到这个现象:程序进 main 函数之后,直接按顺序给六步换向,结果电机只是原地嗡嗡振动。问题就出在启动时刻转子位置是未知的。
我们知道反电动势为零时无法检测位置,那启动时电机还没转,BEMF 就更不可能有信号了。这时候如果贸然换向,通电产生的磁拉力方向与转子磁铁方向不一致,就会导致力矩小、抖动、甚至反转。这就像你在黑暗中想推一个未知朝向的物体,方向错了自然推不动。
所以无感 BLDC 启动必须分阶段:先预定位,再强制换向加速,最后切换到反电动势闭环。这三个阶段缺一不可,每个阶段都有自己的参数和逻辑,我一个个拆开说。
3.2 预定位的两种策略和参数计算
预定位的核心目标是:在电机不起转的前提下,把转子锁定到一个已知的、可控的位置。具体做法通常有两种。
第一种是两相导通定位法。随便选两相通电,比如 A 相进 B 相出,施加一个幅值可控的电压矢量。这个矢量产生的磁场会把转子吸到与之对齐的位置。我实测下来,这种方法简单可靠,位置精度在十几度以内,对绝大多数 BLDC 无感启动完全够用。缺点是有两次定位不确定方向翻转的风险:电机可能往左转 30 度,也可能往右转 150 度才对齐,取决于转子初始位置在哪一侧。
第二种是高级一点的“短脉冲序列定位法”,就是依次向多个方向发短脉冲,测量相电流上升率来判断转子大致位置。这种方法可以做到接近 60 度内的精度,启动反向概率很低,但实现复杂度明显提升。我的看法是,普通风机水泵完全用不上这个,只有对启动瞬间反向有严格要求的高端应用才需要。
预定位的通电时间和电流幅值怎么选?有个简单的工程经验:施加的电压矢量只要能在电流上升到峰值之前完成定位就行,一般通电时间放在 50ms 到 500ms 之间。幅值上,我一般先设定为额定电流的 30% 到 50%,换算成占空比,比如母线 24V,绕组电阻 0.5 欧姆,想要 2A 电流,那占空比大约是 2*0.5/24 ≈ 4.2%,实际还要考虑 MOS 管压降和线路损耗,我会先给个 8% 再边调边看电流。
这里有个容易犯的低级错误:预定位时间太长会导致绕组发热,尤其是在电机堵转的状态下,电流一直很大却没有机械运动来散热,时间长了线圈漆包线容易烧。我见过有新手把预定位时间写成了 2 秒,通电试机手摸电机外壳烫得快起泡,这种一定要避免。
3.3 强制换相加速:从静止到反电动势“看得见”
预定位结束后,转子已经被拉到了已知位置,下一步就是强制换相加速。这阶段的逻辑很简单:按固定时间间隔(或者按固定加速度曲线)依次给六步换向通电,让电机从零开始逐步加速。
强制换相的核心参数是两个:起始换相频率和结束换相频率。起始频率要足够低,让电机的负载能跟上,但不能低到产生明显的步进感,一般从 20Hz 到 50Hz 电频率起步。结束频率就是切换到反电动势闭环的转速点,常见做法是切换到转速对应的电频率在 100Hz 到 300Hz 之间。
加速斜率也很讲究。加速度太快,电机会因为惯性跟不上磁场旋转而失步;太慢,启动时间过长会让用户感觉迟滞,而且长时间强制换相没有位置反馈,一旦负载波动就容易停转。我在无人机电调项目里,通常会把强制加速区间的换相时间做成线性递减,比如从 15ms 递减到 3ms,曲线可以按实际负载做调整。
调试强制换相阶段时,我习惯用示波器测电机相电流。如果电流波形在每步换相后都有一个尖峰然后回落的趋势,说明转子基本跟上了磁场;如果电流持续走高或者出现明显振荡,说明换相时刻与转子位置不匹配,需要降低加速度或提高换相起始频率。
3.4 切入闭环:反电动势过零信号接管换相
强制换相把电机带到一定转速后,反电动势信号已经足够强,就可以切换到闭环模式。切换的本质是把“按时间换相”改成“按过零检测换相”。
这里有一个关键的软件逻辑必须做对:首次过零检测到了之后,不能立刻换相,而是要等 30 度电气角。为什么?因为过零点发生在 BEMF 波形穿过零的时刻,而最佳换相时刻发生在反电动势与电流相位对齐的位置,这个位置落后过零点 30 度电角度。如果你一检测到过零就换相,等于换相时刻提前了 30 度,力矩会明显下降,电流也会畸变。
等 30 度的方法有两种。一种是用时基:从过零时刻开始计时,延时 T/12(T 是当前电周期),到时间就换相。另一种是用角度估算:用最近几次换相周期推算速度,算出 30 度所需延时。前者简单,后者更平滑,我建议初学先用前者。
切换时的平滑处理也很重要。我遇到过一种情况:强制换相切换到闭环的一瞬间,电机发出“咔”的一声然后剧烈抖动。后来排查发现,是强制换相的相位和检测到的过零相位没对齐,切换瞬间产生了一个大的相位跳变。解决办法是在强制换相阶段就持续检测过零信号,一旦某个过零信号的相位和强制换相相位偏移小于预定值,就立即切到闭环。如果过零信号一直不匹配,就让强制换相继续跑一段时间再尝试切换。
4. 硬件电路与软件实现的实战要点
4.1 反电动势采样电路的设计与选型
反电动势采样电路常见的做法是“三相分压+虚拟中性点+比较器/ADC”。具体来说,三相线各接一个分压电阻串,输出到比较器或 MCU 的 ADC 引脚,同时三个分压点并连一个电阻网络形成虚拟中性点。
分压电阻阻值的选择要考虑两点:一是静态工作点,二是功耗。我常用的组合是:高压端 100k 到 200k,低压端 10k 到 20k,这样分压比大约在 1/11 到 1/21 之间。如果母线 48V,分压后大约 4V 左右,刚好落在常见比较器或 ADC 的输入范围内。
这里要注意一个细节:分压电阻不仅分掉了反电动势信号,也会把 PWM 斩波的高频分量引进来。所以在送入比较器或 ADC 之前,需要加一个对地的小电容,比如 1nF 到 10nF,构成 RC 低通滤波。这个电容的大小直接影响过零检测的相位延迟。
我踩过的一个坑是:为了追求波形干净,把滤波电容加大到了 100nF,结果检测到的过零点被延迟了将近 20 度电角度,电机跑起来发热严重,效率明显下降。后来量了下信号才发现相位偏得离谱,把电容换回 4.7nF 之后一切恢复正常。所以在选择滤波参数时,一定要结合电机最高电频率来计算相位延迟,不要盲目追求滤波深度。
4.2 比较器法的完整信号链
比较器法的信号链一般是:三相分压 → RC 滤波 → 比较器正负输入 → MCU 捕获通道。
比较器正输入接当前不导通相的电压,负输入接虚拟中性点电压。当不导通相 BEMF 从正往负穿越中性点时,比较器输出翻转,这个翻转沿触发 MCU 输入捕获中断。中断里记录时间戳,软件判断属于哪一相、哪个方向,然后据此设定 30 度延时换相。
要注意比较器本身的输入共模范围和输出逻辑电平必须与 MCU 匹配。比较器输出通常需要加上拉电阻,并注意施密特触发特性,否则在过零点附近会有反复翻转的毛刺。选比较器型号时,我常用 LM393、LM339 这类低成本比较器,不过它们的输出是开集电极的,必须接上拉电阻。
还有一种做法是把比较器的两个输入反过来接,并在软件里检测下降沿而不是上升沿,这样做的好处是可以错开 PWM 开关噪声比较严重的时刻。我实际测试过,在 PWM 开通瞬间附近采样,比较器翻转的抖动明显大于关闭区间,所以通过软件把采样窗口避开 PWM 开通瞬间,能显著提高过零检测的稳定性。
4.3 ADC 采样法与软件过零判断流程
ADC 采样法不需要比较器,三相分压后的信号直接进 MCU 的 ADC 引脚。采样时序通常放在 PWM 周期中下管导通的时间窗口内,这样可以避开上管导通时母线电压直接加到绕组上的区间,测得的值更能反映真实 BEMF。
软件过零判断的常规流程如下:
- 在 PWM 中断里判断当前是哪一相处于不导通状态。
- 在固定窗口时间触发 ADC 采样,同时采集该相电压和虚拟中性点电压。
- 重复采样若干次,用平均值或中值滤波去掉随机噪声。
- 将滤波后的相电压与中性点电压做差,比较其符号变化。
- 记录符号翻转的时刻,作为过零时间点。
- 根据最近的电周期估算延时 30 度的时间,触发换相。
这套流程我在实际项目中调过多次,最大的感受是采样窗口的选取至关重要。如果 ADC 采样的时刻刚好落在 PWM 开通瞬间,采集到的电压里会叠加大量的 dv/dt 噪声,软件滤波做得再好也难以完全消除。所以我一般会在 PWM 配置里留一个死区时间,把 ADC 采样请求放在死区之后的稳定区间。
软件滤波的算法也不宜太复杂。我试过卡尔曼滤波、滑动平均、中值滤波,最后量产用的反而是最简单的“连续采样三次取中间值”。因为反电动势信号在过零点附近本身就很干净,主要噪声来自 PWM 斩波和电机振动,中值滤波去掉偶发尖峰已经足够了,复杂的算法反而引入了不必要的延时和代码负担。
4.4 换相时序的软件架构
无感 BLDC 的软件架构我建议这样组织:一个高频中断处理 PWM 换相和 ADC 采样,一个低频循环处理启动状态机、过零计速和故障保护。
高频中断的优先级最高,每次进入中断就判断当前处于什么状态:预定位、强制换相、还是闭环。闭环状态下,如果有过零标志就计算延时换相时间,否则判断是否超时(超时说明丢步)。
低频循环则负责维护状态机的跳转:启动时预定位 → 定时到进入强制换相 → 过零信号连续 N 次有效再切入闭环 → 运行中检测过流、过温、堵转等故障。
我之前做过一个项目,把所有逻辑都写在一个超大的主循环里,结果 PWM 中断稍微延迟,换相时刻就出偏差,电机高频噪音特别大。后来重构为中断+环形缓冲的架构,把换相和采样放到中断里,主循环只做状态调度和故障处理,效果立刻好了很多,运行噪音也降下来了。如果你也在开发类似的控制器,建议一开始就按这个思路设计,不要等出了问题再推倒重来。
5. 反电动势定位调试的关键指标
5.1 用示波器看什么:相电压、虚拟中性点和比较器输出
调试反电动势定位,示波器的使用可以说是最重要的技能。我每次调新板子都会先接三个通道:通道一接某一相的分压后信号,通道二接虚拟中性点,通道三接比较器输出。
在电机匀速运行状态下,第一个要确认的就是不导通相的相电压波形是否呈现明显的梯形波特征,并且相位上与其它两相互差 120 度。如果波形是锯齿状或者噪声明显,说明采样电路或滤波参数有问题。第二个要确认的是比较器输出的翻转时刻是否稳定,有没有逐周期抖动,如果抖动范围超过 5 度电角度,就要检查滤波电容和比较器上拉了。
第三个要仔细观察的是过零时刻与换相时刻的间隔。常规做法是过零后延时 30 度换相,在示波器上看应该是:比较器翻转一次,经过一段固定延时,功率管的开关状态切换一次。这个延时如果忽长忽短,说明速度估算或角度延迟计算有 bug,需要回到软件层面排查。
5.2 软件参数“四件套”:启动电压、加速度、延时角度、保护阈值
无感 BLDC 启动调试时,我最先调的是四个参数,把它们统称为启动四件套。
第一个是预定位电压占空比,它决定了定位力矩大小。太小锁不住转子,太大过流发热。第二个是强制换相起始周期和结束周期,这两个值决定了启动转速范围。第三个是过零检测后的延时角度系数,通常设成 30 度,但实际电机和电路有寄生参数,可能需要微调到 25 到 35 度之间。第四个是换相超时保护阈值,如果超过这个时间没检测到过零点,就必须停机或重新启动,防止电机堵转烧毁。
我调四件套的方法是:先把预定位占空比设大一点,保证定位可靠;再把强制换相起始周期拉长,让电机肯定能启动;然后逐渐减少延时角度系数,观测电流是否下降;最后把保护阈值设定为正常换相周期的 1.5 倍到 2 倍。一个一个调,不要同时动几个参数,否则出了问题根本不知道是哪个造成的。
5.3 电流波形是最终的裁判
很多人调试无感 BLDC 只看电机转不转,这其实远远不够。我要求自己每次调完都看三相电流波形。理想状况下,BLDC 方波驱动的三相电流应该近似方波,六步换相时电流相位平稳切换,没有明显的尖峰和塌陷。
如果电流波形在每步中间出现明显的电流塌陷,基本可以判定是换相提前或者滞后了。提前换相时电流在换相瞬间有一个明显的冲击尖峰;滞后换相则表现为换相后一段电流偏低,然后才回升。通过反复调整延时角度系数,把电流波形调到接近理想的方波,电机的效率和噪音都会明显改善。
还有一个指标是母线电流。同样的转速和负载下,母线电流越小说明换相越精准。我在项目里经常会做一组对比实验:固定电压、固定负载,分别用 25 度、30 度、35 度延时角跑同一台电机,记录各自的母线电流和电机温度,最后选择电流最小、温度最低的角度。这种方法不玄学,数据说话,效果立竿见影。
6. 常见问题与故障排查实录
6.1 电机只振动不转动
这个现象十有八九是预定位没成功。首先确认预定位时间是否够长,电压幅值是否够大;其次用示波器量一下 Power 管驱动波形,看看是否真的有电压矢量加在指定相上;最后用电流探头看看预定位阶段电流有没有建立起来。如果电流很小,说明绕组电阻和电压不匹配,需要提高占空比。
还有一个容易被忽略的原因:预定位结束后强制换相的起始频率太高,转子还没完全对齐就快速切换磁场方向,导致电机在原地抖动。这种时候把强制换相起始周期加大,比如从 20ms 起步,通常就能顺利启动。
6.2 电机转起来噪音大,电流尖峰明显
噪音大和电流尖峰往往一起出现,原因大概率是换相相位偏差。先查滤波电容是否过大导致的过零延迟,再用示波器对比比较器翻转时刻与实际换相时刻,确认延时角度是否正确。
如果延时角度没问题,考虑是不是 PWM 频率共振引起的电磁噪音。这时候可以提高 PWM 频率到 20kHz 以上,避开人耳敏感区间,但要注意这会增加功率管的开关损耗,需要评估散热。
6.3 带载启动失败,空载很好
空载启动正常,一加载就失败,说明启动扭矩不够。解决办法有两个方向:一是提高预定位电压和强制换相起始频率,让电机在进入闭环前获得更高的转速和扭矩;二是延长强制换相时间,让电机在开环状态下多跑一段时间,直到反电动势足够强再切入闭环。
我见过一个项目,加载失败的原因是负载惯性太大,强制换相加速度太高导致失步。那时候把加速度调低,强制换相时间从 300ms 加长到 800ms,问题就解决了。所以带载启动失败不要急着猛加电压,先分析是扭矩不足还是加速度过大。
6.4 常见问题速查表
| 现象 | 可能原因 | 检查顺序 |
|---|---|---|
| 电机不转只振动 | 预定位电压不够;预定位时间太短;强制换相起始频率过高 | 1先测驱动波形 2看预定位电流 3降起始频率 |
| 启动后“咔”一声抖动 | 强制换相切闭环时相位跳变 | 1检查过零信号是否稳定 2增加强制换相时间 |
| 运行中突然停转 | 负载突增或堵转保护触发 | 1查过流阈值 2看换相超时时间 |
| 高速时噪音明显 | 换相滞后或超前 | 1微调延时角度 2检查滤波电容相位延迟 |
| 空载正常带载失败 | 启动扭矩不足或加速度过大 | 1提高预定位占空比 2降低加速度 |
| 相电压波形畸变 | 采样电阻分压比不对或滤波参数不合理 | 1量分压点电压 2调RC参数 |
7. 最后再分享一个小技巧
反电动势定位这个技术,我玩了好几年,最大的心得就是“别怕看波形”。很多朋友调不出来,不是理论不行,而是不敢把示波器探头接到高压侧,不敢面对一团乱糟糟的波形。其实只要注意隔离和衰减,多花点时间在示波器上,很多疑难杂症都能一眼看穿。
另外建议新手先买一个成熟的 BLDC 开发板做对照实验,把程序烧进去看它跑,再对着源码和波形一点点理解。等理解了再自己画板子、写代码,这样踩坑成本最低。如果手里有带霍尔传感器的 BLDC,也可以先用霍尔模式跑通,再切换到反电动势模式,对比两种模式下电流波形和换相逻辑的差异,这比看十篇教程都有效。