这一章在干嘛?

霍尔在高温/振动/潮湿环境不可靠还占空间。无感方案用 反电动势过零检测 代替霍尔:浮空相反电动势过零点超前换相点 30°,检测到就延迟 30° 换相。静止时没有反电动势,所以还要一套「三段式启动」。

25.1 反电动势法原理

25.2 过零检测:虚拟中性点 + 比较器

25.3 三段式启动

25.4 过零软件滤波与延迟换相

25.1 反电动势法原理

三相 120° 通电方式下任意时刻两相通电、一相浮空。浮空相的端电压反映它的反电动势(BEMF,梯形波):

原书图 25.1.1.1 原书图 25.1.1.1:电流和反电动势波形:过零点位于两个换相点正中间

关键几何关系:

每个换相点间隔 60° 电角度, 过零点恰在两个换相点正中间 ——即超前换相点 30°。检测到过零后延迟 30° 换相,转子磁场永远被「追着」牵引。

无感检测方法还有反电动势积分法、续流二极管法、三次谐波法、扩展卡尔曼滤波、状态观测器等,反电动势过零检测最成熟。

25.2 过零检测:虚拟中性点 + 比较器

Y 形绕组没有中性点引出线,就用三个等值电阻构造「虚拟中性点」;驱动板上的比较器(U8B)把浮空相端电压与虚拟中性点电压比较,端电压穿越中性点电压的时刻就是过零点,输出 ZERO_U/V/W 三路过零信号。

原书图 25.1.3.2 原书图 25.1.3.2:实际过零信号原理图:比较器输出 ZERO_U/V/W

三相过零信号(正→负、负→正)共 6 种组合,与 6 种导通状态一一对应且固定,写入正/反转两张真值表——检测到过零组合变化,查表就知道下一步该导通哪两相。

25.3 三段式启动

反电动势幅值与转速成正比——静止和低速时根本检测不到过零信号,必须先「盲走」:

原书图 25.1.5.3.1 原书图 25.1.5.3.1:无感驱动的整体框图

阶段做法关键参数
① 转子预定位任给一组固定通电(U+V−)强行吸住转子占空比 MAX_PWM_DUTY/20,初始延迟 1100×55µs
② 外同步加速强制换相并逐步升频升压(vvvf 法)Freq_T_Ref -= Freq_T_Ref/15+1,下限 180
③ 状态切换检测到稳定过零信号后切入闭环count_i ≥ 4(约转 2 圈)才认为稳定
/* 三段式启动状态机:定位 -> 升频升压加速 -> 过零闭环 */
case 0:    /* 定位:固定一相 */
    vvvf_sp.Voilage_Ref = (uint16_t)(MAX_PWM_DUTY / 20);
    g_bldc_motor1.pwm_duty = vvvf_sp.Voilage_Ref;
    m1_uhvl();                        /* U+V- 通电预定位 */
    vvvf_sp.Freq_T_Ref = 1100;        /* 初始换相延迟 55*1100us */
    g_zero_ctr_status = 1;
    break;
case 2:    /* 加速换相(提高换向频率) */
    vvvf_sp.Freq_T_Ref -= vvvf_sp.Freq_T_Ref / 15 + 1;  /* 递减延迟=升频 */
    change_voltage();                 /* 同步升压 */
    if (vvvf_sp.Freq_T_Ref < 180)     /* 频率下限 */
        vvvf_sp.Freq_T_Ref = 180;
    anwerfen_sw();                    /* 按序换相 */
    break;
case 3:
    hallless_sw();                    /* 切换至闭环过零检测 */
    break;

盲区警告:

加速与切换阶段转子位置「不可见」,参数不合理会电流不稳或抖动。占空比与加速斜率要根据电机和负载调试。

25.4 过零软件滤波与延迟换相

过零信号先过一道软件滤波(移位队列 + 掩码):连续多次相同电平才承认,消除换相尖峰的干扰:

hallless_three.Queue_Status[0] = hallless_three.Queue_Status[0] << 1;
hallless_three.Queue_Status[0] |= HAL_GPIO_ReadPin(HALL1_TIM_CH1_GPIO,
                                HALL1_TIM_CH1_PIN);      /* U 相过零点 */
hallless_three.Filter_Math = hallless_three.Queue_Status[0] & FILTER_LONG;
if (hallless_three.Filter_Math == FILTER_LONG)
    hallless_three.QFilter_Status[0] = 1;                /* 连续为 1 判高 */
else if (hallless_three.Filter_Math == 0x00)
    hallless_three.QFilter_Status[0] = 0;                /* 连续为 0 判低 */
else { hallless_three.Filter_Count++; return 0; }        /* 跳变期不处理 */

延迟 30° 怎么算? 未来测不到,但上一个换相周期(60° 电角度)可测,取一半近似:代码实现为 Filter_Delay = count_j / 6。由于硬件低通滤波与软件延迟的叠加,实际延迟角要小于 30°,可用示波器经 PE1 观察校准。

if (hallless_three.Hallless_State != hallless_three.OldHallless_State)
    hallless_three.Filter_Count_All++;                   /* 开始过零计时 */
if (hallless_three.Filter_Count_All >= hallless_three.Filter_Delay)
{                                                        /* 30° 延迟到 */
    hallless_three.Filter_Count_All = 0;
    if (hallless_three.Hallless_State != hallless_three.OldHallless_State)
    {
        if (g_bldc_motor1.dir == CCW) g_bldc_motor1.pos--;
        else                          g_bldc_motor1.pos++;
        pfunclist_m1[hallless_three.Hallless_State - 1]();  /* 查表换相 */
    }
    hallless_three.OldHallless_State = hallless_three.Hallless_State;
}

实验:JP3 跳线帽必须接 H&Z 与 ZERO(不是 HALL);按键 KEY0 正转、KEY1 反转、KEY2 停止。现象:KEY0 后电机经短暂定位-加速后平稳正转。