该模型在额定以下采用MTPA控制,速度环输出给定电流,然后代入MTPA得到dq电流,电压反馈环输出超前角进行弱磁。 PI控制采用抗积分饱和,SVPWM考虑过调制情况,附带参考文献
电机控制这玩意儿挺有意思的,特别是涉及到MTPA和弱磁这种组合拳。咱们先拆解下这个架构——速度环给电流指令,MTPA算dq轴分量,电压不够了就启动弱磁。这中间PI控制要防积分饱和,SVPWM还得处理过调制,全是硬核知识点。
先说说MTPA的实现。假设现在有个永磁同步电机,当转速低于额定值时,系统采用最大转矩电流比控制。代码里通常会存着个二维查表,根据当前转矩需求匹配最优的id/iq组合:
void MTPA_Lookup(float torque_cmd, float* id_ref, float* iq_ref) { int index = (int)(torque_cmd / TORQUE_STEP); *id_ref = mtpa_table[index][0]; *iq_ref = mtpa_table[index][1]; }这表格可不是随便填的,得用离线参数辨识或者有限元分析算出来。有个坑是当温度变化导致磁链变化时,得做在线参数补偿,否则实际运行会偏离最优工作点。
速度环PI的输出作为电流给定这事要注意,这里有个防积分饱和的骚操作。常规PI容易在限幅时积分项溢出,咱们在代码里加个conditional update:
void PI_Controller_Update(PI_TypeDef* pi, float error) { float integral_temp = pi->integral + error * pi->Ki; if(!((pi->output >= pi->out_max && error > 0) || (pi->output <= pi->out_min && error < 0))) { pi->integral = integral_temp; } pi->output = pi->Kp * error + pi->integral; pi->output = clamp(pi->output, pi->out_min, pi->out_max); }这个判断条件贼关键——只有输出未达到限幅值时才更新积分项,或者虽然达到限幅但误差方向与限幅方向相反时才允许积分回退。实测这个逻辑能有效避免转速超调时积分项持续累积。
该模型在额定以下采用MTPA控制,速度环输出给定电流,然后代入MTPA得到dq电流,电压反馈环输出超前角进行弱磁。 PI控制采用抗积分饱和,SVPWM考虑过调制情况,附带参考文献
弱磁控制这块,电压环输出的超前角补偿得讲究。当直流母线电压吃紧时,要根据电压极限圆调整电流相位:
def field_weakening(vdc, vd, vq): vmax = vdc * 0.57735 # 考虑SVPWM最大线性调制 v_mag = math.sqrt(vd**2 + vq**2) if v_mag > vmax: delta_theta = math.atan2(vq, vd) - math.atan2(vq_ref, vd_ref) return delta_theta * 0.5 # 系数需要根据电机参数调整 return 0这里0.57735是SVPWM在常规调制区的最大电压利用率(√3/3)。实际工程中还要考虑磁链变化率,防止角度突变导致转矩抖动。
说到SVPWM的过调制处理,当调制比超过1时,传统的七段式波形会畸变。有个实用方法是调整矢量作用时间:
void SVPWM_OverModulation(float* t1, float* t2, float* t0) { float Ts = *t1 + *t2 + *t0; if(Ts > PWM_PERIOD) { float ratio = PWM_PERIOD / Ts; *t1 *= ratio; *t2 *= ratio; *t0 = 0; } // 后续处理五段式波形生成... }这个比例缩放在过调制区能保证电压矢量方向不变,但幅值被钳位。实际测试时要注意死区时间补偿,否则高调制比下波形畸变更严重。
参考文献里[1]提出的变参数PI在弱磁区特别好用,[2]的过调制算法能让电压利用率提升15%左右。不过具体参数还是得在电机台架上调,毕竟理论计算和实际工况总有偏差。玩电机控制就像做菜,菜谱(算法)是基础,火候(参数整定)才是真功夫。