手把手教你电机FOC控制【一】

文章作者: 范子琦
文章链接: https://www.robotsfan.com/posts/d99d1c1a.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 范子琦的博客!

FOC框架引入

三向电机,分别为UVW三向,角度互差120度。若使用BLDC控制方法,如下图每次换向增加60度,转子只能到达六个位置,所以六步换向时会有振动。使用FOC控制方法可以使转子到达任意角度,所以运行起来会更加平滑。

如果想到达40度的位置,只需要在0度方向通电一段时间,在60度方向通电一段时间,再在空矢量的状态下通电一段时间(全桥000或111的位置为空矢量,空矢量的时长用来调节扭矩。后面会讲到),三段时间组成一个周期,以这个周期循环产生PWM,即可锁定至40度。若想到达其他角度,只需改变0度和60度的通电时长比例。

要想使磁场旋转起来,就需要输入正弦电压,但我们输入的是直流电,我们马上想到可以使用PWM波。通过不断改变PWM脉宽就可以模拟正弦电压,体现在电流上则为正弦电流。

下图为一个完整的FOC流程图:

我们先来看正向通路:输入 Id_refI_{d\_ref}Id_ref​ 和 Iq_refI_{q\_ref}Iq_ref​ 与下文反馈通路采样得到的电流 IdI_dId​ 和 IqI_qIq​ 进行PID控制输出 UdU_dUd​ 和 UqU_qUq​ (输入的 Id_refI_{d\_ref}Id_ref​ 通常为0, Iq_refI_{q\_ref}Iq_ref​ 前通常还需要接入一个速度PID构成速度环),再通过反Park变换转换成 UαU_\alphaUα​ 和 UβU_\betaUβ​ ,通过SVPWM模块控制定时器产生六路互补的PWM信号,最后使用PWM信号控制全桥MOS管的通断,产生三向电压使电机转动。

再来看反馈通路:通过采样电阻采集任意两相电流,根据基尔霍夫电流定律可以算出第三相电流,将三向电流通过Clark变换转化成 IαI_\alphaIα​ 和 IβI_\betaIβ​ ,再通过Park变换转换成 IdI_dId​ 和 IqI_qIq​ ,作为反馈传入PID控制器构成电流环。

上图中的Park变换和反Park变换需要当前的角度作为输入;速度PID需要速度作为反馈。所以需要获得电机的速度与角度。角度和速度的获取方法分为有感和无感。有感方式使用霍尔元件(Hall Sensor),安装在电机上就可以检测电机磁铁的位置。无感使用观测器(observer)获得角度速度信息,本文将使用扩展卡尔曼滤波观测器(EKF),输入为 UαU_\alphaUα​ 、 UβU_\betaUβ​ 、 IαI_\alphaIα​ 、 IβI_\betaIβ​ 。使用无感方式不需要霍尔传感器,可以减少连接线的数量,也可以减小成本。

坐标变换

为什么要使用坐标变换?电机控制大多是在控制速度/转矩,需要用PID闭环控制正弦交流电压的幅值和角度,不是很容易实现,所以通过坐标变化把正弦交流信息分解成角度信息(Q轴控制转矩)和幅值信息(D轴控制磁场)单独控制。

FOC的变换中要满足等幅值变换,即变换前后幅值不变。

坐标变换都分为正向变换和反向变换,正向变换都是对电流进行操作的,反向变换都是对电压进行操作的。

下面的变换均采用联立和矩阵两种形式表示,以方便使用。

Clark变换

Clark变换实现了三向坐标系 (a,b,c)(a,b,c)(a,b,c) 与直角坐标系 (α,β)(\alpha,\beta)(α,β) 间的转换。

正向Clark变换

Clark反变换则将两相信号转换为三相信号。已知三相坐标系 (Ia,Ib,Ic)(I_a,I_b,I_c)(Ia​,Ib​,Ic​) ,这三个基向量不是正交的,所以可以将其正交化为一个直角坐标系,命名为 α−β\alpha-\betaα−β 坐标系,变换公式为:
{Iα=Ia−Ibcos60−Iccos60=Ia−12Ib−12IcIβ=Ibcos30−Iccos30=32Ib−32Ic\left\{\begin{array}{l} \begin{aligned} I_\alpha&=I_a-I_b\text{cos}60-I_c\text{cos}60 \\ &=I_a-\frac{1}{2}I_b-\frac{1}{2}I_c \end{aligned} \\ \begin{aligned} I_\beta&=I_b\text{cos}30-I_c\text{cos}30 \\ &=\frac{\sqrt3}{2}I_b-\frac{\sqrt3}{2}I_c \end{aligned} \end{array}\right. ⎩⎨⎧​Iα​​=Ia​−Ib​cos60−Ic​cos60=Ia​−21​Ib​−21​Ic​​Iβ​​=Ib​cos30−Ic​cos30=23​​Ib​−23​​Ic​​​

表示为矩阵形式:
[IαIβ]=[1−12−12032−32][IaIbIc]\left[\begin{array}{c} I_{\alpha} \\ I_{\beta} \end{array}\right]= \left[\begin{array}{ccc} 1 & -\frac{1}{2} & -\frac{1}{2} \\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{array}\right] \left[\begin{array}{c} I_{a} \\ I_{b} \\ I_{c} \end{array}\right] [Iα​Iβ​​]=[10​−21​23​​​−21​−23​​​]⎣⎡​Ia​Ib​Ic​​⎦⎤​
我们一般在电路中只采集两相电流,第三相电流可以使用基尔霍夫电流定律得出( Ia+Ib+Ic=0I_a+I_b+I_c=0Ia​+Ib​+Ic​=0 ),故上式也可整理为以下形式:
{Iα=32IaIβ=32Ia+3Ib\left\{\begin{array}{l} I_\alpha=\frac{3}{2}I_a \\ I_\beta=\frac{\sqrt3}{2}I_a+\sqrt3I_b \end{array}\right. {Iα​=23​Ia​Iβ​=23​​Ia​+3​Ib​​

矩阵形式:
[IαIβ]=[320323][IaIb]\left[\begin{array}{c} I_{\alpha} \\ I_{\beta} \end{array}\right]= \left[\begin{array}{cc} \frac{3}{2} & 0\\ \frac{\sqrt{3}}{2} & \sqrt{3} \end{array}\right] \left[\begin{array}{c} I_{a} \\ I_{b} \end{array}\right] [Iα​Iβ​​]=[23​23​​​03​​][Ia​Ib​​]
由于变换前后 IaI_aIa​ 和 IαI_\alphaIα​ 幅值要相同,所以要进行等幅值变换,变换系数为 23\frac{2}{3}32​ ,即变为
{Iα=IaIβ=13(Ia+2Ib)\left\{\begin{array}{l} I_\alpha=I_a \\ I_\beta=\frac{1}{\sqrt3}(I_a+2I_b) \end{array}\right. {Iα​=Ia​Iβ​=3​1​(Ia​+2Ib​)​
矩阵形式:
[IαIβ]=[101323][IaIb]\left[\begin{array}{c} I_{\alpha} \\ I_{\beta} \end{array}\right]= \left[\begin{array}{cc} 1 & 0\\ \frac{1}{\sqrt{3}} & \frac{2}{\sqrt{3}} \end{array}\right] \left[\begin{array}{c} I_{a} \\ I_{b} \end{array}\right] [Iα​Iβ​​]=[13​1​​03​2​​][Ia​Ib​​]
(这里的系数在后文SVPWM里相电压的幅值与电压空间矢量之间有一个 32\frac{3}{2}23​ 的系数相抵消)

MATLAB实现为:

反向Clark变换

反Clark变换则将三相信号转换为两相信号。根据图可以写出:
{Ua=UαUb=−12Uα+32UβUc=−12Uα−32Uβ\left\{\begin{array}{l} U_{a} = U_{\alpha} \\ U_{b} = -\frac{1}{2}U_{\alpha} + \frac{\sqrt3}{2}U_{\beta}\\ U_{c} = -\frac{1}{2}U_{\alpha} - \frac{\sqrt3}{2}U_{\beta} \end{array}\right. ⎩⎨⎧​Ua​=Uα​Ub​=−21​Uα​+23​​Uβ​Uc​=−21​Uα​−23​​Uβ​​
矩阵形式:
[UaUbUc]=[10−1232−12−32][UαUβ]\left[\begin{array}{c} U_{a} \\ U_{b} \\ U_{c} \end{array}\right]= \left[\begin{array}{ccc} 1 & 0 \\ -\frac{1}{2} & \frac{\sqrt{3}}{2} \\ -\frac{1}{2} & -\frac{\sqrt{3}}{2} \end{array}\right] \left[\begin{array}{c} U_{\alpha} \\ U_{\beta} \end{array}\right] ⎣⎡​Ua​Ub​Uc​​⎦⎤​=⎣⎡​1−21​−21​​023​​−23​​​⎦⎤​[Uα​Uβ​​]

MATLAB实现为:

Park变换

Park变换实现了两相坐标系 (α,β)(\alpha,\beta)(α,β) 与转子坐标系 (d,q)(d,q)(d,q) 间的转换,此变换可以将正弦变量线性化。其中 ddd 指向转子中心, qqq 指向切线方向, θ\thetaθ 是转子当前的角度,也就是说 d−qd-qd−q 坐标系始终跟着转子同步旋转。

正向Park变换

则根据上图可以写出
{Id=Iαcos⁡θ+Iβsin⁡θIq=−Iαsin⁡θ+Iβcos⁡θ\left\{\begin{array}{l} I_{d}=I_{\alpha} \cos\theta+I_{\beta} \sin\theta \\ I_{q}=-I_{\alpha} \sin\theta+I_{\beta} \cos\theta \end{array}\right. {Id​=Iα​cosθ+Iβ​sinθIq​=−Iα​sinθ+Iβ​cosθ​
很明显上述变换可以用旋转矩阵来表示,使用矩阵形式可以很方便地写出:
[IdIq]=[cos⁡θsin⁡θ−sin⁡θcos⁡θ][IαIβ]\left[\begin{array}{l} I_{d} \\ I_{q} \end{array}\right]= \left[\begin{array}{cc} \cos \theta & \sin \theta \\ -\sin \theta & \cos \theta \end{array}\right] \left[\begin{array}{l} I_{\alpha} \\ I_{\beta} \end{array}\right] [Id​Iq​​]=[cosθ−sinθ​sinθcosθ​][Iα​Iβ​​]
(如果 ddd 轴为0,则功率全部输出在 qqq 轴上。)

MATLAB实现为

反Park变换

根据上面的推导可以求得反Park变换
{Uα=Udcos⁡θ−Uqsin⁡θUβ=Udsin⁡θ+Uqcos⁡θ\left\{\begin{array}{l} U_{\alpha}=U_{d} \cos\theta-U_{q} \sin\theta \\ U_{\beta}= U_{d} \sin\theta+U_{q} \cos\theta \end{array}\right. {Uα​=Ud​cosθ−Uq​sinθUβ​=Ud​sinθ+Uq​cosθ​
同理,使用旋转矩阵可以求出反变换的系数矩阵:
[UαUβ]=[cos⁡θ−sin⁡θsin⁡θcos⁡θ][UdUq]\left[\begin{array}{l} U_{\alpha} \\ U_{\beta} \end{array}\right]= \left[\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right] \left[\begin{array}{l} U_{d} \\ U_{q} \end{array}\right] [Uα​Uβ​​]=[cosθsinθ​−sinθcosθ​][Ud​Uq​​]

MATLAB实现为

MATLAB仿真

为了更清楚地仿真,这里不用矩阵形式表示,如需矩阵形式可以看我写的另一篇文章。

请注意,正向变换都是对电流进行操作的,反向变换都是对电压进行操作的。但是在这节的仿真中,把正变换和反变换连在一起,这样做没有实际意义,只是为了验证变化算法。

输入Vd为0,Vq为1,角度为由0到2pi的连续值。

再来看子模块内部,输入经过两个逆变换,再经过两个正变换。

运行查看波形(新版本MATLAB常值输入为一个圆圈)

手把手教你电机FOC控制【一】相关推荐

  1. python流程控制-实战案例手把手教你Python流程控制技巧

    原标题:实战案例手把手教你Python流程控制技巧 作者:PianoOrRock 来源: http://blog.csdn.net/pianoorrock/article/details/711315 ...

  2. 成熟FOC电机控制代码 可用于电动自行车,滑板 车,电机FOC控制等

    成熟FOC电机控制代码 大厂成熟FOC电机控制图. 可用于电动自行车,滑板 车,电机FOC控制等. 大厂成熟方案,直接可用,不是一般的普通代码可比的. 代码基于Stm031,国产很多芯片可以通用. 以 ...

  3. 成熟FOC电机控制代码 大厂成熟FOC电机控制图。 可用于电动自行车,滑板 车,电机FOC控制等

    成熟FOC电机控制代码 大厂成熟FOC电机控制图. 可用于电动自行车,滑板 车,电机FOC控制等. 大厂成熟方案,直接可用,不是一般的普通代码可比的. 代码基于Stm031,国产很多芯片可以通用. 以 ...

  4. stm32/gd32爱玛电动车控制器资料 ,电动车控制器原理图、PCB和程序,大厂成熟电机foc控制

    stm32/gd32爱玛电动车控制器资料 ,电动车控制器原理图.PCB和程序,大厂成熟电机foc控制 15697661859tb

  5. matlab计算abc三相短路电流_手把手教你做FOC电机控制MATLAB仿真

    一.整体结构及功能介绍用MATLAB2013以上版本打开文件,看到如图所示界面:可以看到仿真最外层由四个模块组成,电源模块(红色方框),电机与控制模块(蓝色方框),控制信号给定模块(黄色方框),信号分 ...

  6. 从零开始之电机FOC控制

    我们将撕开FOC神秘而虚伪的面纱,以说人话的方式讲述它.真正的做到从零开始,小白一看就会,一学就废. 如果觉得有用的话,就点个赞呗,纯手码. 一.什么是FOC? FOC是Field Orientati ...

  7. 电机FOC控制的PI调节串并联转换问题理解

  8. 量产大厂成熟Foc电机控制代于电动自行车电机Foc控制源码

    量产大厂成熟Foc电机控制代于电动自行车,滑板车,电机Foc控制等. 大厂成熟方案,直接可用,,不是一般的普通代码可比的. 代码基于Gd32F150国产很多芯片可以通用. 更新了代码和Pcb文件. 有 ...

  9. 一个低成本的FOC控制方案分享

    点击上方"小麦大叔",选择"置顶/星标公众号" 福利干货,第一时间送达 通常小体积封装的MCU有着成本较低的优势,被广泛用于BLDC电机的六步方波控制中,此类应 ...

最新文章

  1. 爬虫python的爬取步骤-python爬虫实战之爬取京东商城实例教程
  2. python看什么书-自学python看什么书
  3. JVM GC耗时频频升高,这次排查完想说:还有谁?
  4. hdu 5418(状态压缩dp+Floyd)
  5. 趣味问题:你能用Reflection.Emit生成这段代码吗?
  6. Google、Facebook、GitHub、Babel核心成员齐聚,第13届D2前端技术论坛正式启动
  7. 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法
  8. 21川大计算机学硕缩招,重大变动!21考研学硕缩招?别着急,还有个好消息
  9. python串口操作_Python Serial串口基本操作(收发数据)
  10. MATLAB三维散点图的绘制(scatter3、plot3)
  11. 用xml模块方式导出多种offcie文件
  12. r4烧录卡内核安装_玩家必看!教你彻底玩转R4烧录卡(下)
  13. 微信小程序商品跳转到第三方
  14. 软件工程实验报告1-可行性分析
  15. php 冷门与常用函数
  16. EPLAN小知识——如何在西门子(SIEMENS)官网下载EDZ部件
  17. 阿里云在线扩容云盘(Windows系统)
  18. 翟菜花:从风流到下流,杜蕾斯新文案为何被人口诛笔伐?
  19. win10驱动开发4——加载/卸载驱动
  20. win10系统如何开启telnet

热门文章

  1. 上下班通勤车辆实时定位查询小程序开发制作介绍
  2. 心是一个人的翅膀,心有多大,世界就有多大
  3. PIPI OJ 1334: PIPI计数(unordered_map的应用)
  4. 第 7 章 文件和数据格式化
  5. 湖大到中科大——我的2020计算机保研经历
  6. (论文加源码)基于DEAP和MABHOB数据集的二分类脑电情绪识别(pytorch深度神经网络(DNN)和卷积神经网络(CNN))
  7. ROSCORE 失败解决方法
  8. 【专业认知】保研北大金融 / 入职腾讯产品经理
  9. [轻笔记] pip install : Read timed out. (closed)
  10. WARNING: Unknown module: java.rmi specified to --add-opens如何解决