这一章在干嘛?
在六步换相之上装 PID:先用霍尔信号测速做 速度单闭环 ,再叠加电流环做 双闭环 ——占空比取两环输出的较小者,这才是工业里「稳得住、限得住」的玩法。
24.1 霍尔测速原理
1 对极转子转一圈,每个霍尔输出 1 个完整脉冲(N 极靠近输出 1、S 极输出 0)。统计高电平持续时间就能算转速:
原书图 24.1.1.1:无刷电机与霍尔位置示意图
原书图 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:速度 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:双闭环 PID 调节效果:紫线为实际母线电流
双环实验要点:
上限 3000RPM;手动加载后电流在目标值附近波动、速度被拉回——紫线(实际电流)不贴着粉线(目标电流)属正常,因为输出取小逻辑下电流环只在「电流超限」时才接管。
1. 2 对极无刷电机如何由霍尔计数求 RPM?
统计 180°/360° 电角度对应的计数值 C,按 (2 对极)计算;例程在 18kHz 中断里用 SPEED_COEFF/count_j 求速并一阶滤波。
2. 速度单环与速度+电流双环的输出如何取舍?
比较两环 PID 输出取较小者作占空比(等效限流),同时做积分接力(Ui 同号传递),防止超调与积分饱和。
3. 换向尖峰为何要滤波?
换相瞬间母线电流出现尖峰,直接进电流环会导致误调节;代码在尖峰超阈值时连续计数 4 次以上才采信,滤波越多越稳定但响应越慢。