这一章在干嘛?

在六步换相之上装 PID:先用霍尔信号测速做 速度单闭环 ,再叠加电流环做 双闭环 ——占空比取两环输出的较小者,这才是工业里「稳得住、限得住」的玩法。

24.1 霍尔测速原理

24.2 速度单闭环

24.3 速度 & 电流双闭环

24.1 霍尔测速原理

1 对极转子转一圈,每个霍尔输出 1 个完整脉冲(N 极靠近输出 1、S 极输出 0)。统计高电平持续时间就能算转速:

原书图 24.1.1.1 原书图 24.1.1.1:无刷电机与霍尔位置示意图

原书图 24.1.1.2 原书图 24.1.1.2:霍尔输出波形示意图

本教程电机是 2 对极:高低电平各持续 360° 电角度,一圈 4 次跳变,故 。程序在 18kHz(55µs)的定时器中断里累计跳变间隔计数 count_j,速度 = SPEED_COEFF / count_j,再经一阶低通滤波(系数 0.2379)。

24.2 速度单闭环

速度环参数 KP=0.00800、KI=0.00025、KD=0.00020,采样周期 40ms,积分/输出限幅 ±4000;PID 输出再低通滤波(0.085)后取绝对值作占空比,符号决定方向。

/* 55us 定时器中断:霍尔测速 + 不换相超时保护 */
g_bldc_motor1.count_j++;                          /* 18K 计数即霍尔脉冲频率 */
g_bldc_motor1.hall_sta_edge = uemf_edge(g_bldc_motor1.hall_single_sta);
if (g_bldc_motor1.hall_sta_edge == 0) {           /* 霍尔跳变:算速 */
    if (g_bldc_motor1.dir == CW)
        temp_speed =  (SPEED_COEFF / g_bldc_motor1.count_j);
    else
        temp_speed = -(SPEED_COEFF / g_bldc_motor1.count_j);
    FirstOrderRC_LPF(g_bldc_motor1.speed, temp_speed, 0.2379f);
    g_bldc_motor1.count_j = 0;
}
if (g_bldc_motor1.hall_sta_edge == 2) {           /* 霍尔一直不变=未换向 */
    g_bldc_motor1.no_single++;
    if (g_bldc_motor1.no_single > 15000) {        /* 超时判定 */
        g_bldc_motor1.no_single = 0;
        g_bldc_motor1.speed = 0;
    }
}

原书图 24.1.4.1 原书图 24.1.4.1:速度 PID 调节效果:橙线目标,红线实际逐渐跟随

按键:KEY0 目标速度 +400RPM(上限 4000),KEY1 −400RPM(正负定转向),KEY2 停机。现象:橙线先变,红线逐渐逼近——与直流有刷速度环如出一辙。

24.3 速度 & 电流双闭环

电流环反馈用母线电流(第 23 章:两个导通相电流之和)。电流环参数 KP=2.00、KI=0.20、KD=0.01。两个关键机制:

  • 换相尖峰滤除: 换相瞬间母线电流出现尖峰,不能让它触发 PID——尖峰超过「设定值 − 20」时连续计数 4 次以上才采信;
  • 双环取小: 速度环与电流环各算各的,最终占空比取两者较小值(等效于限流),并做积分接力(Ui 同号传递)防止积分失控。
if (motor_pwm_c > motor_pwm_sl) {      /* 电流环输出大 -> 用速度环输出 */
    g_bldc_motor1.pwm_duty = motor_pwm_sl;
    if (motor_pwm_s < 0) g_current_pid.Ui = -g_speed_pid.Ui;  /* 积分接力 */
    else                 g_current_pid.Ui =  g_speed_pid.Ui;
} else {                               /* 否则用电流环输出 */
    g_bldc_motor1.pwm_duty = motor_pwm_c;
    if (motor_pwm_s < 0) g_speed_pid.Ui = -g_current_pid.Ui;
    else                 g_speed_pid.Ui =  g_current_pid.Ui;
}

原书图 24.2.3.1 原书图 24.2.3.1:双闭环 PID 调节效果:紫线为实际母线电流

双环实验要点:

上限 3000RPM;手动加载后电流在目标值附近波动、速度被拉回——紫线(实际电流)不贴着粉线(目标电流)属正常,因为输出取小逻辑下电流环只在「电流超限」时才接管。