4. MTPA控制策略:查表法MTPA、公式法MTPA、在线搜索法MTPA

好,咱们接着聊MTPA。前面几章把理论基础和数学模型都铺开了,这一章咱们直接落地——聊聊具体怎么实现MTPA控制。

说白了,MTPA的核心就一句话:在输出同样转矩的情况下,让电流最小。但怎么找到这个“最小电流点”,工程上有三条路可以走。我这些年三种方法都折腾过,各有各的脾气。

核心逻辑:MTPA的本质是求解一个带约束的优化问题——给定转矩指令Te*,找到最优的d、q轴电流组合(id, iq),使得定子电流幅值is = √(id² + iq²)最小。

MTPA 三大实现路径 MTPA 控制策略 查表法 MTPA 离线标定 + 线性插值 公式法 MTPA 解析计算 + 参数代入 在线搜索法 MTPA 实时扰动 + 梯度寻优 ✅ 实现简单,实时性好 ❌ 标定工作量大,参数漂移 ✅ 无存储需求,连续平滑 ❌ 依赖电机参数精度 ✅ 自适应,无需参数 ❌ 收敛慢,有转矩脉动 工程选型:量产车用查表法,高端伺服用公式法,科研样机用搜索法

4.1 查表法MTPA——最稳妥的工程方案

查表法,说白了就是“先算好,再查用”。在电机台架上,我们提前标定好不同转矩、不同转速下对应的最优id和iq,存成一张二维表。运行时,根据当前的转矩指令和转速,直接查表得到电流指令。

我个人习惯把查表法叫做“笨办法,但最靠谱”。为什么?因为电机参数会变,磁钢温度一高,Ld、Lq、ψf全在漂。但查表法标定的是“最终结果”——你不管参数怎么变,我标出来的电流组合就是最优的。

避坑指南:我曾经在量产项目上吃过亏——标定只做了25℃和80℃两个温度点。结果冬天零下20℃启动时,查表出来的电流组合完全不对,电机抖得像筛子。后来老老实实补了-20℃、0℃、25℃、60℃、100℃五个温度点的标定,才算搞定。

查表法的实现要点:

  • 标定维度:通常需要转矩Te和转速ωr两个维度,必要时增加温度维度
  • 插值方式:线性插值就够用,别整什么三次样条——MCU算力有限
  • 表的大小:我一般用16×16的网格,转矩和转速各16个点,总共256个表项
  • 存储位置:放在Flash里,运行时加载到RAM加速访问
// 查表法MTPA实现示例(伪代码)
// 假设转矩表 Te_table[16],转速表 speed_table[16]
// i_d_table[16][16] 和 i_q_table[16][16] 为标定数据

void mtpa_lookup(float Te_ref, float speed, float *id_ref, float *iq_ref) {
    // 1. 找到转矩索引
    int te_idx = find_index(Te_ref, Te_table, 16);
    // 2. 找到转速索引
    int spd_idx = find_index(speed, speed_table, 16);
    // 3. 双线性插值
    float id_val = bilinear_interp(te_idx, spd_idx, i_d_table);
    float iq_val = bilinear_interp(te_idx, spd_idx, i_q_table);
    // 4. 输出
    *id_ref = id_val;
    *iq_ref = iq_val;
}

注意:查表法最怕“表外操作”——转矩指令超出标定范围时,一定要做饱和处理,不能直接返回边界值。我见过一个案例,标定最大转矩100Nm,结果上位机给了个120Nm的指令,查表直接返回了100Nm对应的电流,导致转矩环积分饱和,电机过流保护。

4.2 公式法MTPA——理论派的优雅解法

公式法,就是直接用数学公式算出最优电流。你想想看,MTPA的本质是一个优化问题,那我们就用拉格朗日乘子法去解它。

推导过程我就不展开了(前面章节有),直接给结论:

对于内置式永磁同步电机(IPMSM),MTPA的解析解为:

i_d = -ψ_f / (2 * (L_d - L_q)) - √( ψ_f² / (4 * (L_d - L_q)²) + i_q² )

嗯,这个公式看着有点吓人。但实际用的时候,我们一般会做简化处理:

  • 方法一:直接代入Ld、Lq、ψf的标称值,实时计算
  • 方法二:用多项式拟合,比如 id = a·iq² + b·iq + c,系数离线算好
  • 方法三:查小表+公式修正——用少量标定点做基准,公式做微调

我个人更推荐方法二。为什么?因为直接代入公式计算,开根号、除法这些操作在定点MCU上很费时间。而多项式拟合只需要乘加运算,一个周期内就能算完。

经验之谈:我在做伺服驱动器时,用的就是二次多项式拟合。标定10个点,最小二乘法拟合出系数。实测精度在2%以内,而计算量只有查表法的1/3。当然,前提是电机参数比较稳定——温度变化不大的场合。

公式法的优缺点很明显:

优点 缺点
无需大容量存储 依赖电机参数精度
输出连续平滑 参数漂移时性能下降
易于移植到不同平台 需要浮点运算能力
调试方便,改参数即可 饱和、弱磁区公式失效

4.3 在线搜索法MTPA——自适应派的终极方案

在线搜索法,说白了就是让控制器自己“摸索”出最优电流点。不需要标定,不需要参数,实时在线寻优。

基本原理是这样的:给一个小的电流扰动,观察转矩或功率的变化方向,然后沿着梯度方向调整电流。常用的方法有:

  • 黄金分割法:一维搜索,固定iq,搜索最优id
  • 梯度下降法:同时调整id和iq,沿负梯度方向迭代
  • 扰动观察法:类似MPPT,加扰动看功率变化

我记得有一次在实验室做算法验证,用的就是扰动观察法。代码写起来其实很简单:

// 在线搜索法MTPA - 扰动观察法示例
float id_prev = 0, iq_prev = 0;
float power_prev = 0;
float step_size = 0.01;  // 扰动步长

void mtpa_online_search(float Te_ref, float speed) {
    // 1. 施加扰动
    float id_new = id_prev + step_size;
    // 2. 计算当前功率(或转矩)
    float power_cur = compute_power(id_new, iq_prev, speed);
    // 3. 比较功率变化
    if (power_cur > power_prev) {
        // 功率增加,继续同方向扰动
        step_size = fabs(step_size);
    } else {
        // 功率减小,反向扰动
        step_size = -fabs(step_size);
    }
    // 4. 更新
    id_prev = id_new;
    power_prev = power_cur;
    // 5. 输出电流指令
    set_current_ref(id_prev, iq_prev);
}

注意:在线搜索法有个致命问题——转矩脉动。你想想看,每次扰动都会引起转矩波动,如果步长太大,电机转速会抖;步长太小,收敛又太慢。我曾经在风机项目上试过,搜索法导致低频转矩脉动,整个机柜都在嗡嗡响,最后不得不换回查表法。

那什么时候用在线搜索法?我建议三种场景:

  1. 科研样机:需要验证MTPA理论,或者参数未知的新电机
  2. 参数剧烈变化:比如电机温度从-40℃到150℃的宽范围应用
  3. 自整定功能:作为辅助手段,在线修正查表法的误差

4.4 三种方法的工程选型建议

说了这么多,到底选哪种?我直接给结论:

应用场景 推荐方法 理由
新能源汽车主驱 查表法 安全第一,标定成熟,经过大量验证
工业伺服 公式法(多项式拟合) 参数稳定,计算快,成本低
家电变频 查表法(简化版) MCU资源有限,查表最省算力
航空/军工 查表法+在线修正 极端环境,需要自适应能力
实验室研究 在线搜索法 灵活,便于观察MTPA轨迹

最后说一句:没有最好的方法,只有最合适的。我在实际项目中,经常是查表法为主,公式法做备份,在线搜索法做辅助修正——三管齐下,才能保证系统在各种工况下都稳定运行。

小技巧:如果你用的是查表法,建议在标定时同时记录下公式法的拟合系数。万一现场发现查表数据有问题,可以一键切换到公式法应急。这个“双保险”设计,我在三个项目里都用过,从来没出过岔子。


公众号:蓝海资料掘金营,微信deep3321