4. MTPA控制策略:查表法MTPA、公式法MTPA、在线搜索法MTPA
好,咱们接着聊MTPA。前面几章把理论基础和数学模型都铺开了,这一章咱们直接落地——聊聊具体怎么实现MTPA控制。
说白了,MTPA的核心就一句话:在输出同样转矩的情况下,让电流最小。但怎么找到这个“最小电流点”,工程上有三条路可以走。我这些年三种方法都折腾过,各有各的脾气。
核心逻辑:MTPA的本质是求解一个带约束的优化问题——给定转矩指令Te*,找到最优的d、q轴电流组合(id, iq),使得定子电流幅值is = √(id² + iq²)最小。
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);
}
注意:在线搜索法有个致命问题——转矩脉动。你想想看,每次扰动都会引起转矩波动,如果步长太大,电机转速会抖;步长太小,收敛又太慢。我曾经在风机项目上试过,搜索法导致低频转矩脉动,整个机柜都在嗡嗡响,最后不得不换回查表法。
那什么时候用在线搜索法?我建议三种场景:
- 科研样机:需要验证MTPA理论,或者参数未知的新电机
- 参数剧烈变化:比如电机温度从-40℃到150℃的宽范围应用
- 自整定功能:作为辅助手段,在线修正查表法的误差
4.4 三种方法的工程选型建议
说了这么多,到底选哪种?我直接给结论:
| 应用场景 | 推荐方法 | 理由 |
|---|---|---|
| 新能源汽车主驱 | 查表法 | 安全第一,标定成熟,经过大量验证 |
| 工业伺服 | 公式法(多项式拟合) | 参数稳定,计算快,成本低 |
| 家电变频 | 查表法(简化版) | MCU资源有限,查表最省算力 |
| 航空/军工 | 查表法+在线修正 | 极端环境,需要自适应能力 |
| 实验室研究 | 在线搜索法 | 灵活,便于观察MTPA轨迹 |
最后说一句:没有最好的方法,只有最合适的。我在实际项目中,经常是查表法为主,公式法做备份,在线搜索法做辅助修正——三管齐下,才能保证系统在各种工况下都稳定运行。
小技巧:如果你用的是查表法,建议在标定时同时记录下公式法的拟合系数。万一现场发现查表数据有问题,可以一键切换到公式法应急。这个“双保险”设计,我在三个项目里都用过,从来没出过岔子。
公众号:蓝海资料掘金营,微信deep3321