3、方波驱动实现:反电动势检测与无传感器启动策略
好,咱们接着聊方波驱动。上一章讲了六步换向的基本原理,说白了就是按照固定的顺序给三相通电,让转子转起来。但有个问题——你怎么知道什么时候该换向?
有传感器的方案当然简单,霍尔一装,位置信号直接读。但很多场合,比如压缩机、风机,空间有限,成本敏感,多一根线都是罪过。这时候就得靠无传感器方案了。
无传感器方波驱动,核心就两个问题:怎么检测反电动势?怎么从静止启动?今天我把这两块掰开了讲。
3.1 反电动势检测原理
先说说反电动势是什么。电机转起来以后,转子上的永磁体切割定子线圈,会产生一个电压。这个电压和转速成正比,和电流方向相反——所以叫反电动势。
你想想看,电机不转的时候,反电动势为零。转得越快,反电动势越高。这个电压信号里,藏着转子位置的信息。
关键点:反电动势的过零点,正好对应换向时刻。
具体来说,对于方波驱动的BLDC,每一相的反电动势波形是一个梯形波。梯形波的平顶部分,就是该相导通的时间。而梯形波的上升沿和下降沿的中点,就是过零点。
我刚开始做这个的时候,总想着直接测反电动势的幅值。后来发现不对——反电动势的幅值随转速变化,不好用。真正有用的,是过零点。
3.2 反电动势检测电路
检测反电动势,不能直接接在电机端子上。因为端子上的电压是PWM斩波后的高压,反电动势信号被淹没了。得用分压电阻和比较器,把信号提取出来。
常用的电路是这样的:
电机三相端子 → 分压电阻网络 → 低通滤波 → 比较器 → MCU的GPIO
分压电阻把高压降到3.3V或5V,低通滤波把PWM的高频分量滤掉,剩下反电动势的基波。比较器把反电动势和虚拟中点电压比较,输出过零信号。
这里有个坑——虚拟中点怎么来?
最简单的办法,用三个等值电阻接成星形,接到电机三相上。这个星形中点就是虚拟中点。但要注意,电阻值不能太小,否则发热严重。我一般选100kΩ左右,功耗可以接受。
我的经验:低通滤波的截止频率要选好。太低了,信号延迟大,换向滞后;太高了,PWM噪声滤不干净。我一般取PWM频率的1/10到1/20,比如20kHz的PWM,滤波截止频率设在1-2kHz。
3.3 过零点检测与换向时机
检测到过零点之后,是不是马上换向?
不是。过零点之后,还要等30度电角度,才是真正的换向点。为什么?因为反电动势的过零点对应的是梯形波的上升沿中点,而换向点对应的是梯形波的平顶结束位置。两者相差30度。
这30度怎么等?有两种方法:
- 定时器法:记录上一次换向到过零点的时间,乘以一个系数,得到30度对应的时间。
- 相位锁相法:用PLL跟踪反电动势的相位,直接输出换向信号。
我个人习惯用定时器法,简单可靠。代码大概这样:
// 过零点中断服务函数
void BEMF_ZC_IRQHandler(void) {
uint32_t current_time = TIM_GetCounter();
uint32_t period = current_time - last_zc_time;
last_zc_time = current_time;
// 30度电角度对应的时间 = 周期 / 6
uint32_t delay_30deg = period / 6;
// 启动定时器,延迟后换向
TIM_SetCounter(commutation_timer, 0);
TIM_SetAutoreload(commutation_timer, delay_30deg);
TIM_Cmd(commutation_timer, ENABLE);
}
注意,这个延迟时间不是固定的。转速变化时,周期会变,延迟也要跟着变。所以每次过零点都要重新计算。
我曾经踩过的坑:电机刚启动时,反电动势信号很弱,过零点检测不稳定。这时候如果直接用定时器法,换向时机可能乱掉。我的做法是:在低速段用强制换向,等转速上来了再切换到反电动势检测。
3.4 无传感器启动策略
好,现在到了最头疼的部分——启动。
电机静止时,反电动势为零。你没法检测过零点。所以无传感器启动,必须用一套特殊的策略。
常用的启动方法有三种:
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 三段式启动 | 预定位→强制加速→切换 | 简单可靠 | 低速段有抖动 |
| 升频升压法 | 逐步提高频率和电压 | 平滑启动 | 参数整定麻烦 |
| 电感检测法 | 检测定子电感变化 | 可定位静止位置 | 需要额外硬件 |
我用的最多的是三段式启动。说白了就是三步走:
第一步:预定位
给任意两相通电,让转子转到已知位置。比如给A+B-通电,转子会转到对应的位置。这一步不需要检测任何信号,就是硬拉。
注意,预定位的电流不能太小,否则拉不动。也不能太大,否则转子会过冲。我一般设额定电流的30%-50%,持续100-200ms。
第二步:强制加速
转子定位好后,按照固定的换向频率,强制换向。这时候没有反电动势反馈,属于开环运行。
强制加速的关键是换向频率的上升率。升得太快,转子跟不上,会失步。升得太慢,启动时间太长。
我的经验是:从5Hz开始,每秒增加2-3Hz。同时电压也要跟着升,保持电压/频率比恒定。这样转矩输出比较平稳。
第三步:切换
当转速达到一定值(比如500-1000RPM),反电动势信号足够强了,就可以切换到反电动势检测模式。
切换的时机很重要。太早切换,反电动势信号弱,容易误判。太晚切换,开环运行时间太长,效率低。
我一般设两个条件:
- 转速达到设定值(比如800RPM)
- 连续检测到3个以上有效的过零点信号
两个条件都满足,才切换。
切换时的平滑过渡:从开环到闭环,换向频率可能会有跳变。我的做法是:在切换后的前几个换向周期,用开环和闭环的加权平均值作为实际换向频率。比如第一个周期,开环占80%,闭环占20%;第二个周期各50%;第三个周期闭环占80%。这样过渡很平滑。
3.5 启动失败的常见原因
做无传感器启动,失败是家常便饭。我总结了几种常见情况:
- 预定位电流不够:转子没拉到指定位置,后续强制加速时方向就偏了。
- 强制加速太快:转子失步,表现为电机嗡嗡响但不转,或者反转。
- 切换时机太早:反电动势信号弱,过零点误触发,换向乱掉。
- 负载变化大:空载能启动,带负载就启动不了。这种情况要增加预定位电流和强制加速的转矩。
我曾经遇到一个项目,风机启动时总是失败。查了好久,发现是风叶在静止时位置随机,有时候正好卡在死区。后来我在预定位之前,先给一个短脉冲让转子微微动一下,再定位。问题就解决了。
3.6 实际调试建议
最后,给几个调试时的实用建议:
- 先用示波器看反电动势波形。把电机拖到一定转速,看三相的反电动势是不是对称的梯形波。不对称的话,检查电路或电机本身。
- 过零点信号要加滤波。比较器输出的过零点信号,可能会有毛刺。加一个10-100μs的软件去抖,能避免误触发。
- 启动参数要留余量。强制加速的频率上升率,设成理论值的70%-80%。这样即使负载有波动,也能启动成功。
- 记录启动失败日志。把启动过程中的换向频率、电流、过零点状态都记录下来。失败时分析日志,能快速定位问题。
嗯,反电动势检测和无传感器启动,就讲到这里。说白了,无传感器方波驱动就是跟反电动势信号打交道。信号处理好了,启动就顺了。下一章咱们聊聊方波驱动的电流控制和转矩脉动抑制,那又是另一番天地。