换个说法:
1. 核心思路拆解:为什么无感方案绕不开反电动势检测
1.1 有感与无感的本质差异
做无刷电机驱动,第一道选择题就是带霍尔还是不带霍尔。带霍尔方案简单粗暴,转子位置直接由霍尔传感器告诉MCU,换相逻辑就是查表,几乎不费脑子。但霍尔传感器有两个先天短板:一是成本,二是可靠性。电机内部高温、振动、油污环境下,霍尔器件容易失效,而且三颗霍尔加上线束,成本并不低。
无感方案把这套传感器省掉了,代价是MCU得自己“猜”转子在哪。怎么猜?靠反电动势(Back-EMF)。电机转起来之后,三相绕组里会感应出与转子位置相关的电压信号,通过检测这个信号的过零点,就能反推转子位置,进而决定什么时候换相。这就是“无感无刷”最核心的原理。
这个方案的好处很明显:省掉三个霍尔元件、六根线,BOM成本下降,可靠性提升;坏处也很明显——电机静止时没有反电动势,启动和低速阶段就是睁眼瞎,需要用特殊策略“盲开”。所以无感无刷的难点从来不在高速稳态,而在启动和低速。
1.2 反电动势检测的原理本质
要理解反电动势检测,先把电机模型摆出来。三相无刷电机的每一相绕组,都可以简化成一个电阻R和一个电感L串联,再加上一个反电动势源E。相电压方程大概是:
U_phase = R * I_phase + L * dI_phase/dt + E_phase其中E_phase就是我们需要测量的东西。理想情况下,三相绕组的反电动势波形是梯形波,梯形波的平顶部分宽度是120度电角度,这正好对应六步换相法里每一相的导通区间。
关键来了:反电动势的过零点,恰好发生在该相电感电流换向的中间位置,也就是转子磁极越过该相绕组中线的时刻。我们不需要精确测量反电动势的幅值,只需要精确捕捉过零点的时间。过零点出现之后,再延迟30度电角度,就是下一个换相点。
为什么是30度?因为六步换相法把360度电角度分成六个扇区,每个扇区60度。在一个60度扇区内,总有一相处于不导通状态(悬浮相),这相的反电动势过零点会在扇区正中间出现,也就是30度位置。从过零点再等30度,正好到扇区边界,这就是换相时刻。
1.3 为什么过零点不等于换相点
这个问题是新手最容易搞混的。反电动势过零检测给出的是转子的“位置信息”,但换相动作需要的是“提前量”。过零点和换相点之间永远差30度电角度,这个关系是不变的,但30度电角度对应的时间是随转速变化的。
高速时转速快,30度电角度对应的时间短;低速时转速慢,对应的时间长。所以在软件里,过零检测中断产生之后,不能简单固定延时,而要根据当前转速动态计算延迟时间。通常做法是用定时器捕获两次过零之间的时间,算出电周期,然后按比例算出30度电角度对应的时间。
这个动态延时的精度直接决定换相准确度。延迟太短,换相提前,电流波形畸变,力矩波动大;延迟太长,换相滞后,效率下降,严重时直接失步。后面第三节会详细讲这个计算过程。
2. 硬件电路设计:决定成败的采样与比较器方案
2.1 直接采样还是比较器方案,怎么选
反电动势检测的硬件实现,主流路线有两条:一是MCU的ADC直接采样三相反电动势,用软件算法找过零点;二是用比较器把反电动势和虚拟中点电压做比较,过零点直接触发MCU外部中断。两条路线各有拥趸,我个人的看法是:比较器方案更适合工程量产,ADC方案更适合算法调参和研究。
比较器方案的原理很直观:把三个相电压分别接比较器的正输入端,虚拟中点电压接负输入端。当某一相的反电动势穿过中点电压时,比较器输出翻转,触发MCU得到过零中断。好处是实时性好,不受PWM开关噪声影响,软件压力小;坏处是硬件成本增加,而且需要额外搭一套分压网络和滤波电路。
ADC方案把三相反电动势经分压电阻直接进MCU的ADC引脚,由软件在PWM关断窗口内采样、做数字滤波、再算过零点。好处是省钱,一个分压电阻网络搞定,还能顺便读到相电压幅值;坏处是采样时序必须在PWM的特定窗口内,受PWM频率和占空比限制,软件复杂度高。
如果你做的是风机、水泵这类对成本敏感的消费类产品,ADC方案够用;如果做电动工具、无人机这类负载变化大、要求响应快的场景,我更推荐比较器方案。当然现在很多MCU自带比较器外设,比如ST的电机控制系列,硬件开销没那么大。
2.2 分压网络与虚拟中点设计
无论哪种方案,分压网络都避不开。电机的母线电压是12V、24V还是48V,直接关系到分压电阻的选型。比如48V系统,如果直接进5V供电的MCU引脚,不烧掉才怪。分压比要保证最高母线电压下,MCU引脚电压不超过ADC参考电压,并留出20%~30%的余量。
虚拟中点电压的构建,可以直接用三个等值电阻接成星形,然后接到比较器的负输入端。这里有个工程经验:中点电阻的阻值要选得比分压支路电阻大一个数量级,比如分压电阻用10k,中点电阻用100k,这样可以减少中点网络对采样支路的负载效应。
有个容易忽略的坑:虚拟中点电阻网络本身的噪声。电机三相电压含有大量PWM斩波成分,中点电压也会被污染。如果直接拿一个噪声很大的中点电压去和反电动势做比较,过零判断会非常不稳定。所以中点后面要加一级RC滤波,截止频率取在PWM频率的1/10左右,既能滤掉斩波噪声,又不至于把过零信号拖得太慢。
2.3 比较器输入的滤波与限幅
比较器输入端的信号处理,直接决定了过零检测的稳定性。三相绕组上的反电动势不是干净的梯形波,除了PWM斩波成分,还有换相瞬间的尖峰,这些尖峰幅度可能达到母线电压的两倍。如果不处理,比较器输入直接被打穿,或者产生一堆误触发的中断。
我的做法是分两级处理:第一级在分压电阻后面加RC低通滤波,时间常数取5~10微秒,根据PWM周期调整;第二级在比较器输入端加钳位二极管,把电压限制在比较器供电范围内。陶瓷电容要靠近比较器引脚摆放,走线尽量短粗,避免形成天线。
另外要特别注意比较器的滞回设计。理想情况下过零是一个瞬间事件,但实际上由于噪声和相电流换向的拖尾,比较器输出可能在过零点附近来回抖动。加一点滞回(比如10~20mV),能把这种抖动过滤掉。滞回太大也不行,会影响过零检测的精度,这个需要用示波器实测来标定。
3. 软件实现与精准换相:从底层逻辑到工程落地
3.1 PWM策略选择与采样窗口
无感无刷驱动的PWM调制策略有好几种:H_PWM-L_ON(上桥斩波、下桥常通)、H_ON-L_PWM(上桥常通、下桥斩波)、以及H_PWM-L_PWM(上下桥都斩波)。我习惯用H_PWM-L_ON,原因很简单:在反电动势检测窗口内,下桥常通可以提供稳定的电流续流路径,上桥斩波时悬浮相的电压更容易预测。
PWM频率的选择也很有讲究。常规低压电机驱动,PWM频率选在15kHz到20kHz之间,避开了音频范围,人对这个频段的噪音不敏感。频率太低会有啸叫,太高开关损耗增大、MCU中断压力大。我用得比较多的是16kHz,兼顾噪声和损耗。
采样窗口是软件设计中最关键的时序约束。在H_PWM-L_ON策略下,上桥导通时采样悬浮相反电动势,得到的是母线电压叠加反电动势的结果;上桥关闭时采样,得到的是续流二极管压降叠加反电动势的结果。只有在上桥关闭、下桥续流的窗口内,采样到的信号才真正反映反电动势。所以ADC触发必须同步到PWM周期内上桥关闭的区间,这个窗口时间至少要留出5微秒,要给ADC采样保持、滤波稳定留足余量。
3.2 六步换相表与换相时刻计算
六步换相法虽然名字听起来老派,但至今仍是无感方波驱动的主流控制方式。整个换相逻辑是一张固定真值表:六个扇区,每个扇区对应一组上下桥的组合状态,每60度电角度切换一次。比如扇区0导通A+B-,扇区1导通A+C-,以此类推。
软件实现时,这张表可以用一个数组存起来,索引就是当前扇区号。关键的计算逻辑是:检测到过零中断后,先记录当前定时器计数值,然后启动一个延迟定时器,到提前算好的换相时刻执行换相。
换相时刻的计算公式是这样推导的:假设相邻两次过零的时间间隔是T_zc,那么一个电周期是2倍T_zc,60度电角度对应的时间是T_zc/3。30度电角度就是T_zc/6。所以延迟时间的计算极简单:
T_commutate = T_zc / 6但实操中这个公式有个前提:两次过零间隔必须稳定。如果转速刚发生变化,前一次过零间隔和后一次不一致,延时就可能偏。更稳妥的做法是用最近两次过零间隔做一阶低通滤波,消除瞬时波动,再除以6作为延迟时间。
延迟时间算好之后,要考虑到MCU中断响应和PWM周期对齐。我建议延迟到下一个PWM周期的固定相点执行换相,而不是立即执行。这样可以保证每次换相都在相同的PWM相位上,电流波形的对称性会好很多,力矩脉动明显变小。
3.3 启动流程:开环强拖到闭环的无缝切换
无感无刷的启动一直是被问得最多的问题。电机静止时没有反电动势,检测不到转子位置,所以必须用“开环强拖”的方式转起来。强拖的思路是:不管转子现在在哪,直接施加一个预设的换相序列,让定子磁场带着转子跑。
强拖参数有三个:初始占空比、强拖频率(换相频率)、加速度。初始占空比不能太大,否则电流冲击过大,电机抖动甚至反转;也不能太小,否则力矩不足转不起来。更稳妥的做法是:先让某两相通电一段时间,让转子被动对齐到已知位置,再从这一位置开始强拖。这叫定位对齐,虽然耽误几十毫秒,但能显著提高启动成功率。
强拖到一定转速后,反电动势的幅值足够让过零检测可靠工作了,就得从开环切到闭环。怎么判断“足够”?两个条件:一是当前转速超过预设阈值,比如额定转速的10%;二是连续N次过零检测结果和换相序列相位一致,误差在允许范围内。两个条件同时满足,才执行切换。
切换动作要平滑,否则容易出现电流跳变。我常用的做法是:在检测到转速达标后,先让开环换相继续进行,但每次换相后强制等待一次过零中断,用中断来校准下一次换相时刻。如果连续几次校准误差都小于阈值,就把换相控制权完全交给过零检测,完成闭环切换。整个切换过程不超过一个电周期。
3.4 反电动势检测的软件滤波与去抖
比较器方案的过零中断信号,在实际运行中不会那么理想。电磁干扰、换相尖峰、电机本身的反电动势谐波,都会在过零附近产生额外的脉冲。如果这些毛刺触发了中断,软件就被带偏了。
我的去抖策略分三层:第一层是硬件,前面说的RC滤波和滞回比较器,已经挡掉大部分高频毛刺;第二层是在中断里加最小间隔判断,如果距上次有效过零的时间小于某个阈值(比如电周期的1/20),判定为毛刺,忽略;第三层是滑窗确认,连续两次有效过零的时间间隔和当前估算周期的偏差超过30%,就认为检测异常,进入失步保护流程。
中间还有一个小细节:三相过零检测是独立的中断源,分别对应A、B、C三相。软件里要维护一个过零状态机,记录当前扇区、上一组过零的相序。如果检测到相序跳跃(比如上一次是A相过零,这次直接来了C相),说明发生了换相错误或信号污染,同样要进入异常处理。
4. 常见问题与排查技巧实录
4.1 启动失败:转子抖一下就不转
这个问题十有八九出在强拖参数不匹配。转子能抖一下,说明电机的确有反应了,但力矩不够或者换相时序不对,无法持续拖动。
先检查定位对齐时间。有些工程为了省时间,把对齐时间砍到20ms以内,结果转子根本没稳定到设定位置就开始强拖。定位时间建议至少50ms,电机惯性大的还要加长。再检查初始占空比,找一个大致的经验值:额定电压12V的电机,初始占空比10%左右;24V系统,5%左右。这个值以电机刚好能平稳转起来、不抖动为准。
如果定位没问题、初始占空比也合适,还是启动失败,就要查强拖加速度。加速度太大,换相频率增长过快,转子跟不上,就会失步。经验做法是把加速度放慢到电机能跟随的情况下,再逐步加快到目标值。一个简单的判断标准:启动过程中,如果电流一直处于限幅状态,说明加速度太大,转子跟不上磁场转速。
4.2 高速切闭环失败或切换瞬间电流尖峰
开关环切换是另一个重灾区。现象通常是:强拖阶段电机转得挺好,一切闭环就电流飙高,甚至直接过流保护。
排查顺序先去查转速阈值设置。如果闭合条件设置得太低,反电动势幅值不够,过零检测本身就不可靠,一切换就翻车。把切换阈值提高到额定转速的15%~20%,试一下是否改善。
再查切换时的相位校准。强拖的换相序列和反电动势的过零事件之间存在固定相位差,如果强拖频率设定略高于实际转速,换相会一直偏早或偏晚。切换瞬间,控制权交给过零检测,相位突然校正,就会出现电流冲击。解决的办法是在强拖阶段就不断用检测到的过零事件去修正强拖的换相频率,让开环和闭环的相位差逐步缩小,再做切换。
4.3 低速抖动、高速正常
低速抖动的问题根源还是反电动势信号弱。转速低,反电动势幅值就低,信噪比差,过零检测不稳定。看波形时会发现,低速时比较器输出脉冲忽宽忽窄,甚至缺脉冲。
解决思路有三条:一是提高比较器的增益,让弱信号也能产生可靠翻转;二是在软件中放宽过零间隔的容差范围,承认低速时波动大是正常的;三是在PWM策略上做调整,低速时降低调制深度,提高采样窗口信号质量。
还有一个容易忽略的点:低速段的电流波形本身就不对称,里面有大量的谐波,这些谐波会污染反电动势信号。如果电机负载是风扇之类的轻负载,可以在软件里做一次带通滤波,只保留基波成分过零信息;如果重负载,建议直接提高最低闭环转速,让电机快速通过低速区。
4.4 失步和堵转的检测与恢复
无感方案最怕的事情就是突然堵转。没有霍尔传感器,堵转初期反电动势依然存在,过零检测可能还在工作,但电机已经不出力了。如果不加保护,堵转时间稍长,电机绕组就会过热烧毁。
堵转检测最常用的是电流检测:电机在正常运行时,相电流的波动和换相频率对应;堵转时电流会瞬间升高并持续在高位。软件里实时计算平均电流,连续一段时间超过限幅值,就判断为堵转,立即关闭PWM输出。
更高级的做法是检测过零间隔的异常变化。正常运行时,连续过零间隔的变化是平缓的;堵转时转子不动,反电动势消失,过零事件会突然丢失或者间隔突然拉长。软件里维护一个“丢过零计数”,连续丢失若干个过零事件后,直接进入停机保护流程。这种保护和电流检测互补,电流检测能快速发现硬堵转,过零丢失检测能发现软堵转和失步。
4.5 调试工具和现场经验
调试无感无刷驱动,我的必备工具是三样:双通道示波器、电流探头、LCD逻辑分析仪。示波器看相电压波形和比较器输出,电流探头看相电流换相是否平滑,逻辑分析仪看MCU内部的换相时序和过零中断的对齐关系。
调试时有一个过程非常管用:在软件里加入一个“测试模式”,把当前扇区号和过零状态机通过一个GPIO输出,用逻辑分析仪抓取。把GPIO的波形和比较器的输出波形放在同一时间轴上对比,就能非常直观地看到过零事件、延迟时间、换相动作三者之间的关系。这套方法能帮你快速定位问题是出在硬件信号上还是软件时序上。
5. 实操心得与几个值得探索的方向
做了几年无感无刷驱动,最深的体会是:这个领域真正的门槛不在理论推导,而在工程细节的取舍。反电动势检测的原理书上都写了,但实际调试中的噪声、延时、相位误差才是真正磨练人的地方。
一个实用的建议:不要一上来追求最高效率、最优性能,先跑通基础流程,再逐步优化。先把开环强拖、过零检测、闭环切换三个环节做到能长时间稳定运行,后面的效率优化和波形优化都是锦上添花。
几个我认为值得继续探索的方向:一是无感方波控制向无感FOC(磁场定向控制)的迁移,FOC的力矩控制更平滑、效率更高,但对MCU算力和电流采样要求更高;二是把滑模观测器或扩展卡尔曼滤波引入转子位置估算,替代简单的反电动势过零法,在低速和带载启动时优势明显;三是自适应参数调整,根据电机温度和母线电压变化实时调整换相提前角,把驱动效率维持在最优点。
如果你正在做无感无刷驱动,建议从一台小功率电机、一个STM32或GD32开发板、一套比较器采样电路起步,按本文的顺序把每个环节调通。前期可能会被启动失败和噪声干扰搞得焦头烂额,但只要先把示波器上的时序对齐了,后面会顺很多。