1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

MATLAB 到底有多厉害?

本帖由 漂亮的石头2021-06-24 发布。版面名称:知乎日报

  1. 漂亮的石头

    漂亮的石头 版主 管理成员

    注册:
    2012-02-10
    帖子:
    486,020
    赞:
    46
    [​IMG] 转子磁场定向,十年FOC电控开发经验,B站/闲鱼/公众号”转子磁场定向“ 阅读原文

    刚开始玩电机的时候也不喜欢 MATLAB,每次都是直接码代码,然后去转电机。

    效果不好就在代码里改来改去,晕晕乎乎调了一周进展也不大。这种情况就是陷入了调参数的怪圈,恶性循环进而打击自信,进步也很缓慢。

    后来学会了 simulink,才明白学习 FOC 一定要配合 MATLAB,进步快很多。

    1、理解离散系统:在 FOC 中经常涉及到上个开关周期的角度,电压,或者预测下个周期的角度,电流,一般都是通过延时模块实现。

    [​IMG]
    delay 延时模块

    为什么要使用这个模块呢?比如一般 PWM 比较值寄存器被改写后都是使能了预装载,采样后触发计算到比较值生效可以延时 0.5 个开关周期 Ts,也可以延时 1 个开关周期 Ts,或者 1.5 个 Ts。不同的延时对于控制效果有什么区别呢?只需要在 simulink 定义延时时间即可,非常方便对比不同的方案下的区别。这种调试在实物上实现要复杂很多!

    2、实现参数自整定:把所有的环路参数放在 m 文件里,在运行工程前,修改电机参数,环路参数等等,先运行 m 文件,可以实现参数自整定。要修改参数也只用改 m 文件,类似宏定义一样,环路的参数自整定和这个也差不多了。

    [​IMG]
    m 文件实现参数自整定

    3、强大示波器功能:simulink 的示波器功能非常强大,可以不限制查看任意波形,这在实物调试中也很难做到,除非去开发上位机配合查看,但是也有通道和数据量的限制。一般 ARM M0 的平台也没有资源去开发上位机。

    [​IMG]
    示波器显示电流电压

    尤其是现在比较通用的直流侧单电阻采样波形,可以清晰看到每个扇区对应的电流波形和单电阻波形的对应关系:

    [​IMG]
    单电阻采样波形

    4、模块化的平台,缩短开发周期:一般开发一种新的观测器,阅读文献之后,经过 simulink 验证。在搭建好平台之后,把观测器,速度环,电流环,转矩补偿等等封装成各自的模块。需要验证哪个模块,即进行对应的修改。经过 simulink 验证的方法,基本都可以在实物中实现。如果 simulink 仿真失败,基本就直接放弃了。一般一个新的观测器仿真需要一到两周,可以大大缩短开发周期。

    在搭建了完整的仿真平台后,实物和仿真模型基本可以做到 95%以上的对应,除了一些非线性相关的因素,因为在仿真中无法模拟,需要在实物中实现。对于有经验的开发人员,拿到了离散的仿真模型,基本就等于拿到了代码。

    当然如果模型在连续域仿真,那当我没说,这种方法以无限的计算量替代离散仿真,基本等同于耍流氓。。。

    [​IMG]
    滑模和电流模型集成到同一平台
    [​IMG]
    滑模模型,和公式一一对应

    5、s 函数代码级仿真:如果有足够的精力,simulink 是可以实现 c 语言代码级仿真的。用 s 函数替代离散模块,代码放在 s 函数里,完全可以实现跟实物对应的仿真。移植到实物中代码也可以快速调试通过。

    s 函数运行的指令是在命令窗口输入:”mex xx.c“,xx 是 s 函数文件名。

    [​IMG]
    s 函数代码
    [​IMG]
    s 函数框图

    6、在线参数变化的仿真。

    一般来,Ld 和 Lq 会随着电流出现饱和特性,所以可以通过 m 文件编程,实现 Ld 和 Lq 在线根据电流查表确定电感值。但是实际的无感 FOC 控制依然使用固定值,电机模型使用的饱和模型,这样子可以评估无感 FOC 的控制方法对电感饱和是否敏感,或者对电感的敏感程度。

    [​IMG]
    Ld 饱和模型

    提供一种方法作参考:

    用如下文档里的代码生成电感表格:

    https://ww2.mathworks.cn/help/physmod/sps/ref/elec_generateidealpmsmfluxdata.html

    将表格导入如何可编辑的电机模型即可:

    https://ww2.mathworks.cn/help/autoblks/ref/fluxbasedpmsm.html?requestedDomain=zh

    表格需要自己对应代码整理一下。

    7、模拟 MCU 的运行方式。使用 Simulink 离散模块搭建的方式,可以模拟 MCU 的硬件执行的结构。一般 MCU 最重要的是主频和中断,分别对应 Simulink 的最上层执行时间和定时执行的中断部分。如下图:

    [​IMG]
    powergui 模块设置仿真步长和类型

    使用 powergui 模块设置成离散模式,设置仿真步长 5e-7,相当于仿真最上层是 2MHz 的执行频率,这个 2M 就类似于 MCU 的主频,显示,电机模型本体响应的计算就以这个频率执行。

    然后通过脉冲模块设置定时触发执行的控制模块,就相当于是定时执行的中断:

    [​IMG]

    使用 Pulse Generator 模块,执行周期 1e-4,相当于中断频率 10k,控制环路都放在中断里,就跟 MCU 的运行结构非常类似了。执行频率对于离散控制来说是核心参数,不同的执行频率仿真结果区别很大。

    千万不要在 powergui 里设置成 continuous 仿真模式,那样会通过很高的计算频率掩盖环路的问题,用连续模式仿真成功基本等同于耍流氓!

    8、评估环路的阶跃响应:在伺服中比较常见的测试电流环带宽,一般测试交流给定幅相曲线。

    以阶跃响应为例,可以把电机角度固定成 0,电流解耦角度和逆变角度都强制给 0,然后电流环的 Id 给参考,测试 Id 环路的参考和反馈,即可得到阶跃响应。如下图:

    [​IMG]
    Id 电流环节约响应

    9、评估参数敏感性:

    以磁链模型为例,当电机模型磁链跟计算使用磁链相等时,观测角度和误差如下:

    [​IMG]
    计算磁链和电机模型磁链相等

    当温度上升,磁链降低到只有计算值的 80%,再去比较估算角度和误差,就能判断控制方法对磁链的变化敏感程度。

    [​IMG]
    电机模型的磁链只有计算使用磁链的 80%
    [​IMG]
    磁链下降 20%,观测角度误差增大到 15degrees

    对于研究电机控制来说,前期的主要工作放在文献和仿真上,到了代码已经是很后期的工作了。这种工作并不是靠代码量来决定工作进展,也许研究了一个月就改了一行代码却能够解决大问题。

    对于我来说,如果不让我使用 simulink 我觉得自己就基本失业了,工作也没有任何乐趣可言。转电机并不是无脑的去写代码做实验,而是通过 simulink 去打磨模型,通过模型的搭建深入理解了方法才去开始实物阶段的实验。要想深入理解 FOC,使用 MATLAB 是必经之路,没有捷径可走。模型对电机的诠释是无法用实验来代替的。

    到现在为止,MATLAB 的功能也许我才用了不到 1‰。如果单纯能把 MATLAB 玩得很溜,我觉得年薪百万也不是难题。至少我的工作离不开 MATLAB。

    阅读原文
     
正在加载...