ARTICLE DETAIL

资讯详情

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

无感BLDC反电动势检测实战:从比较器电路到三段式启动

无感BLDC反电动势检测实战:从比较器电路到三段式启动 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。但电气周期不是固定值转速一变周期就变。假设当前电气频率是fHz那么延迟时间就是 1/(12f) 秒。如果是极对数为p的电机机械转速nRPM和电气频率的关系是 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资源分配与接线我用的是STM32F103C8T672MHz主频资源完全够。三相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你都会感谢这段打基础的日子。
返回列表