测速与有感类似,用过零信号代替霍尔信号——两者波形一致:1 对极电机转一圈每相出现 2 次过零点,统计其中一相过零信号高电平持续时间即可求速(速度 = SPEED_COEFF/count_j,一阶滤波 0.2379)。但只有过零信号稳定(count_i ≥ 4)后才测速,且只有 g_zero_ctr_status == 3(切入过零闭环)后速度环 PID 才投入:
/* 55us 中断:过零控制 + 速度环 PID(仅闭环状态 3 才投入) */
#ifdef H_PWM_L_ON
zero_ctr_loop(); /* 三段式启动/换相 */
if (g_bldc_motor1.run_flag == RUN && g_zero_ctr_status == 3)
{ /* 已进入过零闭环才闭环调速 */
temp_pwm1 = increment_pid_ctrl(&g_speed_pid, g_bldc_motor1.speed);
FirstOrderRC_LPF(motor_pwm_s, temp_pwm1, 0.085);
if (motor_pwm_s < 0) { /* 最低输出保底 ±600 */
if (motor_pwm_s >= -600) motor_pwm_s = -600;
g_bldc_motor1.pwm_duty = -motor_pwm_s;
} else {
if (motor_pwm_s <= 600) motor_pwm_s = 600;
g_bldc_motor1.pwm_duty = motor_pwm_s;
}
}
#endif速度环参数 KP=0.05000、KI=0.00025、KD=0.000150,采样 40ms。目标速度 ±3200RPM,步进 400。
双闭环:速度环 3 次计算一次(pid_s_count>2)、电流环 2 次一次(pid_c_count>1)分频执行;电流环参数同第 24 章(KP=2.00、KI=0.20、KD=0.01),母线电流尖峰(大于设定值 −20)连续 4 次以上才滤除影响;两环输出取小者 + 积分接力。
/* 堵转 2s 后重启:重新初始化 PID 并回到定位状态 */
if (g_bldc_motor1.locked_rotor == 1) { /* 堵转 */
clc++;
if (clc > 50) { /* 50*40ms = 2s 后重启 */
clc = 0; pid_init(); stop_motor1();
g_speed_pid.SetPoint = 400.0; /* 400RPM 重新启动 */
g_bldc_motor1.dir = CW;
g_bldc_motor1.pwm_duty = 600; /* 加速启动占空比 */
g_bldc_motor1.run_flag = RUN; start_motor1();
g_bldc_motor1.locked_rotor = 0;
g_zero_ctr_status = 0; /* 重新定位初始位置 */
}
}硬件与第 25 章一致(JP3 接 H&Z 与 ZERO;ADC 五通道采集同第 23 章)。按键:KEY0 目标 +400RPM(上限 3200)、KEY1 −400RPM、KEY2 停机并清 PID;速度过 0 换向时自动重启三段式流程并复位 PID。

