永磁同步电机控制&FOC驱动 本文首先对永磁同步电机(PMSM)进行了数学建模,基于磁场定向控制方法建立了磁链方程、电压方程和力矩方程,并在之后搭建了Simulink模型,作为后续多轮协调控制的仿真框图之一。接着,基于电机磁场定向控制的原理,实现了FOC控制算法,并在已有硬件上进行了调试,能够正常运行,为之后控制算法的部署打下基础。 //本文PMSM建模部分主要参考自[1] 如何快速理解永磁同步电机? PMSM数学模型 故事可以从电流的磁效应讲起:奥斯特-发现电流的磁效应;磁场强度的单位是O。1820年7月发表电流的磁效的文章,所以一开始的磁场强度是和电流强度挂钩的一个量。安培定理:在恒定电流的磁场中,磁场强度 H矢量 沿任何闭合路径 C (即环路积分)的线积分等于其所包围的电流强度的代数
法拉第电磁感应定律的定量描述为:线圈中感应的电动势(Electromotive Force),简称EMF,与每匝线圈中磁通量的变化率以及匝数成正比
磁通量
是磁通密度B矢量在区域内的面积分。而磁通密度的定义是由洛伦兹公式而来的:
我们可以通过电荷大小、运动速度以及所受到的力来反推周围磁场的大小,这个磁场的大小就是磁通密度,也叫磁感应强度,单位是特斯拉(Tesla)。而上面提到的两个描述磁场的单位,有相应的转换关系:B-H曲线。 磁通密度B和磁场强度H是两个描述磁的量,他们不同,但有所联系。我们一般会把磁场密度B 和 磁场强度 H 的比值称为磁导率μ:
磁导率描述的是电荷感受的磁场(输出)与电流产生的磁场(输入)的比值,描述前者随着后者的响应。电荷感受的磁场,洛伦兹力,可以理解为输出;而磁场的输入——导线电流产生磁场。电流和H相关,力矩和B相关。许多文献中会用flux这个量来描述电机的输出,磁链:导电线圈或电流回路所链环的磁通量。磁链等于导电线圈匝数N与穿过该线圈各匝的平均磁通量φ的乘积,故又称磁通匝。电机方程:磁路分析——磁链方程
电路分析——电压方程
机械分析——转矩方程
其中旋转的矢量加粗表示。电机的电角度和机械角度:
为电角度,
为机械角度当极对数
大于1时,这样沿机械一周,电信号就会变化
个周期,可见,
磁链方程 对于永磁电机而言,转子一般是永磁体,所以只对定子线圈进行磁链计算即可。电感的定义方式:
即单位电流产生的磁链,电感和电阻类似,虽然是通过磁链和电流来定义和计算的,但是其本质是由磁路的物理结构决定的。电机中的磁场来源可以分成两部分,一部分是线圈是产生的,一部分是永磁产生。
电压方程法拉第电磁感应定律:线圈在磁场中运动时产生的电动势,等于磁链随时间变化率的负值
考察定子线圈中的磁链变化:
存在是因为线圈中电流变化,导致了
变换而其引起的,其大小可用电感来表征,因此称之为感生电势或者是变压器电势;
存在是因为永磁体产生的旋转磁场导致了线圈有效面积 S 发生改变而引起的,因此称之为动生电势或反电动势,也可以用E来表示。线圈中总的感应电势即是感生电势和动生电势之和。
上图很好的展示了定子中的电压旋转矢量合成,分为感生电动势
和反电动势E,以及电阻分压 力矩方程 尝试从能量守恒的角度来推导力矩方程。电机,本质是一个能量转换装置,对于电动机来说,就是将电能转换成机械能。在复平面域,计算出的功率称之为复功率。
= \vec{\mathbf{u_s}}\cdot\vec{\mathbf{i_s}^*}” eeimg=”1″> 总功率=热损耗+有效功率。i*是i的共轭复数。
}& =\left( R_s\vec{\mathbf{i_s}}+j\omega_e \vec{\mathbf{\Psi_s}} \right)\cdot\vec{\mathbf{i_s}^*}\\ & = R_s\vec{\mathbf{i_s}}\cdot\vec{\mathbf{i_s}^*}+ \left( j\omega_e \vec{\mathbf{\Psi_s}} \right)\cdot \vec{\mathbf{i_s}^*} \\ & = R_s\left| \vec{{i_s}} \right|^2+j\omega_e \vec{{\Psi_s}} \cdot\vec{{i_s}^*} \end{aligned}” eeimg=”1″> 对于第二项的复数功率:
对于复功率而言,实部是有功功率,虚部是无功功率。取这一项的实部即为有功功率:
用叉乘简化:
式中
表示叉乘后的方向,加上它是为了形式上一致,因为点乘后标量,叉乘后是矢量。这个时候我们就很容易计算转矩了,假定转子的转速是
,则转子上的力矩为:
上面的磁链方程对
做了一定的分解,注意到
所以:
DQ坐标系分析
定义上给出的dq分别是转子磁极direct 和 quadrature方向的合成电流矢量的分量。他们听名字应该是垂直的,但是由于转子有多个极对,所以q-d角度也是相差90/p,即控制对应方向的定子线圈电流大小。不过对于转子磁极,我们还是可以按照正交的dq轴来理解:
然后将dq坐标下的三矢量带入磁链、电压和扭矩方程:
对上式中的
分解,到qd两个轴上,我们知道永磁产生的磁链分量一定是和d轴相同的,而旋转电流可以有dq两个轴的分量,所以:
将分解后的磁链,
带入上面的电压方程,分别上虚部实部相等:
再考虑力矩方程:
很多教程、论文都是直接给出上面的力矩方程。有一些会在前面加上3/2 这是因为使用Clarke&Park transform,这种变换的矩阵保持了电压幅值不变,但功率变为了原来的2/3。由P=wT可得,为保证估计的电磁转矩正确,T也应用系数3/2扩大。恒功率变化则没有系数。永磁同步电机的力矩包含两个部分,一是
,这是由永磁体产生的力矩,一般称之为励磁力矩或对齐力矩(Alignment Torque);另一部分
是由于磁路上磁阻不均匀(
)引起的,所以称之为磁阻力矩,如果磁路交直轴磁阻相等,则这部分力矩消失。对于一些简化的模型,会直接忽略磁阻力矩,进而得到力矩值和电流值正相关的结论。PMSM控制方法
FOC方法是目前电机控制最主流的方法,其是电机控制的最后一环,输入是力矩,输出是PWM开关信号。而在矢量控制方法中,转矩指令先通过电流控制策略到电流指令。一般FOC算法会使用最简单的Id=0控制,而在电动车中为了达到最佳的控制效果, 也有MTPA MTPUI控制。在本小节中主要讲不同的电流控制策略原理。
根据dq坐标的力矩方程可以画出上面的图,对于单位电流,其横坐标
,橙线和紫线分别是励磁力矩和磁阻力矩曲线,相加得到绿色的和力矩曲线。我们最常见的id=0控制,即励磁力矩最大,磁阻力矩为0。此外还有合成力矩最大:Max T/A,即给定电流下的最大转矩,将电流控制在最大转矩电流比的点,也就是MTPA。此外,在高阶一些的教程中,会提电压极限椭圆和电流极限圆。电流极限圆很好理解,
驱动电路最大电流限制电压极限圆,我们考虑dq坐标系下的电压方程:
先忽略电阻
(通常比较小),稳态时
、
不再变化,所以:
两边平方相加,再配成椭圆方程:
是最大驱动电流,椭圆的x轴心左移
,椭圆的大小和转速相关,转速越大椭圆越小 电流曲线控制 对于确定的电机,
,因此任意的
、
都会对应一个力矩值。根据力矩方程,我们把力矩相同的点用线连起来就得到一组等力矩曲线,如下图的三条黑色的等力矩线。同一个等力矩的曲线会和不同的电流圆相切,产生一系列的切点,这些切点的轨迹就是MTPA(最大力矩比电流)控制点,因为在一定的电流极限下,该切点是力矩最大的点。同一个等力矩的曲线会和不同的电压椭圆相切,产生一系列的切点,这些切点的轨迹就是MFPT(最大转速比力矩)控制点,因为在一定电压极限(电压椭圆和速度相关)下,该切点是速度最大的点
在电车控制中,对于不同特性的电机,会有不同的最佳电流策略控制曲线。对于上面这种情况,理想的I控制应该是MTPA->电流极限圆->MFPAT也就是说,在启动情况,速度由小增大,力从最大值(MTPA和电流圆交点)逐渐减小,然后随着转速再增大,进入弱磁控制阶段,再加速会受到电压椭圆的影响,驱动力矩减小地更快。
上图[2]显示了不同电流圆和电压椭圆关系时的力矩-电流最优控制策略以及 速度-力矩曲线和速度-功率曲线。这也解释了电动车相较于燃油车的一个优势——启动时低速转矩更大。同时,从图中也能推出Id=0电流控制策略的速度-力矩曲线,效果会比MTPA差一些。 此外,上面的等力矩线是对于凸极型PMSM而言的,而对于内隐(表面贴片式)PMSM,Ld=Lq,从力矩方程可知T至于iq相关,所以等力矩线是一系列横向直线,MTPA线也就和id=0重合了 MATLAB仿真 电机驱动控制研究大多都要基于MATLAB仿真,网络上有非常多的教程和参考例程。首先找到官方的一个FOC驱动PMSM的模型:见:MATLAB帮助中心-永磁同步的的磁场定向控制这个模型是simulink的高级应用,模型嵌套非常复杂,涉及到tensor flow、硬件连接和实时调试
具体的参数可以在速度环和电流环中调节。
输出的下发转速 阶跃响应:
使用slbuild 可以生成c代码,方便集成到嵌入式软中,生成的代码给出了.c .h文件,和在main.c中的示例调用生成的 Controller 函数一千多行,几乎没有可读性,移植部署也需要实际操作一番。MATLAB里自带的PMSM控制例程模块复杂一些,考虑的东西多一些,适合工业应用,不适合入门学习。找到了一本比较好的书,永磁同步电机控制原理及MATLAB仿真。本书给出的仿真模型实现比较简单,照着书本和控制原理搭建了一遍仿真模型:
其中电PMSM模块的参数设置按照书中给出的示例参数,逆变器使用三相逆变器,SVPWM的实现基于[5]中给出的仿真原理。电流控制策略使用最基本的Id=0策略,电流环与速度环的参数调节也参照书本中的设置方法。输入响应是一个1000 转每分的阶跃信号在电机的Tm施加一个 在0.2s开始 值为10的干扰力矩。观察输出:
左图是输出转速,右图是输出力矩,时域响应符合预期,受到干扰后也能够恢复。 FOC驱动 磁场定向控制(Field-Oriented Control,简称FOC)是一种电机控制方法,主要用于永磁同步电机(PMSM)和感应电机的精确控制。FOC的目标是将电机控制问题从三相坐标系(abc坐标系)变换到两个坐标系:静止坐标系(静止dq坐标系)和旋转坐标系(旋转dq坐标系)。 控制框图 总体框图:
FOC,Field-Oriented Control 在干的事情用一句话概括:定向控制定子线圈产生的磁场,让转子按照想要的方式旋转。
通过三相线圈的电流控制,可以控制三个线圈产生的三个磁场矢量,他们矢量叠加就是定子线圈生成的磁场定向,是一个二维矢量。当定子磁场定向和转子磁场定向重合时,电机会趋向于“固定”;当定子磁场定向和转子磁场定向垂直,此时驱动转子转动的力矩最大。简而言之,就是可以通过控制定子磁场定向来控制电机转子的力矩、速度和位置。FOC控制中,经过一大堆变化,到最后对于电机的输入只有两个量:Iq Id。 在开环控制链中,Iq Id通过Revpark变换,我们想要控制的和转子固连的矢量,通过二维旋转坐标变换变成和定子坐标系固连的二维正交矢量 Vα Vβ。然后通过SVPWM可以产生相应的电流, Vα Vβ变换到三个控制三相电桥的通断,从而控制三相定子线圈产生的磁场定向。关于SVPWM:控制PWM合成特定的空间矢量。最后和电机三线接口打交道的是三相开断电路的三个输出VS1 VS2 VS3。而关于Clark变换和park变换,文章中给出的直观解释:相位差120°的三相交流电:
绕组中产生的磁动势为旋转的圆:
将矢量分解到α β两个轴:
将α β两个轴的矢量分解到相差120°的三相矢量:这就是Clark变换
而Park变化就是根据定子和转子的转角θ,把定子的电流控制变换到转子dq坐标上:
电流环反馈会用到Park变换和Clark变换,而而从FOC的前向控制而言,就是从Id Iq输入,到最后得到三相电流。首先经过逆Park变换得到Iα Iβ ,然后如果通过逆Clark变换得到三相电流进而调整PWM占空比,则是SinePMW调制过程;而目前主流的方法是SVPWM调制过程,也就是通过扇区划分、规划各基向量时间长度进而调制各相占空比。典型的FOC框图,最内环是电流环。虽然大多数时候只有一个PI环节,但该控制器设计还需要考虑控制器后的采样延时环节、PWM环节、干扰和感抗带来的延时。电流内环的作用是在电机启动过程中能够以最大电流启动,同时在外部扰动是能够快速恢复,加快动态跟踪响应速度,提高系统的稳定性。在本次开发的FOC驱动中,由于硬件没有电流环反馈,所以电流控制是开环控制。而速度环方面,速度反馈是基于hall位置传感器差分得到,受传感器精度限制,需要添加滤波环节。 硬件分析 目前手上有的KNOB硬件原理图:
MO_IN 123 是MCU三个IO口输出PWM波。HO/LO 1/2/3 分别控制六个MOS管。VS1/2/3是控制通道,可以避免上下桥直通。EG2133栅极驱动芯片的数据手册:atta.szlcsc.com电路的设计是六通道转三通道,即HI 1\2\3输入PWM来控制六个MOS开关,而且上下只有一个MOS能导通,同一对上下MOS状态必然是相反的。反馈通道是霍尔效应磁编码器MT6701,没有反馈电流检测。如果之后的电流反馈通道要自己设计,可以在VS2到地端接一个采样电阻(开尔文接法(Kelvin connections)),之后可能还需要运放。可以参考的开源硬件-simpleFOC画的电路 https://github.com/simplefoc/Arduino-SimpleFOCShield ESP-FOC 基于已有的硬件和esp-idf平台,实现了FOC控制组件具体代码和项目说明可以查看:GitHub – yiyangc18/ESP-FOC: the foc driver on esp-idf
之前做电机相关的项目都是用的已有的库,自己写一遍foc算法后,能够更好地将理论框图和算法中各个环节对应上,实际调参、debug时有了更深入的理解,也不像之前那么“玄学”了。实现的FOC算法组件没有用到ESP-IDF的API,便于移植到其他平台,只有esp_hw_link.c中与硬件连接的函数实现与ESP-IDF相关,如果在其他平台上使用,只需要修改这个文件中的函数实现即可。文件功能encoder.h编码器功能,包括电机转子速度、位置更新和位置归零fast_math.h快速计算的math库filter.h低通滤波器的数据结构和相关函数foc.h电机FOC算法具体实现pid.hPID算法的数据结构和函数foc_config.hFOC控制参数配置esp_hw_link.h与硬件连接相关的函数 FOC驱动实现难点记录 1.motor pwm control 之前使用的PWM驱动是由高级定时器控制IO输出实现的,这种方法需要PCU参与,影响性能。而FOC中电流环和速度环的调用频率会影响控制的效果,所以pwm驱动最好使用basic timer,基于硬件触发的PMW,让渡CPU资源。阅读ESP-IDF相关文档,发现可以使用mcpwm相关api实现三相pwm驱动。调试后发现因为时钟配置错误导致三相PWM的占空比调整无法正常响应,现在分别使用三个时钟 生成三路pwm 可以正常驱动。To make the APl simpler, each Timer is automatically associated by the APl to drive an Operator of the same index, e.g. Timer 0 is associated with Operator 0. 2.速度更新环节 把FOC控制框图中各个框图单独debug。先调试foc_calibrate_phase();和encoder_zeroing();观察输出和电机情况,相序判断初始化和位置初始化完成与否。修复了机械角度从2pi到0 导致的速度跳变问题: 固定Id,累加电角度,让电机接近匀速转动,测试速度检测效果: 重写写了低通滤波器,之前参考的是一个RC模拟滤波器离散化的lpf,在调整loop频率时可能由滤波器参数不匹配的问题。改用了时间平滑滤波器,其中时间常数与设置的速度更新频率相关。 观察速度输出:
左图为采样频率为50hz的速度曲线,右图为采样频率为400Hz时的速度曲线。因为打印耗时占比已经比较高,在每次打印间隔会有明显的速度跳动,不过滤波器处理结果也还行。3.电机无法减速 在调整速度环时,发现会出现失稳现象,电机一直以最大速度旋转。观察速度环输出参数时发现:Iq为负时,希望是电机减速,但电机反而转的更快 在之前的foc_calibrate_phase环节 已经确定了uvw 相序电压,电角度增大, 机械角度也会增大。 测试在Iq恒为正的情况下 电机正转 但是只要Iq是负的 即使是-0.1 也会以最大力矩驱动motor转动 也就是说输入负的Iq并不能让电机减速,问题应该在SpaceVectorPWM 算法中重新过了一遍了SVPWM算法,添加以下语句: 这时候设置Iq为负,电机能够减速。具体原因是:SVPWM算法中会根据输入的Uq Ud 来计算需要合成的电压矢量在哪个扇区
而计算的方法是: 这个从理论上讲是没问题的,但是Uout = Uq / VBUS 在之后的环节是要参与到扇区基向量占空比计算的,而占空比无法是负值,所以导致合成的电压矢量不能是Iq为逆的。而加上Uq的相序判断: if(Uq < 0) elect_angle += _PI;直接让电角度旋转180°,这样让合成矢量反向,也就减速了。 参考文献 [0] 袁雷 现代永磁同步电机控制原理及MATLAB仿真 北京航天航空大学出版社知乎专栏[1] 如何快速理解永磁同步电机?[2] 深入浅出谈车用永磁同步电机控制[3]【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术[4]如何深入理解SVPWM?[5]彻底吃透SVPWM如此简单
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/27981.html