0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡述FOC電機控制之SVPWM原理(下)

jf_78858299 ? 來源:Spring嵌入式工作室 ? 作者:SpringLtc ? 2023-04-20 16:07 ? 次閱讀

2.3 計算相鄰兩個基本矢量電壓的作用時間:

扇區(qū)判斷結束后,就是計算相鄰兩個基本矢量電壓的作用時間

在扇區(qū)1時,由U6和U4合成,設在一個時間周期Ts內,U4作用的時間為T4,U6作用的時間為T6。由 基本矢量電壓在αβ軸上的投影 和 目標矢量電壓在αβ軸上的投影 分別相等建立等式:

圖片

圖片

圖片

圖片

圖片

圖片

到這里,計算出來的公式看著有點復雜,所以我們通過下面的方式稍稍簡化一下,記:

圖片

則在各個扇區(qū)內的作用時間就分別為:

圖片

到這里,合成目標矢量電壓Uref需要的兩個相鄰矢量電壓Ux,Uy以及分別作用的時間Tx,Ty就計算好了,但這里計算出來的時間不一定剛好滿足Tx+Ty=Ts,當Tx+Ty>Ts時需要進行等比例縮小處理,處理方式如下:

圖片

當Tx+Ty

圖片

2.4 三路PWM占空比計算

目標矢量電壓的所在扇區(qū)知道了,相鄰兩個基本矢量電壓及其作用時間也知道了,接下來就是7段式SVPWM的生成了。所謂的7段式SVPWM,即在一個周期Ts內,基本電壓矢量的作用順序為

圖片,

作用的時間分別為:

圖片。

以在第1扇區(qū)為例:基本電壓矢量作用的順序為

圖片,

對應的三相電壓波形為:

圖片

這里,可能會問,Tx,Ty和U4,U6是怎么對應的呢?為什么要先U4再U6呢?把各個扇區(qū)的作用順序豎著列出來就能看出來了:

扇區(qū) 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

可以看出,從一個扇區(qū)進入相鄰的另一個扇區(qū)時,只有一個基本矢量電壓發(fā)生改變。即通過這樣的作用順序,可以減小開關管的切換次數,從而減少開關損耗,尤其是在負載電流較大時更應該減小開關切換次數。

然后就是根據基本矢量電壓的作用時間去計算逆變H橋的占空比了,

仍然先以第1扇區(qū)為例:基本矢量電壓作用的順序為

圖片

即在一個周期Ts時間內,前面定義的開關函數

S(C)=1的時間為圖片,

S(B)=1的時間為圖片

S(A)=1的時間為圖片。

對應的ABC三路PWM的占空比就分別為圖片。注意的是,看上面的三相電壓波形可知,輸出的PWM波時高電平中間對齊,所以在對你所使用的微控制器MCU的PWM定時器進行配置的時候要注意設置好計數方向(一般先向上計數在向下計數)和輸出極性(超過閾值為高電平)。

對于其他幾個扇區(qū)類似,這里不再重復詳細敘述,列個表出來

圖片

圖片

這里說明一下,前面進行Clarke變換和park變換的所有電壓電流參數都是標幺值,這里的Uα和Uβ采用的也是標幺值。

我們合成的輸出目標矢量電壓也用標幺值表示(令Uref_max=1),并令Ts=1時,這里的系數K就等于常數1,這樣的話,我們計算的時間Ta,Tb,Tc就等于占空比。下面簡單證明一下why。

仍以第1扇區(qū)為例:

已知最終的目標矢量電壓最大不失真的幅值為圖片,

圖片,我們已經計算的有圖片,

圖片(這里的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:扇區(qū)判斷

計算圖片,根據U1,U2,U3的符號計算N=4C+2B+A,再結合扇區(qū)表判斷所處的扇區(qū)。

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:計算基本矢量電壓作用時間(占空比)

計算圖片,并根據扇區(qū)確定相鄰兩個基本矢量電壓及其作用時間,然后對作用時間進行等比例縮小處理或引入零矢量電壓處理,使得總的作用時間等于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);
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 電壓
    +關注

    關注

    45

    文章

    5517

    瀏覽量

    115383
  • SVPWM
    +關注

    關注

    14

    文章

    614

    瀏覽量

    90523
  • FOC
    FOC
    +關注

    關注

    20

    文章

    315

    瀏覽量

    42522
收藏 人收藏

    評論

    相關推薦

    如何理解foc控制 伺服電機foc控制

    如何理解foc控制FOC控制是一種高級電機控制技術,可以提高
    的頭像 發(fā)表于 07-31 17:28 ?2412次閱讀
    如何理解<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
    發(fā)表于 03-20 15:19

    必學的BLDC電機控制算法——FOC簡述

    =0Id=0 。之后我將詳細介紹一這個算法的數學原理和一些自己的理解。FOC矢量控制總體算法簡述輸入:位置信息,兩相采樣電流值,(3相電流、電機
    發(fā)表于 10-14 10:51

    深入淺出講解FOC算法與SVPWM技術

    參考資料:【自制FOC驅動器】深入淺出講解FOC算法與SVPWM技術FOC入門教程FOC實現過程中主要公式整理永磁
    發(fā)表于 08-30 06:22

    FOC電機控制相關資料下載

    FOC電機控制,一份基于國產M0核MCU平臺,風機量產程序,包含龍博格電機觀測器,SVPWM,順逆風啟動,五段式與七段式調制等源碼,完全可以
    發(fā)表于 11-10 09:34

    實現電機SVPWM旋轉的FOC頻率大概是多少

    我設計了一個FOC板。首先,我想在不使用其他變換的情況實現SVPWM,以使電機先旋轉。PWMC_SetPhaseVoltage(pwmcHandle, Valphabeta);所以我
    發(fā)表于 12-19 07:44

    手把手教你無感FOC電機控制,MATLAB代碼生成

    華夏電子工作室:2023年6月8日下午3點(15:00)電機控制MATLAB代碼生成系列課程直播第一季。邀請各位工程師準時來直播間討論和觀看。屆時代碼全開源。 下面我們來說一FOC
    發(fā)表于 05-29 10:12

    【硬聲推薦】電機FOC控制視頻合集

    FOC(Field-Oriented Control),即磁場定向控制,也稱矢量變頻,是目前高效控制無刷直流電機(BLDC)和永磁同步電機
    的頭像 發(fā)表于 12-14 11:32 ?2457次閱讀

    簡述FOC電機控制SVPWM原理(上)

    SVPWM(Space Vector Pulse Width Modulation),即空間矢量脈寬調制。SVPWM的理論基礎是平均值等效原理,即在一個開關周期Ts內,對基本矢量電壓加以組合,使其
    的頭像 發(fā)表于 04-20 16:06 ?7994次閱讀
    <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的區(qū)別

    SVPWM是一種基于矢量控制的功率電子調制技術,與FOC不同的是,SVPWM通過調節(jié)電壓幅值和相位角度控制
    發(fā)表于 05-02 10:54 ?1.2w次閱讀

    嵌入式--所有電機控制FOC的總結

    嵌入式–FOC的總結我們在很多設計上會用到FPGA控制電機,比如伺服電機,直流無刷電機,也有很多人用STM32來
    發(fā)表于 05-05 14:29 ?20次下載
    嵌入式--所有<b class='flag-5'>電機</b><b class='flag-5'>控制</b>的<b class='flag-5'>FOC</b>的總結

    電機控制---SVPWM扇區(qū)判斷的實現以及推導過程

    電機控制SVPWM扇區(qū)判斷的實現以及推導過程 1.一般的Svpwm模塊中,輸入量為Vα、Vβ,得到三相計數器的Compare的值,最后輸出U、V、W三相電壓。在
    發(fā)表于 05-05 11:05 ?5次下載
    <b class='flag-5'>電機</b><b class='flag-5'>控制</b>---<b class='flag-5'>SVPWM</b>扇區(qū)判斷的實現以及推導過程

    電機控制--FOC的優(yōu)勢

    FOC(Field-Oriented Control),即磁場定向控制,也稱矢量變頻,是以數學、物理理論為基礎,對電機磁場矢量進行精確控制電機
    發(fā)表于 05-05 11:14 ?15次下載
    <b class='flag-5'>電機</b><b class='flag-5'>控制</b>--<b class='flag-5'>FOC</b>的優(yōu)勢

    BLDC電機控制算法FOC簡述

    最近做完了一個直流無刷電機電機調速項目,查閱了各種大神所寫的博客和論文,在這里我只做一小小的總結:(PS最近有遇到相關課題,發(fā)現以前的描述并不完整,因此又補充了一些。) FOC
    的頭像 發(fā)表于 05-19 16:34 ?1953次閱讀
    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控制是一種高級電機控制技術,可以提高電機的功率、效率和控制精度。
    的頭像 發(fā)表于 06-10 17:39 ?3593次閱讀