全文约5488字,你将看到以下内容:
正如之前预告的,本期将介绍关于MBD实现FOC控制的一些细节。FOC控制算法模型我已上传至GitHub仓库,下载模型可以访问下面这个链接:
也可以在对话框中回复关键词“MBD电机控制”,即可收到链接信息。 该FOC算法是在我自己构建的MBD电机控制框架基础上实现的,该框架的具体介绍可以参阅autoMBD公众号的上一期文章——《MBD实战之电机控制 第03期:基于MBD的电机控制框架》。 同样硬件平台依然是NXP的电机开发套件MCSPTE1AK144: 电机开发套件MCSPTE1AK144 - From NXP 运行仓库中的FOC控制算法模型之前,需要对NXP的MBD硬件支持包进行修改,修改的方法在上一期(第03期...)中有详细的介绍,这里直接给出修改需要用到的代码: #define FOCctrlBasedOnMBD_IN_Faults ((uint8_T)1U) #define FOCctrlBasedOnMBD_IN_Initial ((uint8_T)2U) #define FOCctrlBasedOnMBD_IN_NormalRun ((uint8_T)2U) #define FOCctrlBasedOnMBD_IN_Ready ((uint8_T)3U) #define FOCctrlBasedOnMBD_IN_Run ((uint8_T)4U) #define FOCctrlBasedOnMB_IN_Calibration ((uint8_T)1U) #define FOCctrlBased_IN_NO_ACTIVE_CHILD ((uint8_T)0U) #define FOCctrlBasedOnMBD_IN_AlignStage ((uint8_T)1U) #define FOCctrlBasedOnMBD_IN_OpenStage ((uint8_T)2U) #define FOCctrlBasedOnMBD_IN_RunStage ((uint8_T)3U) #define FOCctrlBasedOnMBD_IN_TrackStage ((uint8_T)4U) #define FOCctrlBas_IN_NO_ACTIVE_CHILD_o ((uint8_T)0U) 此外,仓库中的BLDC六步换相控制模型也更新了速度闭环控制算法,不过这里不对其进行介绍,感兴趣的可以自行下载查看该模型。 1 浅谈FOC算法的本质 首先来讲一讲FOC算法的一些基础知识。 Tips:这部分内容供初学者参考,对FOC有充分了解的可以跳过这部分内容。 本着多一个公式就会少一个读者的原则,本文章也不会罗列各种数学公式,需要了解详细的数学原理和推导,还是阅读专业的书籍。依然推荐下面这两本书来学习FOC控制:
现代永磁同步电机控制原理及MATLAB仿真 - From Internet autoMBD公众号的资源库也收集了这些书籍的电子资源,在对话框中回复关键词“电机书籍”或者“资源”,可以收到资源库的分享链接。 进入正题,FOC的本质是什么? FOC的全称是Filed-Oriented Control:Filed是“场”的意思,表示磁场;Oriented的意思是“定向、朝向”。简单地来说FOC就是通过控制磁场的方向和大小实现对电机的控制的。 下图给出了一个简化抽象后的无刷电机磁场示意图,由三个电磁铁(即定子的三相绕组)和一个永磁体组成。 无刷电机的磁场和方向 - From autoMBD 我们都知道电磁铁可以产生磁场,通过控制输入三相电压的大小和方向,可以产生三个大小和方向各不相同的磁场。而这三个磁场会合成一个新的磁场,这个合成后的磁场和方向就是FOC想要控制的磁场和方向。 合成磁场有大小,也有方向,是一个矢量,所以FOC控制也被称为矢量控制。为了方便后文称合成后的磁场方向和大小称为受控矢量。 Tips:一但三相电压的大小和方向确定了,合成后的磁场大小和方向便确定了,所以三相电压矢量,与合成后的磁场矢量是等价的不同描述,受控矢量也可以指代三相电压矢量。 无刷电机的永磁体位于合成磁场的内部,其北极(N极)始终会与受控矢量对齐(稳态),或者朝着受控矢量运动(动态)。这就给了我们绝佳的控制转子位置或者速度的途径。 那么如何实现对受控矢量的控制呢?答案是坐标转换。 无刷电机的坐标转换 - From autoMBD 如上图所示,假设受控矢量V指向任意一个方向,为了确定它的位置,建立一个直角坐标系dq。实际上这个dq坐标系的方向可以是任意的,并没有任何限制,只不过在实际应用中,常常将dq坐标系与永磁体的磁极绑定在一起。 我们知道无刷电机的三相定子绕组是对称分布的,三相绕组形成了位置固定不动的自然坐标系abc。为了建立dq坐标系和abc坐标系之间的联系,引入一个静止坐标系αβ。 Tips:αβ坐标系与定子固定连接,是静止不动的,αβ坐标系和abc坐标系是等价的,只不过从三轴坐标转换成了两轴直角坐标。 通过线代的知识我们知道,任何矢量都可以通过转换矩阵转换到不同的坐标系中。已知dq坐标系中的受控矢量V,总能找到合适的转换矩阵,将其转换到自然坐标系abc中或静止坐标系αβ中。 在FOC中,dq坐标系、αβ坐标系和abc坐标系之间相互转换的转换矩阵被称为Park变换(及其逆变换)和Clark变换(及其逆变换)。 于是,要控制合成磁场方向,只需要控制受控矢量的方向和大小就可以了。这便是FOC控制算法的本质。 为了更好的展示FOC算法的本质,我做了几个FOC控制算法的基础模型,位于仓库的FOC_basic文件夹内。该文件夹内有五个基础模型,由简到繁,由内到外,逐层展示了FOC是如何实现电机控制的。 定向控制是一种受控矢量固定不动的一种控制方式,即受控矢量的大小和方向固定不变,dq坐标系的位置也固定不变。这种情况下,永磁体(转子)始终会与受控矢量对齐,实际应用中常用这种方法对转子进行定位。 FOC定向控制仿真模型 - From autoMBD 3. FOC电流控制(FOC's Current Control) 虽然电压控制已经能够使电机转动起来,但因为电压控制时电流过大、效率不高等原因,一般不会直接使用电压控制,而是添加电流控制器(内环控制器)间接控制电压矢量(受控矢量),使电流变化更加平稳。 FOC电流控制仿真模型 - From autoMBD Tips:对FOC电流控制的几点说明:① 电流控制器参数的设计使用的是典型二阶系统设计方法,具体计算过程可以参考FOC_basic文件夹内的m脚本;② 仿真模型中的解耦环节(Decouple)是为了消除dq轴上的电流交叉耦合项,让电机的数学模型更接近一阶线性系统。 速度控制就是在电流控制的基础上,添加速度环控制器(外环控制器),速度环的输出为电流环的输入。 FOC速度控制仿真模型 - From autoMBD 速度环(或者称为外环)的控制策略有很多,例如:
这些控制有着各自的优势和特点,但它们做的都是同一件事情,即通过各自的数学算法计算合适的电流环(内环)输入参数——id_req和iq_req。 Tips:① 最简单的恒转矩角控制,是id_req恒定等于0、iq_req由速度PI控制器输出的一种控制策略,因为其简单而最为常用;② 其他外环控制策略可以参阅R. Krishnan的《永磁无刷电机及其驱动技术》。 当然FOC还可以在速度环之外再添加位置环,这里就不再扩展下去。
实际中无刷电机使用的是直流电源,而FOC算法计算得到的电压矢量是理想的、连续的电压值。如何在直流电系统中实现矢量电压控制,就需要用到SVPWM技术。 下图是一般情况下的直流电源、三相逆变器和无刷电机示意图。 直流系统三相逆变器 - From autoMBD 以图中情况为例,当a相上桥连接、bc相下桥连接时,此时 [va, vb, vc] = [2DC/3, -DC/3, -DC/3] 也就是说此时可以得到一个固定大小和方向的电压矢量,如果再在此基础上对开关a_h、b_l和c_l输入占空比为x(大于0且小于1)的PWM信号,那么相当于电压矢量的方向不变,大小乘以x。这样就得到了一个幅值可变、方向不变的电压矢量。 推广到其他情况,三相逆变器一共有六种非零电压矢量形式,那么就有六个幅值可变、方向不变的电压矢量。如下图所示: 电压矢量空间分布 - From autoMBD 这六个电压矢量将360°空间分为了六个区域,电压矢量相邻电压矢量可以通过等效原理合成新的电压矢量,例如[1,0,0]和[1,1,0]可以合成位于 I 区域的电压矢量。再结合占空比为x(大于0且小于1)的PWM信号,可以使得合成的电压矢量遍布整个 I 区域。 通过这种方式可以实现覆盖整个360°空间内任意位置的电压矢量,这就是SVPWM技术的基本原理。具体的计算过程可以参考袁雷的《现代永磁同步电机控制原理及MATLAB仿真》。 总之,SVPWM技术就是将连续的、理想的电压矢量,通过直流电源和三相逆变器实现的过程。 由于这个过程引入了脉宽调制技术,不可避免的带来了非线性干扰,与理论上连续的、理想的电压矢量有一定的区别。脉宽调制的频率越高,这种差异越小。 Tips:一般SVPWM的频率大于10kHz,可以忽略这种差异带来的影响。 FOC_basic文件夹内也给了一个带有SVPWM调制的仿真模型,供大家参考: 带有SVPWM的FOC电流控制仿真模型 - From autoMBD
上文FOC基本原理的介绍中,要将dq坐标系与转子绑定在一起,就必须知道转子的实时位置。转子位置的精确性是影响FOC算法性能至关重要的因素,也是FOC算法的难点之一。 一般有两种方法:一是使用高精度编码器,二是通过无感位置观测器计算转子的位置。 有感和无感有各自的优缺点:高精度编码器控制效果好,但成本较高,体积较大,一般应用于伺服控制;而无感控制成本低,没有传感器失效问题,适合低成本场景,例如风机、泵等。 现在的无感控制算法已经非常成熟了,在实际产品中有着大量的应用。一些常见的无感算法,例如磁链观测算法、反电动势观测算法、高频注入算法,可以参考袁雷的《现代永磁同步电机控制原理及MATLAB仿真》或者其他书籍。 上述的FOC算法(坐标变换、电流控制、速度控制等),再结合SVPWM技术和位置观测技术,就可以实现完整的电机控制算法了。 2 所“建”即所得——FOC算法实现 在往期的文章中,我提到过MBD(Model-Based Design,基于模型的设计)能够拉近模型仿真和代码之间的距离。在理想情况下,所“建”即所得:建立仿真模型和编写的代码是完全统一的。 这样在建模仿真的时候就已经完成了代码的编写工作,最大化地提高开发效率。 如何在MBD开发过程中实现所“建”即所得,是我思考最多的、也是一直在思考的问题。对于一个工程项目来说,要能实现所“建”即所得,应当满足以下两点:
对于本项目中的FOC控制算法来说,这两点都是满足:
电机控制软件框架和FOC核心算法模型如下图所示: 电机控制软件框架 - From autoMBD FOC核心数学算法 - From autoMBD 关于电机控制框架模型的内容可以参阅上一期。
除了上述模块,还有一个小的状态机,负责在不同阶段控制各个控制器和无感位置观测器的启动和关闭。一共有四个阶段:
在实践中要尽量保证软件框架模型和数学算法模型之间的独立性,避免有依赖关系。这样的好处是软件框架和算法可以分开独立开发、分别测试、互不干扰。 本项目中的FOC控制算法也是遵循这一思想开展的建模。为了更好的将FOC控制算法独立出来,并且提高它的复用性,本项目中将FOC控制算法部分制作成了子系统模型。 FOC控制模型 - From autoMBD 如上图所示,本项目中的FOC控制算法一共有四个仿真模型(前面四个)和一个子系统模型(最后一个)。 四个仿真模型可以实现MIL(Model In the Loop)测试、PIL(Processer In the Loop)测试,以及最后生成代码。子系统模型中包含的是FOC核心控制算法,四个仿真模型均复用该算法子系统模型。 利用Simulink的子系统模型,可以保证算法测试和代码生成的一致性,真正做到从模型到代码的协调统一,经过测试后的模型不需要额外的修改,可以直接生成代码。 Tips:创建子系统模型的方法是,在新建模型的页面选中“Blank Subsystem”;使用子系统模型需要用到“Subsystem Reference”模块。 读者可以实际运行这些模型,体会从模型仿真到代码生成的全过程。下面是本项目FOC控制算法运行时的一些截图: 速度跟踪曲线 - From autoMBD 电机启动过程 - From autoMBD SVPWM占空比曲线 - From autoMBD 三相电流波形 - From autoMBD 无感位置估计曲线 - From autoMBD Tips:目前的FOC控制算法模型功能和性能并不是最优状态,还有很多优化和升级的空间,我也会持续对电机控制框架和FOC控制算法进行维护和更新。 本项目中,FOC控制算法的实现完全通过建模的方式实现,通过“软件框架模型+算法模型”的方式实现了全部的软件代码,基本满足了所“建”即所得。 但“软件框架模型+算法模型”的方式还是有诸多限制的。简单的来说,它不适合复杂逻辑、复杂架构的软件开发,不适合弱数学的算法开发。复杂的软件框架用手写代码的方式可能比建模更加高效,如果算法本身就没有明确的数学表达式,也就没有必要通过建模来实现。 对于更加复杂应用,例如汽车的路径规划算法、紧急避障算法等,采用算法集成的方式依然是MBD的主流。 简单的说,算法集成的方式就是放弃通过建模实现软件框架,只将MBD的工作放在算法模型部分。软件框架由IDE和专门的底层驱动配置软件实现,由MBD做好算法模型以及接口,然后将算法模型生成的代码集成到软件框架中去。 3 下期预告 下期的内容暂定为MBD算法集成的实战案例。其实这部分内容很少,没多少内容可讲,下一期也将是MBD电机控制实战系列的最后一期了。 快到年底了,我的工作也变得繁忙起来,所以更新可能不会很快,但希望大家继续关注我,在我的规划中还有很多干货满满的内容。
|
|