FOC算法调试:永磁同步电机(PMSM)控制中,电流环与速度环的PI参数自整定方法
扫描二维码
随时随地手机看文章
在永磁同步电机(PMSM)的磁场定向控制(FOC)中,电流环和速度环的PI参数决定了系统的动态响应和抗扰动能力。传统“凑试法”依赖工程师经验,效率低且难以适配不同功率等级的电机。本文将介绍一种基于继电反馈法(Relay Feedback)和频率响应分析的参数自整定方法,可在电机运行时自动完成调节器参数整定。
一、自整定的核心原理
自整定的核心思想是先辨识电机模型参数,再基于模型计算PI参数。对于电流环,目标是让d/q轴电流快速跟踪给定值;对于速度环,则是抑制负载扰动。
我们采用改进的继电反馈法:通过在控制器中注入特定频率的激励信号,测量系统的临界增益(K_u)和临界振荡周期(T_u),然后套用Ziegler-Nichols或AMIGO(Approximate M-constrained Integral Gain Optimization)公式计算PI参数。
二、电流环PI参数自整定
电流环带宽通常要求较高(>1kHz),且Ld、Lq参数对性能影响巨大。
2.1 离线参数辨识(电机静止时)
在电机上电静止状态下,注入高频脉冲电压,利用电压方程估算定子电阻和电感。
// 电流环参数自整定结构体
typedef struct {
float Rs; // 定子电阻
float Ld; // d轴电感
float Lq; // q轴电感
float Ke; // 反电势系数
float J; // 转动惯量
} MotorParam_t;
// 注入高频脉冲测试定子电感 (简化示例)
// 施加固定电压V_test,测量di/dt
void IdentifyInductance(MotorParam_t* param, float v_test, float dt) {
// i_alpha = i_beta = 0 (静止)
// L = V_test * dt / (i_final - i_initial)
float di = motor.current_ia - motor.current_ia_last;
if (fabs(di) > 1e-3f) {
param->Ld = (v_test * dt) / di; // 假设Ld=Lq
param->Lq = param->Ld;
}
}
2.2 基于模型的PI参数计算
一旦获得L和R,即可计算电流环PI参数。对于i_d=0控制,q轴电流环的传递函数近似为一阶惯性环节。
// 计算电流环PI参数 (Kp, Ki)
// 目标:带宽fc = 1000Hz, 阻尼比zeta = 0.707
void CalculateCurrentPiParams(MotorParam_t* param, CurrentPi_t* pi, float bandwidth_hz) {
float L = param->Lq; // 使用q轴电感
float R = param->Rs;
// 1. 计算Kp:基于目标带宽
// Kp = L * 2 * PI * fc
pi->Kp = L * (2.0f * 3.14159f * bandwidth_hz);
// 2. 计算Ki:确保无静差,Ki = R/L * Kp_ratio
// 经典关系:Ki = R / L (积分时间常数 Ti = L/R)
// 但在数字控制中,Ki = Kp * (R/L) * Ts 需要调整
// 推荐:Ki = Kp / Ti, Ti = L / R
float Ti = L / R; // 电气时间常数
pi->Ki = pi->Kp / Ti;
// 抗积分饱和限幅
pi->integral_limit = 0.5f;
}
三、速度环PI参数自整定
速度环控制对象包含机械惯量J和摩擦转矩,且存在负载突变,整定难度更大。
3.1 基于临界比例度的整定(电机旋转时)
此方法不需要精确模型,通过闭环振荡来寻找临界点。
// 速度环继电反馈自整定
void SpeedLoopAutoTune(PidController* speed_pid) {
// 1. 切换到开环或恒转速模式
motor.mode = OPEN_LOOP_TUNE;
// 2. 注入继电非线性(方波)
// 设定一个小的速度参考,当误差>threshold时反转输出
float output = 0.0f;
float threshold = 5.0f; // RPM
int direction = 1;
// 运行一段时间,测量振荡周期
uint32_t start_tick = HAL_GetTick();
while (HAL_GetTick() - start_tick < 2000) { // 2秒测试
float speed_error = target_speed - motor.speed_fbk;
if (speed_error > threshold) direction = -1;
if (speed_error < -threshold) direction = 1;
output = direction * MAX_VOLTAGE;
SetMotorVoltage(output);
osDelay(1);
}
// 3. 计算临界参数 (假设测得)
// Ku: 产生等幅振荡时的增益
// Tu: 振荡周期
float Ku = 2.0f; // 示例值
float Tu = 0.05f; // 50ms 示例值
// 4. 应用Ziegler-Nichols公式 (PI控制器)
// Kp = 0.45 * Ku
// Ti = 0.833 * Tu
speed_pid->Kp = 0.45f * Ku;
speed_pid->Ki = speed_pid->Kp / (0.833f * Tu);
}
3.2 抗扰动优化
速度环PI参数通常需要更大的积分作用以消除静差,但容易引起超调。
// 速度环PI结构体(带抗积分饱和)
typedef struct {
float Kp;
float Ki;
float integral;
float integral_limit;
float output_limit;
} SpeedPi_t;
// 速度环更新(带Clamping限幅)
float SpeedPiUpdate(SpeedPi_t* pi, float error, float dt) {
// 比例项
float output = pi->Kp * error;
// 积分项(带限幅和抗饱和)
pi->integral += pi->Ki * error * dt;
// 积分限幅 (Clamping)
if (pi->integral > pi->integral_limit) {
pi->integral = pi->integral_limit;
} else if (pi->integral < -pi->integral_limit) {
pi->integral = -pi->integral_limit;
}
output += pi->integral;
// 输出限幅
if (output > pi->output_limit) output = pi->output_limit;
if (output < -pi->output_limit) output = -pi->output_limit;
return output;
}
四、工程实践中的注意事项
1. 顺序整定:必须先整定电流环,确保电流环响应足够快(至少是速度环带宽的5-10倍),然后再整定速度环。
2. 负载变化:自整定最好在空载下进行,但计算出的Ki值需要根据负载惯量进行调整。如果负载惯量大,应适当减小Ki以防止震荡。
3. 离散化处理:上述公式多为连续域,在MCU中需进行离散化(T_i = \frac{K_p}{K_i} 需乘以采样时间T_s)。
4. 安全保护:自整定过程中必须开启过流保护和过压保护,防止振荡导致硬件损坏。
结语
通过继电反馈法与模型参数计算的结合,我们可以为PMSM的FOC算法构建一套全自动的参数自整定系统。这不仅大幅降低了调试门槛,更重要的是,它使控制器能够根据电机参数的变化(如温升导致的电阻变化)在线调整PI参数,显著提升系统的鲁棒性和可靠性。





