☰
无感BLDC反电动势检测实战:从比较器电路到三段式启动
2026/10/7 12:58:03 网站建设 项目流程

1. 先搞清楚一件事:无感BLDC到底在“感”什么

很多人一听到“无感无刷电机”,第一反应是FOC、滑模观测器、龙伯格观测器这些词。实际上,在电动工具、水泵、散热风扇、无人机电调这些出货量最大的场景里,真正扛起大梁的技术反而更朴素——反电动势检测。无感不等于没有传感器,而是把电机绕组本身当成传感器,从反电动势波形里反推转子位置,再决定什么时候换相。这套思路如果吃透了,再看FOC那些高级算法,底层逻辑也是相通的。

1.1 转子位置为何如此重要

无刷直流电机(BLDC)的定子是绕组,转子是永磁体。要让电机持续转,必须让定子磁场“追着”转子磁场跑,这就得知道转子当前转到哪了。有霍尔的方案简单粗暴,在电机里埋三个霍尔元件,每60度电角度输出一组编码,控制器照着霍尔表换相就行。无感方案没有霍尔,位置信息全靠“猜”,而这个“猜”必须建立在物理量观测上,否则电机轻则抖动、重则反转甚至烧MOS管。

准确拿到转子位置之后,换相的好坏直接决定三件事:转矩是否平稳、噪音是否够低、效率是否够高。换相早了,绕组电流超前于反电动势,电机会进入发电状态,转矩下降、发热上升;换相晚了,电流滞后,同样会损失效率。所谓的“精准换相”,本质上就是把6步换相点卡在“反电动势过零后再延迟30度电角度”的位置。这个位置找得准,电机运行起来和带霍尔几乎没区别。

1.2 反电动势是藏在绕组里的“天然编码器”

永磁转子的磁场穿过定子绕组时,只要转子在转,绕组里就会感应出电压,这就是反电动势。反电动势的大小和转速近似成正比,方向取决于转子磁极和绕组轴线的相对位置。最关键的规律是:某一相绕组反电动势的过零点,恰好对应转子磁极与该相轴线对齐(或垂直,取决于定义)的时刻。

把三相绕组接成星形,任意时刻总有两相通电,第三相悬空。悬空那一相上的电压包含两部分:直流母线中点电压和该相的反电动势。如果母线电压稳定,那么通过比较“悬空相端电压”和“虚拟中性点电压”,就能抓到反电动势过零。这个过零信号每60度出现一次,而换相点比过零点延迟30度,所以整个过程可以看成:电机每转一圈,我们偷看了6次“天然编码器”的读数。

1.3 无感方案的适用边界

无感反电动势检测不是万能的。它的前提是“有足够的反电动势能测到”,也就是说电机转速不能太低。转速为零时反电动势为零,电机静止时我们无法通过BEMF知道位置,这就是无感BLDC必须“三段式启动”的原因。此外,负载突变、母线电压剧烈波动、以及PWM开关噪声都会污染反电动势信号,这也是很多工程师在实验室转得好好的,一装机就抖的原因。

所以,如果你直接问“无感和有感哪个好”,我的回答是:能用霍尔就用霍尔,空间不允许、成本敏感、或者要过高温环境时再上无感。无感最大的价值不是替代霍尔,而是把传感器从电机肚子里挪到控制器里,让电机本体更皮实、接线更少、成本更低。

2. 反电动势检测的三种方案,我为什么推荐比较器起步

反电动势检测落地的方案大致分三类:比较器法、ADC采样法、虚拟中性点计算法。每个方案都有各自的适用场景,但第一次做无感驱动,我强烈建议从比较器法起步。原因很简单:比较器法实时性好、代码量小、对MCU算力要求低,而且把模拟信号转成数字脉冲后,后续处理非常直观。

2.1 方案对比:比较器、ADC采样、虚拟中点

方案核心思路硬件成本MCU资源抗噪能力适合场景
比较器法把非导通相电压与虚拟中点比较,直接输出过零脉冲低,3个比较器加分压电阻极低,一路捕获即可中等,依赖滤波和屏蔽窗口电调、电动工具、风机
ADC采样法用ADC定时采样三相端电压和虚拟中点,软件算过零低,去掉比较器较高,需要多通道ADC和定时同步较好,可在软件滤波需要诊断、电流采样的系统
虚拟中点计算法通过三相端电压数学重构中点,再解析反电动势较低高,需要同步采样和解算好,但受ADC精度影响FOC前置、对噪声要求高的场合

从这张表能看出来,比较器法本质上是把“过零检测”这件模拟域的事,用硬件电路直接干了。MCU只需要在比较器输出的上升沿或下降沿打一个时间戳,剩下的延迟补偿、换相状态切换都由软件处理。这样做的好处是把最难搞的模拟信号处理固化成电路,把灵活的时序控制留给代码。

2.2 比较器法的电路本质

比较器法的标准接法是:三相绕组输出端各接一组电阻分压(比如100k/10k),分压后的信号分别接到三个比较器的同相输入端,反相输入端接另一个由三个相同电阻构成的虚拟中性点分压网络。当非导通相的端电压与虚拟中点电压相等时,比较器翻转,输出一个过零脉冲。

这里有个很多人一开始没想明白的细节:虚拟中性点和电机星形绕组的中性点不是一回事。电机绕组的中性点是浮空的,没法直接引出来测量,所以用三个电阻构造一个人工中点。但人工中点和真实中性点之间有个误差,误差来自三相电阻的精度和绕组阻抗的不平衡。实际设计时,分压电阻用1%精度的金属膜电阻,三路严格对称,误差基本可以忽略。

2.3 ADC采样法的隐藏成本

ADC采样法听起来更“高级”,因为可以在软件里做各种滤波和补偿。但做过的都知道,坑在同步上。为了测到非导通相的反电动势,你得在PWM周期里选一个合适的时刻去触发ADC,这个时刻要避开开关管导通和关断瞬间的振铃。如果ADC采样时刻和PWM载波不同步,采到的电压就会混入大量开关噪声,软件滤波再狠也救不回来。

另外,ADC采样法对MCU的定时器、DMA、ADC多通道配合要求很高,代码调试难度上了个台阶。所以我的经验是:如果你的目标只是让电机转起来、转得稳,比较器法是最短路径;如果你后续要做FOC、要做转矩闭环,再咬牙上ADC同步采样不迟。

3. 从过零检测到精准换相:30度电角度背后的逻辑

比较器输出的过零脉冲只是“半成品”,真正驱动电机的是6步换相逻辑。要理解精准换相,必须先看懂“过零点”和“换相点”相差的30度电角度是怎么来的,以及怎么用代码把这个角度差转成时间差。

3.1 反电动势过零与换相点的数学关系

以三相星形BLDC为例,理想情况下,任意时刻只有两相导通,第三相悬空。悬空相的端电压等于反电动势加上母线中点电压,所以反电动势过零时,悬空相端电压等于中点电压。而当转子转过30度电角度以后,反电动势波形已经进入线性上升/下降段,此时正好是该相应该接入母线、替换当前导通相的时刻。

换句话说,一个电周期360度,6步换相每次前进60度。过零检测发生在每步的中间点,也就是从“本步开始”算起过了30度的地方。所以,检测到过零后再延迟30度电角度,正好落在下一个换相点。这个关系在数学上非常干净:延迟时间 = 电气周期 / 12。

但电气周期不是固定值,转速一变,周期就变。假设当前电气频率是f(Hz),那么延迟时间就是 1/(12f) 秒。如果是极对数为p的电机,机械转速n(RPM)和电气频率的关系是 f = n*p/60,代进去就能算出延迟时间。

3.2 PWM策略对检测窗口的影响

比较器法是采端电压的,而端电压在PWM开关过程中会剧烈跳变,不可能在任意时刻都做可靠比较。所以必须给比较器一个“窗口”,只在PWM波形的某个阶段才允许过零信号通过。

最常见的策略是“上桥PWM、下桥常通”,也叫PWM_ON调制。在这种模式下,PWM导通期间,非导通相端电压反映的是BEMF与母线电压叠加的结果,比较器可以正常工作;PWM关断期间,绕组通过下桥续流二极管续流,非导通相电压被钳位,比较器输出会乱跳。因此,软件里要用一个与PWM同步的窗口信号,只在PWM导通区间读取比较器输出。实现上,可以让PWM定时器的输出比较通道产生一个窄窗口脉冲,或者用门控电路把比较器输出和PWM信号做个逻辑与。

另一个细节是:在高占空比下,PWM导通时间很长,检测窗口很宽,问题不大;但在低占空比下,导通时间很短,过零信号可能刚好落在关断区间,导致漏检。这时要么改用“PWM关断期间检测”的策略,要么干脆把调制方式改成“H_PWM-L_ON和L_PWM-H_ON交替”的互补模式,窗口更稳定。

3.3 延迟角度实现:定时器捕获不是唯一的办法

检测到过零后,延迟30度电角度换相,实现方式有几种。最简单的是“定时器延时”,过零脉冲触发输入捕获中断,在中断里读取当前转速估算值,算出延迟时间,启动一个定时器,时间到就换相。这种方法在转速变化不剧烈的场合完全够用。

另一种方式是“锁相环/频率跟踪”,每个过零脉冲更新一次电气周期估算值,然后以周期/12为目标做相位累加,更新换相状态。这种方式在动态响应要求高的时候更稳,因为每次过零之间都在连续计算相位,而不是“过零后傻等”。我用过前一种方式做电动工具,堵转恢复时明显感觉换相跟不上;换成跟踪式之后,急加速和堵转恢复都流畅了很多。

不管哪种方式,都要处理一个问题:反电动势过零和比较器翻转之间存在相移。滤波电容、比较器响应延迟、软件滤波都会引入额外延迟,转速越高,延迟对应的电角度越大,换相就越滞后。所以成熟的方案都会加一个速度相关的提前角补偿表:测出实际延迟电角度,在当前转速下查表补偿,让真正的换相点回到那个30度的理想位置。

4. 驱动板最小系统参考设计:从电源到比较器全链路

理论说再多,不如一块能跑的板子实在。下面这套是我在STM32F103上验证过的参考设计,包含功率部分、栅极驱动、反电动势采样比较电路,以及MCU资源分配。照着搭,至少能把无感BLDC转起来。

4.1 逆变桥与栅极驱动选型

三相全桥用6个N沟道MOS管,常见型号有IRLR7843、IRF540、以及低电压场合用的AOD4184A。母线电压24V以下,选耐压40V~60V的管子;48V以上,建议直接上IPM模块,别自己搭分立器件,寄生参数够你调半年的。

栅极驱动我推荐用自带自举电路的三相驱动器,比如IR2101三片或者EG2134一片搞定。IR2101是半桥驱动,一片管一个桥臂,需要三片;EG2134是三相一体,外围简洁,适合小功率板。自举电容选1μF~10μF的X7R陶瓷电容,并联一个0.1μF高频电容,布局时尽量贴近驱动芯片的VB和VS引脚。自举二极管必须用快恢复管,普通1N4148在高压高频下恢复太慢,容易烧上管。

4.2 分压、滤波与比较器参考电压设计

反电动势检测电路我从功率级直接取样,三相输出端各串一个10kΩ电阻,再对地并一个1kΩ电阻,分压比11:1,得到0~Vbus/11的电压范围。比较器用LM393或者TLV3501,前者便宜、后者高速。比较器反相输入接虚拟中点,做法是用三个10kΩ电阻分别从三相分压点汇到一个节点,再串一个10kΩ到地。注意虚拟中点的输出阻抗较高,必须在比较器反相输入端加一个电压跟随器,否则比较器输入偏置电流会造成几个毫伏的误差,过零判断就不准了。

滤波环节要克制。很多新手喜欢在比较器输入端加100nF大电容,结果过零信号被移相几十度,高速时换相点偏到姥姥家。我的做法是:只在比较器输出端加一个10kΩ上拉和1nF小电容,滤掉高频振铃。如果需要更强的滤波,优先在软件里做,别用硬件大电容硬扛。

4.3 STM32资源分配与接线

我用的是STM32F103C8T6,72MHz主频,资源完全够。三相PWM用TIM1的CH1/CH2/CH3,互补输出CH1N/CH2N/CH3N,配置成中心对齐模式,死区设在500ns左右。比较器输出的三路过零信号分别接到TIM2的CH1/CH2/CH3捕获通道,这样过零脉冲可以硬件打时间戳,MCU不用频繁进中断。其它IO负责使能栅极驱动、LED指示、以及串口调试。

下面是一段HAL库的PWM初始化片段,核心是配置中心对齐和死区:

// 以TIM1为例,输出6路互补PWM TIM_HandleTypeDef htim1; htim1.Instance = TIM1; htim1.Init.Prescaler = 72 - 1; // 1MHz计数频率 htim1.Init.Period = 1000 - 1; // PWM频率 = 1MHz/1000 = 1kHz htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; HAL_TIM_PWM_Init(&htim1); // 死区时间设置为1us左右,具体值按MOS管参数调整 TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 72; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.BreakFilter = 0; HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);

注意,中心对齐模式下,PWM周期是Period的两倍,所以上面代码实际PWM频率是2kHz(如果你按1ms周期算)。这个细节很容易让人疑惑:示波器看到1kHz,而代码里写的是2kHz。实际设计时按需求调整预分频和周期即可。

5. 三段式启动:开环强拖、同步检测、闭环切换的实操要点

无感BLDC启动是重灾区,几乎每个新手都会在这里卡几周。有霍尔方案通电就知道位置,直接闭环启动;无感方案在电机静止时反电动势为零,啥都测不到,只能先“盲启动”。

5.1 为什么无感BLDC无法像有感那样直接启动

电机静止时,反电动势为零,比较器输出没有任何过零脉冲,位置完全未知。就算随机换相,也有可能刚好让转子反向转一下,接着再修正。为了不冒这个险,工程上普遍采用“三段式启动”:预定位、开环强拖、闭环切换。

预定位很简单:给某一相通电一段时间,比如AB相通电,定子磁场会把转子拉到一个已知位置。这个过程要持续几百毫秒,确保转子停稳。如果时间太短,转子还在震荡就进入下一步,很容易失步。强拖阶段则是按照预设的换相频率,从低速开始逐步加速,每次换相时间递减,相当于开环让电机跑起来。此时转子不一定每步都跟得上,但只要加速度不太快、负载不太重,通常能拖起来。

5.2 强拖阶段参数怎么定

强拖阶段的参数取决于负载惯量和启动扭矩需求。经验上,起始换相频率设在5~10Hz电频率,也就是每100ms换一次相,保证大力气把转子拉动。然后按指数或线性规律加速,比如每步递减5%的换相周期。加速曲线太陡容易失步,太平则启动太慢。

另一个关键参数是强拖PWM占空比。占空比太低,电流不足以克服静摩擦;太高,电流冲击大,可能触发过流保护。我一般从30%开始,根据启动电流波形微调。如果能实时监测母线电流,可以做成闭环:检测到电流出现周期性波动并且幅值下降,说明转子已经跟上,这时才进入下一步。

5.3 切换闭环的条件与防抖策略

强拖到一定转速后,反电动势幅值足够大,比较器输出的过零脉冲开始稳定。此时可以从开环切换到闭环。判断条件是:连续N个过零脉冲间隔在预期范围内,并且脉冲频率和强拖频率基本一致。N一般取3~5,太少容易被误脉冲骗,太多则容易错过切换窗口。

切换瞬间最怕转速突变。做法是:闭环换相时刻,先用开环强拖的换相周期作为初值,然后平滑过渡到闭环估算的周期。如果过零脉冲突然丢失,不要立刻回退到开环,而是保持当前换相周期,等待几个脉冲,如果仍然没有,再降级到强拖状态。这个“等待”机制能让电机在短暂负载扰动下不轻易失控。

6. 调试实录:反电动势被PWM噪声淹没,我从波形里找到的三件事

软件写完、板子焊好,真正的战斗才刚刚开始。无感驱动的调试,九成时间在跟噪声和波形较劲。下面记录我个人经历里最典型的三次故障,每个都是直接看波形就能定位的。

6.1 示波器探头怎么接才能看到BEMF

第一次调试,我把示波器探头地线夹夹在板子的地平面,探头点到电机相线,看到的是乱七八糟的高频振铃,完全看不到BEMF。后来才明白,探头地线夹的引线电感会和探头电容形成谐振,把几十MHz的开关噪声放大。正确做法是:用弹簧地线(最近的地线)或者直接焊一根短地线在探头尖端附近,让信号回路面积最小。如果条件允许,用差分探头看相电压会干净得多。

还有一点,调试时一定要让PWM工作在低占空比,比如10%,这样导通区间短、关断区间长,更容易在波形上找到过零的位置。等确认过零脉冲可靠了,再慢慢加占空比。

6.2 分压电阻的寄生电容葬送了过零信号

有段时间我的比较器输出总是偶尔丢脉冲,用示波器看比较器输入,发现非导通相电压在过零附近有一个缓慢的爬坡,而不是干脆利落的穿越。排查到最后,罪魁祸首是分压电阻的寄生电容。我用的10kΩ电阻是直插大封装,引脚之间分布电容叠加后大约有十几pF,和10kΩ组成低通滤波,截止频率约100kHz左右。看似很高,但PWM边沿的频谱很宽,振铃能量会把波形“拖”歪。

换贴片0402电阻、缩短走线后,问题明显改善。如果分压电阻值不能降太多(为了降低功耗),可以在过零比较器前加一个高速比较器,牺牲一点直流精度换取高频响应。

6.3 低速和高速下换相提前/滞后的补偿

最后一个让我难忘的问题:低速时电机噪音大、效率低,高速时又出现过流。排查后发现是不同转速下延迟角完全不一样。低速时,比较器输入端的小滤波电容让过零信号滞后,换相点实际比理想点晚,电流波形拖着尾巴;高速时,软件延时和电路延时相对固定,但电角度变化极快,几微秒的延迟可能对应十几度电角度,换相点明显提前。

解决方法是做一张换相提前角补偿表。我在代码里把转速分成8个区间,每个区间实测一个补偿角度,插值使用。低速区补偿为正(把换相时间点提前),高速区补偿为负(抑制过大的提前量)。实测下来,电机声音明显变干净,高速段相电流峰值也降了不少。

无感驱动的调试就是这样,每个“玄学”问题背后都藏着具体的物理原因。把波形看明白,把每个延迟折算成电角度,问题就一步步解开了。我自己在这些坑里爬过之后,最大的体会是:别一上来就追求高级算法,先把比较器法和三段式启动调透,后面无论上不上FOC,你都会感谢这段打基础的日子。

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

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

立即咨询