当前位置: 首页 > news >正文

第八篇 永磁同步电机控制-MTPA、MTPV

永磁同步电机控制系列课程:

第一篇 永磁同步电机控制-认识电机

第二篇 永磁同步电机控制-电机的分类

第三篇 永磁同步电机控制-硬件基础知识

第四篇 永磁同步电机控制-软件基础知识

第五篇 永磁同步电机控制-数学模型

第六篇 永磁同步电机控制-控制方法

第七篇 永磁同步电机控制-磁场定向控制FOC

第八篇 永磁同步电机控制-MTPA、MTPV

第九篇 永磁同步电机控制-弱磁控制

第十篇 永磁同步电机控制-SVPWM

第十一篇 永磁同步电机控制-位置环、转速环、电流环PI控制

第十二篇 永磁同步电机控制-PI整定

第十三篇 永磁同步电机控制-死区补偿

第十四篇 永磁同步电机控制-大总结
———————————————————————————————————————————

一、什么是MTPA?

        MTPA 的全称是 Maximum Torque Per Ampere,即 最大转矩电流比控制。
        核心思想:在输出特定转矩时,通过控制定子电流的幅值和相位(即d轴和q轴电流的分量),使得所需要的定子电流幅值最小。
        通俗理解:就是用“最省电”的方式产生所需要的力矩。就像开车时,找到一个最合适的油门和档位配合,使得在输出相同动力时,油耗最低。

二、为什么需要MTPA?

        这主要是由PMSM的转矩产生机理决定的。PMSM的转矩主要由两部分组成:
        永磁转矩 (Magnetic Torque):由永磁体磁场与定子电流磁场相互作用产生。这是主要转矩来源。
        磁阻转矩 (Reluctance Torque):由于电机转子设计的凸极性(d轴和q轴电感不相等,Ld ≠ Lq),磁路磁阻不同而产生的转矩。
        PMSM的总转矩方程可以表示为:

        其中:
        T_e:电磁转矩;Np:电机极对数;ψ_f:永磁体磁链(常数);

        L_d:直轴(d轴)电感; L_q:交轴(q轴)电感;

        i_d:直轴(d轴)电流分量;i_q:交轴(q轴)电流分量。

        关键点:
        如果只是简单地让所有电流都用于产生转矩(即令 i_d = 0),我们只利用了永磁转矩,而浪费了磁阻转矩。这被称为 i_d=0 控制。
        对于隐极电机(Surface-Mounted PMSM, SPMSM),通常 L_d = L_q,所以磁阻转矩为0。i_d=0 控制本身就是MTPA控制。
        但对于凸极电机(Interior PMSM, IPMSM),通常 L_d < L_q。通过巧妙地注入一个负的i_d电流( demagnetizing current,去磁电流),虽然它本身不直接产生正转矩,但可以显著改变磁阻转矩的大小,使得在总电流 I_s = sqrt{i_d^2 + i_q^2} 不变的情况下,总转矩T_e 变得更大。
        因此,MTPA的核心目的就是:对于凸极永磁同步电机(IPMSM),通过优化i_d和i_q的分配,充分利用磁阻转矩,从而实现用最小的电流产生最大的转矩,提高系统的运行效率。


三、MTPA的控制原理

       从转矩方程出发,我们的目标是寻找在特定转矩 T_e 下,使定子电流幅值 I_s 最小的 (i_d, i_q) 组合。

        这是一个条件极值问题,可以通过建立拉格朗日函数求解,最终得到MTPA的约束条件关系式:

        (注意:由于 L_q > L_d,所以 i_d 为负值)
        这个公式表明了在MTPA控制下,i_d 和 i_q 不是独立的,它们必须遵循这个关系。给定一个转矩指令(对应一个 i_q 指令),就可以计算出一个最优的 i_d 指令。
        在实际系统中,这条 i_d 和 i_q 的关系曲线会被预先计算好,并做成查表法(Look-up Table, LUT) 存储在控制器中,或者通过公式计算法在线实时计算。


四、MTPA的实现方法

公式整理:

        总结与对比

五、MTPA的查表法具体实现

        我们来深入讲解永磁同步电机(PMSM)MTPA控制中查表法(Look-Up Table, LUT) 的具体实现步骤。这是一个从理论到实践的完整过程。


        第一阶段:离线制表(Offline Table Generation)
        这一步通常在电脑上完成(如使用MATLAB、Python等工具),生成表格后将其烧录到控制器的Flash或ROM中。

        步骤 1:确定电机参数
        首先,你需要精确知道以下电机参数(通过 datasheet 或电机参数辨识得到):
        Psi_f:永磁体磁链 (Wb)
        L_d:直轴电感 (H)
        L_q:交轴电感 (H)
        p:极对数
        I_max:电机最大允许电流 (A)
        T_max:电机最大所需转矩 (Nm)

        步骤 2:选择自变量(索引)
        你需要决定用什么作为查表的“索引”(Index)。最常见的有两种:
        转矩指令 T_e:直接,但表格需要覆盖整个转矩范围。
        电流幅值 I_s:间接,因为MTPA本身就是 I_s 的函数。
        这里以转矩指令 T_e 作为索引为例。


        步骤 3:创建转矩序列
        生成一个从 0 到 T_max(或稍大一点)的转矩指令数组,数组长度决定表的精度。例如:
        Te_vector = [0, 0.1, 0.2, 0.3, ..., T_max] (Nm)

        步骤 4:为每个转矩点计算最优 (i_d, i_q)
        对于 Te_vector 中的每一个转矩值 T_e,求解以下方程组:

        这是一个关于 i_d 和 i_q 的二元方程组。求解方法:
数值求解(常用):将第二个方程代入第一个方程,得到只关于 i_q 的方程,然后使用牛顿-拉夫逊(Newton-Raphson) 等迭代法求解。
        解析法:也可以推导出解析解,但形式较复杂。

MATLAB代码示例:

        % 给定电机参数
        Psi_f = 0.05; % Wb
        L_d = 0.5e-3; % H
        L_q = 1.0e-3; % H
        p = 4;

        T_max = 10; % Nm
        NumPoints = 100; % 表的大小
        Te_vector = linspace(0, T_max, NumPoints);

        % 预分配内存
        id_table = zeros(1, NumPoints);
        iq_table = zeros(1, NumPoints);

        for i = 1:length(Te_vector)
               T_e = Te_vector(i);
    
            % 使用fzero求解关于iq的方程
            fun = @(i_q) (3/2)*p * ( Psi_f * i_q + (L_d - L_q) * ... 
                    ( (Psi_f/(2*(L_q-L_d))) - sqrt( (Psi_f^2)/(4*(L_q-L_d)^2) + i_q^2 ) ) .* i_q ) - T_e;
          
            i_q_guess = T_e / ((3/2)*p*Psi_f); % 用id=0控制猜测初值
            i_q_sol = fzero(fun, i_q_guess);
    
            % 代入求出对应的id
            i_d_sol = (Psi_f/(2*(L_q-L_d))) - sqrt( (Psi_f^2)/(4*(L_q-L_d)^2) + i_q_sol^2 );
    
            % 存储到表中
            iq_table(i) = i_q_sol;
            id_table(i) = i_d_sol;
        end


        步骤 5:处理和存储表格
        检查计算出的 id_table 和 iq_table 是否超过电机允许的电流限值 I_max。如果超过,需要进行限幅处理。
        将最终的 Te_vector(索引)、id_table、iq_table 以数组的形式存储起来。通常存储为C语言风格的数组,方便嵌入代码。


        第二阶段:在线查表(Online Look-Up)
        这一步在电机控制器的中断服务程序(如电流环中断)中实时执行。

        步骤 1:获取指令
        获取速度或转矩环给出的转矩指令 T_e_ref。

        步骤 2:计算索引地址
        根据 T_e_ref 和表格的存储信息,计算其在表中的位置。
        Table_Min:表中最小的转矩值(通常是0)。
        Table_Max:表中最大的转矩值(T_max)。
        Table_Resolution:表的分辨率,Res = (Table_Max - Table_Min) / (Number_of_Points - 1)。
        Index:计算出的位置,通常是一个浮点数。
        Index = (T_e_ref - Table_Min) / Res

        步骤 3:读取表格值
        Index 通常不是整数,其整数部分 i = floor(Index) 和小数部分 frac = Index - i 指明了需要插值的位置。
        从表中读出 i 和 i+1 位置的值:
        id0 = id_table[i]
        id1 = id_table[i+1]
        iq0 = iq_table[i]
        iq1 = iq_table[i+1]

        步骤 4:线性插值(Linear Interpolation)
为了获得更平滑、精确的指令,必须在两点之间进行插值。


        步骤 5:输出指令
        将插值后得到的 i_d_ref 和 i_q_ref 作为电流环的给定值,完成FOC控制。

C语言示例:

        // 1. 离线生成的表(存储在Flash中)
        const float Te_table[100] = {0, 0.101, 0.202, ...}; // 索引表
        const float id_table[100] = {0, -0.5, -1.0, ...};   // d轴电流表
        const float iq_table[100] = {0, 2.0, 4.0, ...};     // q轴电流表
        const int TABLE_SIZE = 100;
        const float TABLE_MIN = 0.0f;
        const float TABLE_MAX = 10.0f;
        const float TABLE_RES = (TABLE_MAX - TABLE_MIN) / (TABLE_SIZE - 1);

        // 2. 在线查表函数
        void MTPA_Table_Lookup(float Te_ref, float *id_ref, float *iq_ref)

         {
                    // a. 限幅
                    if (Te_ref > TABLE_MAX) Te_ref = TABLE_MAX;
                    if (Te_ref < TABLE_MIN) Te_ref = TABLE_MIN;
    
                    // b. 计算索引地址
                    float Index_f = (Te_ref - TABLE_MIN) / TABLE_RES;
                    int index = (int)Index_f;         // 整数部分
                    float frac = Index_f - index;     // 小数部分
    
                    // 防止数组越界
                    if (index >= TABLE_SIZE - 1)

                    {
                            index = TABLE_SIZE - 2;
                            frac = 1.0f;
                   }
    
                    // c. 查表
                    float id0 = id_table[index];
                    float id1 = id_table[index+1];
                    float iq0 = iq_table[index];
                    float iq1 = iq_table[index+1];
    
                    // d. 线性插值
                    *id_ref = id0 + (id1 - id0) * frac;
                    *iq_ref = iq0 + (iq1 - iq0) * frac;
        }

        // 3. 在电流中断函数中调用
        void Current_Loop_ISR()

        {
            float Te_command = ...; // 从速度环获取转矩指令
            float id_ref, iq_ref;
    
            MTPA_Table_Lookup(Te_command, &id_ref, &iq_ref);
    
            // ... 将id_ref, iq_ref送入电流环的PI控制器 ...
        }

        总结与注意事项
        优点:实时性极高,计算负担小。
        关键:表的精度依赖于电机参数的准确性。如果参数变化(尤其是 L_d, L_q 会随电流饱和而变化),表的性能会下降。
        优化:
        对于需要考虑磁饱和的场合,可以制作3维查表,以 i_d 和 i_q 为输入,输出 L_d 和 L_q,然后再计算MTPA,但这更复杂。
        对于正反转,通常只需要一个正转矩表,负转矩指令取对应正值的相反数即可(-Te_command -> -id_ref, -iq_ref)。
        在极低转矩指令下,可以切换到 i_d=0 控制以避免计算的不稳定性和噪音。
查表法是工业应用中的绝对主流,因为它完美地平衡了性能要求和实现复杂度。

六、MTPV是什么?

        永磁同步电机(PMSM)控制中的另一个高级概念:MTPV(最大转矩电压比控制)。MTPV是MTPA在高速区的自然延伸,是弱磁控制(Flux-Weakening Control) 区域内的一个特殊工作轨迹,对于拓展电机的高速运行范围至关重要。
        MTPV 的全称是 Maximum Torque Per Voltage,即 最大转矩电压比控制。
        核心思想:在电压极限约束下(即椭圆边界上),通过控制 i_d 和 i_q,使得输出特定转矩时所需要逆变器输出的电压幅值最小。
        等价理解:在电压极限约束下(即给定转速和直流母线电压),找到能产生最大可能转矩的 (i_d, i_q) 工作点。
简单来说:MTPA是“省电流”的控制方式,而MTPV是“省电压”或“榨干电压”的控制方式。

        1. 为什么需要MTPV?—— 电压极限的挑战

        随着电机转速的升高,反电动势(Back-EMF)会成比例增大。电机控制器的直流母线电压是有限的,这导致逆变器能够输出的最大相电压也是一个定值(U_{max})。这个电压极限可以用一个在dq坐标系下的电压方程和不等式来描述:     
        电压方程:

        通常忽略定子电阻 R_s(在高速时其压降占比较小),则电压幅值约束为:

        两边同时除以 ωe^2,得到:

        这个不等式在dq电流平面上是一个椭圆,称为电压极限椭圆。


        核心问题:
        在高速区,电压极限椭圆收缩到MTPA轨迹之内。这意味着,如果继续按MTPA轨迹运行,所需要的电压会超过逆变器能提供的最大电压 U_{max},导致电流环饱和失控。
        解决方案:弱磁控制 (Flux-Weakening)
此时,必须注入更大的负的 i_d 电流(去磁电流),进一步削弱电机内部的磁场,从而降低反电动势,使得电机能在更高的转速下运行。这个工作区域就是弱磁区。
        而MTPV,就是在弱磁区内,找到一条最优的工作轨迹。


        2. MTPV的控制原理与方程  

        MTPV的数学目标是在电压极限椭圆的边界上(V_s = V_{max}),寻找使转矩 T_e 最大的点。这同样是一个条件极值问题,可以通过拉格朗日乘数法求解。
        MTPV的优化条件为:


        请注意:
        这个公式对于 凸极电机(IPMSM) 有效。
        对于 隐极电机(SPMSM),这个公式会发散。隐极电机的MTPV轨迹就是电压椭圆与负id轴的交点。在实际控制中,我们总是选择负id轴上的点来获得最大转矩。

        3. MTPV的实现方法

        与MTPA类似,MTPV的实现也主要依靠查表法(LUT)。
        a) 离线制表
        确定参数:需要已知 L_d, L_q, ψ_f。
        创建转速序列:生成一个从基速以上到最高转速的数组 Rpm_vector。

        计算MTPV轨迹:
        对于每个转速 rpm,计算对应的电角速度 w_e。
        计算该转速下的电压极限椭圆方程。
        联立求解:将 MTPV关系式 和 电压极限椭圆方程 联立,求解出此时椭圆边界上满足MTPV条件的 (i_d, i_q) 点。
        记录该点对应的转矩 T_e。
        生成表格:创建一个以 转速 或 转矩 为索引,以最优的 (i_d, i_q) 为值的表。

        b) 在线查表
        控制器实时检测电机转速 rpm 和直流母线电压 U_dc(用于计算 U_{max})。
        以当前转速为索引,查询MTPV表,得到对应的 i_d 和 i_q 指令。
        将电流指令送入电流环执行。

        4. MTPV的注意事项与特点

        仅适用于IPMSM:MTPV的有效性依赖于电机的凸极性(L_d < L_q)。对于SPMSM,弱磁控制就是沿着负id轴运行。
        对参数极度敏感:L_d, L_q, ψ_f 的准确性至关重要,尤其是磁饱和会显著影响这些参数。参数不准会导致计算出的MTPV点偏离真正的最优点。
        稳定性问题:在MTPV点附近,电压和电流环的增益需要仔细设计,否则容易产生振荡。
        与MTPA的平滑切换:在实际控制器中,必须实现从恒转矩区(MTPA)到弱磁区(包括MTPV)的平滑过渡,避免转矩和电流的突变。

七、 MTPA、MTPV总结

        MTPA:用于低速/基速以下区域,目标是最小化电流以产生所需转矩,提高效率。
        MTPV:用于高速/深度弱磁区域,目标是最大化利用有限电压以产生最大可能转矩,拓展高速范围。
        MTPV是挖掘IPMSM高速性能极限的关键技术,广泛应用于电动汽车、航空航天等对高速性能有苛刻要求的领域。

http://www.dtcms.com/a/356247.html

相关文章:

  • 深入解析Qt节点编辑器框架:数据流转与扩展机制(三)
  • 实时音视频延迟优化指南:从原理到实践
  • 零知开源——基于STM32F407VET6和ADXL345三轴加速度计的精准运动姿态检测系统
  • Blender模拟结构光3D Scanner(三)获取相机观测点云的真值
  • OpenCV 基础知识总结
  • 无懈可击的 TCP AIMD
  • 亚马逊季节性产品运营策略:从传统到智能化的演进
  • kimi浏览器助手-月之暗面推出的智能浏览器扩展
  • docker中的mysql有中文显示问题跟大小写区分问题?
  • Python从入门到高手9.4节-基于字典树的敏感词识别算法
  • 使用Python脚本执行Git命令
  • React 状态丢失:组件 key 用错引发的渲染异常
  • Rust 安装与运行指南
  • Custom SRP - LOD and Reflections
  • 柳州市委常委、统战部部长,副市长潘展东率队首访深兰科技集团新总部,共探 AI 赋能制造大市与东盟合作新局
  • Claude Code 完整手册:从入门、配置到高级自动化
  • 【python】相机输出图片时保留时间戳数据
  • Linux学习——sqlite3
  • 179-183动画
  • IntelliJ IDEA2025+启动项目提示 Failed to instantiate SLF4J LoggerFactory
  • 零基础json入门教程(基于vscode的json配置文件)
  • 【贪心算法】day4
  • HTML 核心标签全解析:从文本排版到媒体嵌入
  • 联想打印机2268w安装
  • 根据并发和响应延迟,实现语音识别接口自动切换需求
  • IP v 6
  • Linux下的软件编程——数据库
  • 编程与数学 03-004 数据库系统概论 06_需求分析
  • 【Flask】测试平台开发,初始化管理第一个页面开发-第三篇
  • Charles打开后,Pc电脑端浏览器显示Not implemented或没有网络