最近看到了FOC这个东西,感觉很有意思,想着以后用这个算法做个东西,目前的想法是用开源的ODrive方案,自己做一个有感单电机驱动的板子,并且加入一点自己的东西,但是这不是目前工作的重点,所以就先学习了一下,记录下来,方便以后做的时候查阅。

原文来自稚晖君的文章:【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术

FOC算法与SVPWM技术

  • 什么是FOC?
  • FOC驱动器和无刷电调的区别
    • FOC的优势
    • 电调的优势
  • 无刷直流电机基础知识
    • 基础知识
      • 左手定则
      • 右手定则
      • 右手螺旋定则(即安培定则)
      • PWM(脉冲宽度调制)
    • 磁回路分析法
    • 三相二极内转子电机结构
    • 三相多绕组多极内转子电机的结构
    • 外转子无刷直流电机的工作原理
  • BLDC和PMSM的区别
  • 三相逆变电路
  • 三相电机波形
  • FOC控制原理
    • FOC算法的Pipeline
    • Clark变换与Park变换
      • Clark变换
      • Park变换
    • PID控制
    • 空间电压矢量
    • SVPWM技术

什么是FOC?

FOC(Field-Oriented Control),直译是磁场定向控制,也被称作矢量控制(VC,Vector Control),是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最优方法之一。

FOC旨在通过精确地控制磁场大小与方向,使得电机的运动转矩平稳噪声小效率高,并且具有高速的动态响应

简单来说就是,FOC是一种对无刷电机的驱动控制方法,它可以让我们对无刷电机进行“像素级”控制,实现很多传统电机控制方法所无法达到的效果~

FOC驱动器和无刷电调的区别

航模中对于无刷电机的驱动使用的是电子调速器(ESC)也就是我们常说的电调,那么这个FOC驱动器和普通的电调有什么区别呢?

FOC的优势

  1. 低转速下控制
    由于控制原理的区别,无刷电调只能控制电机工作在高转速下,低速下很难控制;而FOC控制器则完全没有这个限制,不论在什么转速下都可以实现精确控制。

  2. 电机换向
    同上面的理由,由于无感电调无法反馈转子位置,因此很难实现电机正反转的换向;而FOC驱动器的换向性能极其优秀,最高转速下正反转切换可以非常顺畅;此外FOC还可以以能量回收的形式进行刹车控制。

  3. 力矩控制
    普通电调都只能控制电机转速,而FOC可以进行电流(力矩)、速度、位置三个闭环控制。

  4. 噪音
    FOC驱动器的噪音会比电调小很多,原因是普通电调采用方波驱动,而FOC是正弦波。

电调的优势

  1. 兼容性
    电调驱动不同的BLDC不需要进行参数整定,而FOC需要。

  2. 算法复杂度
    电调的算法实现更简单,运算量少,很适合需要提高带宽的超高转速电机。

  3. 成本
    电调的成本比FOC低很多。

无刷直流电机基础知识

基础知识

左手定则

用于判断导线在磁场中受力的方向:伸开左手,使拇指与其他四指垂直且在一个平面内,让磁感线从手心流入,四指指向电流方向,大拇指指向的就是安培力方向(即导体受力方向)。

右手定则

伸开右手,使大拇指跟其余四个手指垂直并且都跟手掌在一个平面内,把右手放入磁场中,让磁感线垂直穿入手心,大拇指指向导体运动方向,则其余四指指向感生电动势的方向

也就是切割磁感线的导体会产生反电动势,实际上通过反电动势定位转子位置也是普通无感电调工作的基础原理之一。

右手螺旋定则(即安培定则)

用于判断通电线圈极性:用右手握螺线管,让四指弯向螺线管中电流方向,大拇指所指的那端就是螺线管的N极。

直线电流的磁场的话,大拇指指向电流方向,另外四指弯曲指的方向为磁感线的方向。

PWM(脉冲宽度调制)

本质是利用面积等效原理来改变波形的有效值。

举个例子,一个电灯只有两个状态,那么要怎么让它实现50%亮度的效果的呢?只需要让它在一半时间,一半时间,交替执行这两个动作只要频率足够高,在人眼(低通滤波器)看起来就是50%亮度的样子了。而其中高电平占一个开关周期的比例,就叫做占空比

利用PWM可以实现使用离散的开关量来模拟连续的电压值

磁回路分析法

考察下图情况中的直流电机基本模型,根据磁极异性相吸同性相斥的原理,中间永磁体在两侧电磁铁的作用下会被施加一个力矩并发生旋转,这就是电机驱动的基本原理:


当两头的线圈通上电流时,根据右手螺旋定则,会产生方向指向右的外加磁感应强度B(如粗箭头方向所示),而中间的转子会尽量使自己内部的磁力线方向与外磁力线方向保持一致(同性相斥,异性相吸),以形成一个最短闭合磁力线回路,这样内转子就会按顺时针方向旋转了。

“当转子磁场方向与外部磁场方向垂直时,转子所受的转动力矩最大”。注意这里说的是“力矩”最大,而不是“力”最大。诚然,在转子磁场与外部磁场方向一致时,转子所受磁力最大,但此时转子呈水平状态,力臂为0,当然也就不会转动了。

当转子转到水平位置时,虽然不再受到转动力矩的作用,但由于惯性原因,还会继续顺时针转动,这时若改变两头螺线管的电流方向,如下图所示,转子就会继续顺时针向前转动。

如此不断改变两头螺线管的电流方向,内转子就会不停转起来了。改变电流方向的这一动作,就叫做换相(commutation)。注意:何时换相只与转子的位置有关,而与转速无关

三相二极内转子电机结构

一般来说,定子的三相绕组有星形联结方式三角联结方式,而“三相星形联结的二二导通方式”最为常用,故这里只对这种情况作详细分析。

上图显示了定子绕组的联结方式(转子未画出),三个绕组通过中心的连接点以“Y”型的方式被联结在一起。整个电机就引出三根线A, B, C。

当它们之间两两通电时,有6种情况,分别是AB, AC, BC, BA, CA, CB,下图分别描述了这6种情况下每个通电线圈产生的磁感应强度的方向(红、蓝色表示)和两个线圈的合成磁感应强度方向(绿色表示)。

在图(a)中,AB相通电,中间的转子(图中未画出)会尽量往绿色箭头方向对齐(逆时针),当转子到达图(a)中绿色箭头位置时,外线圈换相,改成AC相通电,这时转子会继续运动,并尽量往图(b)中的绿色箭头处对齐,当转子到达图(b)中箭头位置时,外线圈再次换相,改成BC相通电,再往后以此类推。当外线圈完成6次换相后,内转子正好旋转一周(即360°)。再次重申一下:何时换相只与转子位置有关,而与转速无关。

整个过程就好像骑在毛驴上吊一根胡萝卜一样,旋转的磁场牵引着永磁体不断旋转:

三相多绕组多极内转子电机的结构

搞清了最简单的三相三绕组二极电机,我们再来看一个复杂点的,图1-9(a)是一个三相九绕组六极(三对极)内转子电机,它的绕组连线方式见图1-9(b)。从图(b)可见,其三相绕组也是在中间点连接在一起的,也属于星形联结方式。一般而言,电机的绕组数量都和永磁极的数量是不一致的(比如用9绕组6极,而不是6绕组6极),这样是为了防止定子的齿与转子的磁钢相吸而对齐,此种情况下转矩会产生很大波动。

其二二导通时的6种通电情况与上述类似,原则是转子的N极与通电绕组的S极有对齐的运动趋势,而转子的S极与通电绕组的N极有对齐的运动趋势。为便于理解,下图给出了一个对齐的运动趋势的图例。

同样,整个运动过程就跟 三相二极内转子电机类似,磁场牵着转子运动:

外转子无刷直流电机的工作原理

看完了内转子无刷直流电机的结构,我们来看外转子的。其区别就在于,外转子电机将原来处于中心位置的磁钢做成一片片,贴到了外壳上,电机运行时,是整个外壳在转,而中间的线圈定子不动。

外转子无刷直流电机较内转子来说,转子的转动惯量要大很多(因为转子的主要质量都集中在外壳上),所以转速较内转子电机要慢,通常KV值在几百到几千之间,用在航模上可以直接驱动螺旋桨,而省去了机械减速机构。

无刷电机KV值定义为:转速/V,意思为输入电压每增加1伏特,无刷电机空转转速增加的转速值。比如说,标称值为1000KV的外转子无刷电机,在11伏的电压条件下,最大空载转速即为:11×1000=11000rpm(rpm的含义是:转/分钟)。

同系列同外形尺寸的无刷电机,根据绕线匝数的多少,会表现出不同的KV特性。绕线匝数多的,KV值低,最高输出电流小,扭力大;绕线匝数少的,KV值高,最高输出电流大,扭力小。

BLDC和PMSM的区别

无刷电机其实可以分为无刷直流电机BLDC,我们航模上都是用这种)和永磁同步电机PMSM),结构大同小异,主要区别在于制造方式(线圈绕组方式)不同导致的一些特性差异(比如反电动势的波形)。

PMSM采用短距分布绕组,有时也采用分数槽或正弦绕组,以进一步减小纹波转矩

BLDC采用整距集中绕组

从上面分析的无刷电机模型其实可以看到,由于转子在磁场中只有6个稳定的状态,因此旋转过程其实是不平滑的,存在扭矩的抖动(没有通电的时候可以用手转一下无刷电机,会感受到这种“颗粒感”)。因此为了解决这个问题,从“硬件”和从“软件”出发有两个解决方案,这就衍生出了BLDCPMSM的区别。

简单地说,BLDC由于反电动势接近梯形波,所以肯定是会有上面说的抖动问题的,但是转一圈抖6下太明显了,如果我增加电机槽、极对数(也就是磁铁对数),那以前是360度里面抖6下,现在变成120度里面抖6下,甚至更小,这样“颗粒感”不就变得更小了嘛?

实际中买到的BLDC电机基本都是多极对的(比如“三相多绕组多极内转子电机”)。BLDC也可以结合抗齿槽算法的FOC进行力矩补偿实现平滑控制。

而另一方面,为什么非得用方波这种不平滑的波来驱动电机呢,用正弦波它不香吗?是的,这就是PMSM解决问题的方式,由于PMSM的反电动势被设计为正弦波的形状,我们用软件和算法结合PWM技术将方波转变成等效的SPWM正弦波或者SVPWM马鞍波,再来驱动电机,控制效果很理想。当然为了产生更好的波形、更好的旋转磁场,驱动器、控制算法就变得非常复杂,这也是FOC的实现原理,后面会进行详细介绍

三相逆变电路

无刷电机的驱动电路主要使用三相逆变电路来实现,如下图:


所谓逆变电路,即把直流电变换为交流电.或者简单点说就是一个可以产生不同电流流向的电路,通过前面的电机模型分析我们也可以看出,对于无刷电机的驱动是需要在不同时刻施加不同方向的电压(电流)的,因此需要逆变电路。

而逆变电路具体的实现则一般是采用半桥MOS电路来制作的。半桥电路的原型如下,其实很简单,就是两个MOS管组成的上桥臂下桥臂,中间引出一条输出线:

3个半桥电路就可以组合成三相逆变电路,每个半桥引出的一根输出线跟无刷电机的一根相线相连,就完成了最基本的无刷驱动电路。

原理方面,MOS管可以看作电压控制的高速电子开关,在MOS管的栅极(上图中的High Drive和Low Drive)施加高电平或者低电平,就可以控制MOS源极和漏极的导通或者关闭。比如在下图中,我们打开第一组半桥的上桥臂、第二组和第三组半桥的下桥臂(其余的关闭),那么就可以让电流从电源正极流过电机的a相,流经b、c相,然后回到电源负极


于是通过控制三个半桥的不同开关状态,我们可以控制电流在电机中的不同流向了。

注意,在这个电路中,每个状态下电机的三相线圈都会有电流;而在上一节的示例中我们同一时刻只会让两相线圈有电流,另一相不起作用。
那么这么修改的原因是啥呢?当然是:浪费可耻啊~
浪费一相不用那不就白白损失了一部分扭矩嘛?通过上图中的方式驱动原理也是和之前分析一致的,但是可以产生更大的扭矩,所以当然是更好的选择啦。

接下来我们将半桥电路的状态做一个编码,首先限定一个半桥只有两种状态:

  • 上桥开通下桥关断定义为状态1
  • 上桥关断下桥开通定义为状态0

这样,三组半桥就一共有8种组合方式,编码分别为:000、001、010、011、100、101、110、111

为什么一个半桥只能上桥臂和下桥臂有一个导通呢?都关闭或者都导通不行??
上下都导通显然是不可能的,因为这就相当于把电源短路了
那上下都断开呢?也不需要,因为这样就回到前面提到的,这时候电机有一相不起作用,浪费。
实际上半桥驱动电路的实现会比上面的分析要复杂一些,比如需要考虑开关管的开关频率、开启和关断时间不对称、死区问题等等,FOC驱动使用的是专用的半桥MOS栅极驱动IC来实现的。

三相电机波形

按照前面的无刷电机基本模型,假设我们拿到这样一个电机,手动匀速转动它的转子,然后用示波器观察它的三相输出电压(也就是反电动势产生的电压),会看到什么波形呢?

其实很自然可以想到,我们会得到3根正弦曲线,而且三根曲线两两相位差为120°:


实际上三相发电机的发电原理就是这样的,输出的就是三相幅值为220V的交流电(线电压为380V,即 2 ∗ 220 \sqrt{2}*220 2 ​∗220 ​V)。

发电机反过来就是电动机,所以假如反过来我们在三相无刷电机的三相线圈上输入上述三相正弦电压,那么就可以驱动无刷电机平稳高效地旋转了。

而这也是FOC驱动无刷电机的基本手段,即通过计算所需电压矢量,使用 SVPWM 技术产生调试信号,驱动三相逆变电路,合成出等效的三相正弦电压驱动电机

这个会在后面进行详细介绍。

FOC控制原理

FOC算法的Pipeline

我们先来看一下FOC控制的整个流程图景:


稍微解释一下,这幅图是以电流闭环控制为例的,也就是让电机始终产生一个恒定的力矩(也就是恒定的电流,因为力矩和电流成正比)。

可以看到控制器的输入是最左边的 I q _ r e f I_{q\_ref} Iq_ref​和 I d _ r e f I_{d\_ref} Id_ref​​,两个变量经过PID控制器进行反馈调节,其中还涉及到几个变换模块,有Park变换Clark变换;最后通过前面提到的SVPWM模块作用到三相逆变器上进而控制电机;而PID控制器的反馈量,是对电机输出电流的采样值。

先概括一下,FOC控制的整个过程是这样的:

  1. 对电机三相电流进行采样得到 I a , I b , I c I_a, I_b, I_c Ia​,Ib​,Ic​
  2. 将 I a , I b , I c I_a, I_b, I_c Ia​,Ib​,Ic​经过Clark变换得到​ I α , I β I_\alpha, I_\beta Iα​,Iβ​
  3. 将 I α , I β I_\alpha, I_\beta Iα​,Iβ​经过Park变换得到​ I q , I d I_q, I_d Iq​,Id​
  4. 计算​ I q , I d I_q, I_d Iq​,Id​和其设定值 I q _ r e f , I d _ r e f I_{q\_ref}, I_{d\_ref} Iq_ref​,Id_ref​的误差
  5. 将上述误差输入两个PID(只用到PI)控制器,得到输出的控制电压​ U q , U d U_q, U_d Uq​,Ud​
  6. 将 U q , U d U_q, U_d Uq​,Ud​进行反Park变换得到​ U α , U β U_\alpha, U_\beta Uα​,Uβ​
  7. 用​ U α , U β U_\alpha, U_\beta Uα​,Uβ​合成电压空间矢量,输入SVPWM模块进行调制,输出该时刻三个半桥的状态编码值(前文有提到)
  8. 按照前面输出的编码值控制三相逆变器的MOS管开关,驱动电机
  9. 循环上述步骤

下面我们来分别介绍每一步的具体操作以及意义。

Clark变换与Park变换

Clark变换

我们回到上面FOC控制过程9个步骤的第1步,也就是对电机的三个相电流进行采样,这一步会使用串联的采样电阻(Shunt)进行电流采样。

由于电机工作的电流一般很大,所以采样电阻的阻值非常小,甚至和导线的电阻接近了,因而实际的采样电路PCB设计的时候还有一些讲究,比如使用开尔文接法(Kelvin connections)

但是我们实际电路设计时可以不使用三个采样器(实际有单采样电阻、双采样电阻和三采样电阻接法),只需要两个就够了。因为由基尔霍夫电流定律(KCL),在任一时刻,流入节点的电流之和等于流出节点的电流之和,也就是说​

I a + I b + I c = 0 I_a+I_b+I_c=0 Ia​+Ib​+Ic​=0

只需要知道其中两个就可以计算出第三个了。

这三个电流基本上就是三个相位相差120度的正弦波,在把这些信号输入控制器反馈控制之前,我们先来做点数学游戏:

我们知道三相坐标系 ( I a , I b , I c ) (I_a, I_b, I_c) (Ia​,Ib​,Ic​)如下:

问题:这明明是一个二维平面内的坐标系,为啥要用3个坐标轴来表示呢?

而且很明显 ( I a , I b , I c ) (I_a, I_b, I_c) (Ia​,Ib​,Ic​)这三个基向量是非正交的,学过线性代数的同学可能会想到,我们可以做一个很简单的基变换将其正交化为一个直角坐标系,我们把新的直角坐标系命名为 α − β \alpha-\beta α−β坐标系,变换公式如下:

其实就是个很简单的坐标轴投影计算,写成矩阵形式如下:

于是我们就回到直角坐标系,变换前后的波形如下:

可以看到变换后其实还是正弦波…只不过我们少了一个需要控制的变量了,现在只需要控制​ I α , I β I_\alpha, I_\beta Iα​,Iβ​这两个变量,让其满足上图的下面的波形变化规律就可以控制电机旋转 了,频率还是不变的。

注意这里的​ 是我们虚拟出来的变量,所以在计算出一组 I α , I β I_\alpha, I_\beta Iα​,Iβ​后,我们通过上述公式的反向变换公式变换回去再应用到电机的三相上。

如果只是为了减小一个控制变量那这个变换/反变换操作显然有点多此一举。

有趣的是我们还可以接着变换:虽然 α − β \alpha-\beta α−β坐标系下少了一维变量,但是新的变量还是非线性的(正弦),有没有办法把它们线性化呢?有的,Park变换就是做这个工作的。

Park变换

这一步中我们接着Clark变换将 α − β \alpha-\beta α−β坐标系旋转 θ \theta θ度,其中 θ \theta θ是转子当前的角度,如下图:


变换公式如下:

也很简单,就是作用了一个旋转矩阵,写成矩阵形式:

也就是说,这个 d − q d-q d−q坐标系是始终跟着转子旋转的!


dq坐标系是建立在转子上的直角坐标系,其中 d 轴方向与转子磁链方向重合,又叫直轴; q 轴方向与转子磁链方向垂直,又叫交轴; d轴和

FOC算法与SVPWM技术相关推荐

  1. 转稚晖军大佬 --【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术

    转稚晖军大佬 --[自制FOC驱动器]深入浅出讲解FOC算法与SVPWM技术 [自制FOC驱动器]深入浅出讲解FOC算法与SVPWM技术 0.前言 最近想做一个机器人项目,设计中需要用到高性能超小体积 ...

  2. 深入浅出讲解FOC控制与SVPWM技术

    深入浅出讲解FOC控制与SVPWM技术 0.前言 0.1 什么是FOC 0.2 FOC驱动器和无刷电调的区别 1.从电机原理说起 1.1 一些基础知识 1.2 无刷电机原理 1.3 关于BLDC和PM ...

  3. 图论算法及其matlab实现_BLDC有感FOC算法理论及其STM32软硬件实现

    用来做机器人关节伺服 详情见以下博文,建议电脑端浏览.位置速度电流三环控制,后期存在优化空间,整个项目为模仿Odrive实现. BLDC有感FOC算法理论及其STM32软硬件实现 - 我叫平沢唯 - ...

  4. 有感FOC算法学习与实现总结(转)

    原文:https://blog.csdn.net/u010632165/article/details/103656254 文章目录 基于STM32的有感FOC算法学习与实现总结 1 前言 2 FOC ...

  5. STM32 电机教程 22 - 基于ST MCLIB无感FOC算法变有感(HALL)FOC算法

    前言 磁场定向控制又称矢量控制(FOC), 本质上为控制定子电流的幅度和相位,使之产生的磁场和转子的磁场正交,以产生最大的扭矩. PMSM的磁场定向控制框图如下图所示: 第21讲对比分析了基于ST M ...

  6. 无感FOC算法中解决单电阻采样重构三相电流的难题

    大四在某公司实习,主要是做无刷电机控制算法,在学习FOC的过程中,因为公司要压低产品成本,只能允许我用单电阻采样的方式来做电流环.于是我就到处找单电阻采样的资料,跑遍了各大论坛,资料少的可怜,只能讲出 ...

  7. 三六相PMSM的FOC算法的数字实现(二)

    三六相PMSM的FOC算法的数字实现(二) 第二章 SVPWM算法 2.1 基本电压矢量的由来 2.2 扇区判断 2.3 非零矢量(基本电压矢量)作用时间计算 2.4 SVPWM的调制原则(开关顺序如 ...

  8. 基于MWORKS.Sysplorer的电子控制器应用案例——永磁同步电机FOC算法建模

    1  前言 MWORKS是面向数字工程的新一代科学计算与系统建模仿真平台,可提供机械.电子.液压.控制.热.信息等多领域统一建模仿真环境.经过同元持续攻关,全新推出的MWORKS.Sysplorer嵌 ...

  9. 有感FOC算法学习与实现总结

    文章目录 基于STM32的有感FOC算法学习与实现总结 1 前言 2 FOC算法架构 3 坐标变换 3.1 Clark变换 3.2 Park变换 3.3 Park反变换 4 SVPWM 5 反馈部分 ...

最新文章

  1. 【Java】多线程相关复习—— 线程的创建、名字、运行情况以及顺序控制(join方法) 【一】...
  2. 二进制包安装MySQL数据库
  3. kali安装vmtools不能拖拽(复制粘贴)文件解决方法
  4. 服务器之select
  5. 前端学习(2577):Nuxt解决了什么问题
  6. mongodb python 存文件_Python保存MongoDB上的文件到本地的方法介绍
  7. msf:Known bug in WMI query, try migrating to another process
  8. php bt种子转换电驴地址,bt转换ed2k_BT文件转磁力链接工具 BT种子文件转换成ed2k链接...
  9. Freepiano如何使用sf2音源,sfark如何转换至sf2?
  10. 安信可BT-02 Mesh组网的AT指令集
  11. 圆形区域的半透明填充
  12. RGB(三色)灯配置常用颜色数据,用法讲解,基于C语言的程序讲解,七彩渐变程序讲解
  13. 树莓派连接笔记本电脑
  14. 软件设计师-1.计算机系统知识
  15. TOP Network 2019年度回顾:积蓄力量,再创辉煌
  16. 重组的脱氧核糖核酸酶 I,生物工艺级相关研究
  17. Unix时间戳和北京时间的相互转换(C语言实现 )
  18. 初学Linux对开机启动流程的相关实验
  19. istio-code
  20. 面试大厂,我是这样准备项目的

热门文章

  1. 2020年计算机保研记录(浙软,东华,南航,河海)
  2. java sql语句格式化_显示和格式化SQL语句
  3. 客户端开发是做什么的_做程序员需要哪些技能?会开发什么软件?
  4. 寻找几种常见的推广模式
  5. 葡萄城首席架构师:前端开发与Web表格控件技术解读
  6. 观《华尔街:金钱永不眠》有感
  7. 百度红包预热活动被封锁
  8. 理解矩阵,与矩阵背后的现实意义
  9. 赶紧看!阿里架构师必备“绝杀版”Tomact 架构笔记堪称绝技
  10. BK3633,蓝牙低功耗ble5.2双模-soc,2.4g专有协议,layou指南规格书