0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述FOC电机控制之SVPWM原理(下)

jf_78858299 来源:Spring嵌入式工作室 作者:SpringLtc 2023-04-20 16:07 次阅读

2.3 计算相邻两个基本矢量电压的作用时间:

扇区判断结束后,就是计算相邻两个基本矢量电压的作用时间

在扇区1时,由U6和U4合成,设在一个时间周期Ts内,U4作用的时间为T4,U6作用的时间为T6。由 基本矢量电压在αβ轴上的投影 和 目标矢量电压在αβ轴上的投影 分别相等建立等式:

图片

图片

图片

图片

图片

图片

到这里,计算出来的公式看着有点复杂,所以我们通过下面的方式稍稍简化一下,记:

图片

则在各个扇区内的作用时间就分别为:

图片

到这里,合成目标矢量电压Uref需要的两个相邻矢量电压Ux,Uy以及分别作用的时间Tx,Ty就计算好了,但这里计算出来的时间不一定刚好满足Tx+Ty=Ts,当Tx+Ty>Ts时需要进行等比例缩小处理,处理方式如下:

图片

当Tx+Ty

图片

2.4 三路PWM占空比计算

目标矢量电压的所在扇区知道了,相邻两个基本矢量电压及其作用时间也知道了,接下来就是7段式SVPWM的生成了。所谓的7段式SVPWM,即在一个周期Ts内,基本电压矢量的作用顺序为

图片

作用的时间分别为:

图片

以在第1扇区为例:基本电压矢量作用的顺序为

图片

对应的三相电压波形为:

图片

这里,可能会问,Tx,Ty和U4,U6是怎么对应的呢?为什么要先U4再U6呢?把各个扇区的作用顺序竖着列出来就能看出来了:

扇区 U0 Ux Uy U7 Uy Ux U0
1 0 4 6 7 6 4 0
2 0 2 6 7 6 2 0
3 0 2 3 7 3 2 0
4 0 1 3 7 3 1 0
5 0 1 5 7 5 1 0
6 0 4 5 7 5 4 0
1 0 4 6 7 6 4 0

可以看出,从一个扇区进入相邻的另一个扇区时,只有一个基本矢量电压发生改变。即通过这样的作用顺序,可以减小开关管的切换次数,从而减少开关损耗,尤其是在负载电流较大时更应该减小开关切换次数。

然后就是根据基本矢量电压的作用时间去计算逆变H桥的占空比了,

仍然先以第1扇区为例:基本矢量电压作用的顺序为

图片

即在一个周期Ts时间内,前面定义的开关函数

S(C)=1的时间为图片

S(B)=1的时间为图片

S(A)=1的时间为图片

对应的ABC三路PWM的占空比就分别为图片。注意的是,看上面的三相电压波形可知,输出的PWM波时高电平中间对齐,所以在对你所使用的微控制器MCU的PWM定时器进行配置的时候要注意设置好计数方向(一般先向上计数在向下计数)和输出极性(超过阈值为高电平)。

对于其他几个扇区类似,这里不再重复详细叙述,列个表出来

图片

图片

这里说明一下,前面进行Clarke变换和park变换的所有电压电流参数都是标幺值,这里的Uα和Uβ采用的也是标幺值。

我们合成的输出目标矢量电压也用标幺值表示(令Uref_max=1),并令Ts=1时,这里的系数K就等于常数1,这样的话,我们计算的时间Ta,Tb,Tc就等于占空比。下面简单证明一下why。

仍以第1扇区为例:

已知最终的目标矢量电压最大不失真的幅值为图片

图片,我们已经计算的有图片

图片(这里的Ux,Uy已经是标幺值)

令Uref_max=1把目标矢量电压标幺值化,再令Ts=1,就可以把非零电压作用的时间转化为标幺值。

所以,我们在程序计算处理的时候,直接令K=1,然后按照上面列表计算出来的Ta,Tb,Tc就可以直接作为占空比了,占空比再乘以PWM定时器的计数周期值,就可以得到比较寄存器的值了,这样计算量就减小很多了,然后就完成了整个SVPWM的操作。

剩下的就是PWM定时器相关的操作了,这里不详说,后面有时间我再针对DSPSTM32这两款处理器做简要介绍。

04.算法流程

接着上一篇的坐标变换(上一篇链接:https://mp.weixin.qq.com/s/4PbY2FbnXcN2ai4aolGVcg)

上篇已经介绍,由park逆变换计算得到Uα,Uβ

step1:扇区判断

计算图片,根据U1,U2,U3的符号计算N=4C+2B+A,再结合扇区表判断所处的扇区。

C语言代码示例:

v.U1 = v.Ubeta;                                         \\
    v.U2 = ( v.Ualpha*0.8660254) - (v.Ubeta*0.5);           \\
    v.U3 = (-v.Ualpha*0.8660254) - (v.Ubeta*0.5);           \\
    v.Sector = 0;                                           \\
    if(v.U1 > 0)    v.Sector += 1;                          \\
    if(v.U2 > 0)    v.Sector += 2;                          \\
    if(v.U3 > 0)    v.Sector += 4;                          \\

step2:计算基本矢量电压作用时间(占空比)

计算图片,并根据扇区确定相邻两个基本矢量电压及其作用时间,然后对作用时间进行等比例缩小处理或引入零矢量电压处理,使得总的作用时间等于Ts,或总的占空比等于1。

C语言代码示例:

v.Tx = v.Ubeta;                                         \\
    v.Ty = ( v.Ualpha*0.8660254) + (v.Ubeta*0.5);           \\
    v.Tz = (-v.Ualpha*0.8660254) + (v.Ubeta*0.5);           \\
    switch(v.Sector)                                        \\
    {                                                       \\
        case 1:{                                            \\
            v.t1=v.Tz; v.t2=v.Ty;                           \\
            if((v.t1+v.t2)>1){                              \\
                v.t1 = v.t1/(v.t1+v.t2);                    \\
                v.t2 = v.t2/(v.t1+v.t2);                    \\
            }                                               \\
            v.Tb = 0.5*(1-v.t1-v.t2);                       \\
            v.Ta = v.Tb + v.t1;                             \\
            v.Tc = v.Ta + v.t2;}break;                      \\
        case 2:{                                            \\
            v.t1=v.Ty; v.t2=-v.Tx;                          \\
            if((v.t1+v.t2)>1){                              \\
                v.t1 = v.t1/(v.t1+v.t2);                    \\
                v.t2 = v.t2/(v.t1+v.t2);                    \\
            }                                               \\
            v.Ta = 0.5*(1-v.t1-v.t2);                       \\
            v.Tc = v.Ta + v.t1;                             \\
            v.Tb = v.Tc + v.t2;}break;                      \\
        case 3:{                                            \\
            v.t1=-v.Tz; v.t2=v.Tx;                          \\
            if((v.t1+v.t2)>1){                              \\
                v.t1 = v.t1/(v.t1+v.t2);                    \\
                v.t2 = v.t2/(v.t1+v.t2);                    \\
            }                                               \\
            v.Ta = 0.5*(1-v.t1-v.t2);                       \\
            v.Tb = v.Ta + v.t1;                             \\
            v.Tc = v.Tb + v.t2;}break;                      \\
        case 4:{                                            \\
            v.t1=-v.Tx; v.t2=v.Tz;                          \\
            if((v.t1+v.t2)>1){                              \\
                v.t1 = v.t1/(v.t1+v.t2);                    \\
                v.t2 = v.t2/(v.t1+v.t2);                    \\
            }                                               \\
            v.Tc = 0.5*(1-v.t1-v.t2);                       \\
            v.Tb = v.Tc + v.t1;                             \\
            v.Ta = v.Tb + v.t2;}break;                      \\
        case 5:{                                            \\
            v.t1=v.Tx; v.t2=-v.Ty;                          \\
            if((v.t1+v.t2)>1){                              \\
                v.t1 = v.t1/(v.t1+v.t2);                    \\
                v.t2 = v.t2/(v.t1+v.t2);                    \\
            }                                               \\
            v.Tb = 0.5*(1-v.t1-v.t2);                       \\
            v.Tc = v.Tb + v.t1;                             \\
            v.Ta = v.Tc + v.t2;}break;                      \\
        case 6:{                                            \\
            v.t1=-v.Ty; v.t2=-v.Tz;                         \\
            if((v.t1+v.t2)>1){                              \\
                v.t1 = v.t1/(v.t1+v.t2);                    \\
                v.t2 = v.t2/(v.t1+v.t2);                    \\
            }                                               \\
            v.Tc = 0.5*(1-v.t1-v.t2);                       \\
            v.Ta = v.Tc + v.t1;                             \\
            v.Tb = v.Ta + v.t2;}break;                      \\

step3:计算PWM定时器比较寄存器值

这个很简单,就是用占空比乘以定时器的计数周期

C语言代码如下:

EPwm1Regs.CMPA.half.CMPA = (int16)(MPeriod * Svpwm1.Ta);
EPwm2Regs.CMPA.half.CMPA = (int16)(MPeriod * Svpwm1.Tb);
EPwm3Regs.CMPA.half.CMPA = (int16)(MPeriod * Svpwm1.Tc);
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电压
    +关注

    关注

    45

    文章

    5605

    浏览量

    115758
  • SVPWM
    +关注

    关注

    14

    文章

    614

    浏览量

    90612
  • FOC
    FOC
    +关注

    关注

    20

    文章

    322

    浏览量

    42819
收藏 人收藏

    评论

    相关推荐

    如何理解foc控制 伺服电机foc控制

    如何理解foc控制FOC控制是一种高级电机控制技术,可以提高
    的头像 发表于 07-31 17:28 2696次阅读
    如何理解<b class='flag-5'>foc</b><b class='flag-5'>控制</b> 伺服<b class='flag-5'>电机</b>有<b class='flag-5'>foc</b><b class='flag-5'>控制</b>吗

    SVPWM/FOC

    那位是用79F9211和STM32F103做SVPWMFOC的高手,请联络,有偿,我的MAIL:txftn@163.com
    发表于 03-20 15:19

    必学的BLDC电机控制算法——FOC简述

    =0Id=0 。之后我将详细介绍一这个算法的数学原理和一些自己的理解。FOC矢量控制总体算法简述输入:位置信息,两相采样电流值,(3相电流、电机
    发表于 10-14 10:51

    深入浅出讲解FOC算法与SVPWM技术

    参考资料:【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术FOC入门教程FOC实现过程中主要公式整理永磁
    发表于 08-30 06:22

    FOC电机控制相关资料下载

    FOC电机控制,一份基于国产M0核MCU平台,风机量产程序,包含龙博格电机观测器,SVPWM,顺逆风启动,五段式与七段式调制等源码,完全可以
    发表于 11-10 09:34

    实现电机SVPWM旋转的FOC频率大概是多少

    我设计了一个FOC板。首先,我想在不使用其他变换的情况实现SVPWM,以使电机先旋转。PWMC_SetPhaseVoltage(pwmcHandle, Valphabeta);所以我
    发表于 12-19 07:44

    手把手教你无感FOC电机控制,MATLAB代码生成

    华夏电子工作室:2023年6月8日下午3点(15:00)电机控制MATLAB代码生成系列课程直播第一季。邀请各位工程师准时来直播间讨论和观看。届时代码全开源。 下面我们来说一FOC
    发表于 05-29 10:12

    简述FOC电机控制SVPWM原理(上)

    SVPWM(Space Vector Pulse Width Modulation),即空间矢量脉宽调制。SVPWM的理论基础是平均值等效原理,即在一个开关周期Ts内,对基本矢量电压加以组合,使其
    的头像 发表于 04-20 16:06 8615次阅读
    <b class='flag-5'>简述</b><b class='flag-5'>FOC</b><b class='flag-5'>电机</b><b class='flag-5'>控制</b><b class='flag-5'>之</b><b class='flag-5'>SVPWM</b>原理(上)

    电机foc是什么意思 svpwmfoc的区别

    SVPWM是一种基于矢量控制的功率电子调制技术,与FOC不同的是,SVPWM通过调节电压幅值和相位角度控制
    发表于 05-02 10:54 1.3w次阅读

    嵌入式--所有电机控制FOC的总结

    嵌入式–FOC的总结我们在很多设计上会用到FPGA控制电机,比如伺服电机,直流无刷电机,也有很多人用STM32来
    发表于 05-05 14:29 20次下载
    嵌入式--所有<b class='flag-5'>电机</b><b class='flag-5'>控制</b>的<b class='flag-5'>FOC</b>的总结

    电机控制---SVPWM扇区判断的实现以及推导过程

    电机控制SVPWM扇区判断的实现以及推导过程 1.一般的Svpwm模块中,输入量为Vα、Vβ,得到三相计数器的Compare的值,最后输出U、V、W三相电压。在
    发表于 05-05 11:05 5次下载
    <b class='flag-5'>电机</b><b class='flag-5'>控制</b>---<b class='flag-5'>SVPWM</b>扇区判断的实现以及推导过程

    电机控制--FOC的优势

    FOC(Field-Oriented Control),即磁场定向控制,也称矢量变频,是以数学、物理理论为基础,对电机磁场矢量进行精确控制电机
    发表于 05-05 11:14 15次下载
    <b class='flag-5'>电机</b><b class='flag-5'>控制</b>--<b class='flag-5'>FOC</b>的优势

    BLDC电机控制算法FOC简述

    最近做完了一个直流无刷电机电机调速项目,查阅了各种大神所写的博客和论文,在这里我只做一小小的总结:(PS最近有遇到相关课题,发现以前的描述并不完整,因此又补充了一些。) FOC
    的头像 发表于 05-19 16:34 2050次阅读
    BLDC<b class='flag-5'>电机</b><b class='flag-5'>控制</b>算法<b class='flag-5'>之</b><b class='flag-5'>FOC</b><b class='flag-5'>简述</b>

    如何理解foc控制 伺服电机foc控制

    FOC控制是一种高级电机控制技术,可以提高电机的功率、效率和控制精度。
    的头像 发表于 06-10 17:39 3839次阅读

    FOC电机与BLDC电机的比较

    FOC电机与BLDC电机在电动车及其他应用领域中都扮演着重要角色,但它们在控制方式和性能特点上存在一些差异。以下是对FOC
    的头像 发表于 11-21 15:25 1040次阅读