svpwm的matlab模擬實現

wangyuying0909發表於2014-06-04

svpwm的MATLAB模擬實現

為了能讓大家在已經氾濫的知識上少走彎路,本人把自己在SVPWM上的認識與看到此貼的讀者們一起分享,廢話少說,切入正題:在看下面內容之前,您應該至少對SVPWM的原理有大致的瞭解,如果不瞭解也沒關係,你只要按照我交給你的步驟來做,也可以輕而易舉的跨過SVPWM這道坎,在模擬之前您必須安裝MATLAB7.0或以上版本,必須確保simpowersysm工具箱已被安裝,如果以上要求已經達到,那麼就可以執行以下步驟了:

步驟1:開啟matlab主介面,然後在command window介面中的“>>”旁邊輸入simulink,開啟simulink開發環境後新建一個mdl檔案,在simulink下拉選單中的ports&subsystems中找到subsystem模組,用其建立一個如圖1的總的模組,這個模組有兩個輸入口,一個輸出口(實際上包含六路PWM訊號),接來的東西都將在這個模組中新增,輸入輸出模組的名稱可以在雙擊模組後自己更改,其中Vahar,Vbetar是需要輸出的電壓在兩相靜止座標系下的兩個分量,輸出是控制逆變器六個IGBT的pwm脈衝訊號。

圖1

也許有人會問,輸入引數不是還包括直流電壓和功率開關頻率嗎?別急,下面接著讓您看到上述模組的內部情況

步驟2:根據圖2,新增subsystem的核心模組,裡面用到的模組有以下幾種:in,out,mux,demux,repeating sequence,rational operator,logical operator和裡面的主角S-Function builder模組。

圖2

可以看到輸入有四個引數Vapha,Vbeta,Tz,Vdc,輸出為六路PWM訊號,這個模擬模組沒考慮死區的問題;

取Tz為1/(1e+4)這就是說開個頻率是10kHz,Vdc為500,這兩個引數要根據實際情況自己設定,這裡是我任意設的,repeating sequence的設定如圖3所示,這樣設的目的是想產生一個週期為Tz,峰值為Tz/2的等腰直角三角形調製波,接下來設定兩個比較模組和取反模組,比較模組是大於等於關係,各模組的其他引數,我沒說的就當預設設定,細心的讀者會在圖4中的第一幅圖中看到模擬時間設為Ts,這是我設的系統模擬步長,這裡就用預設值-1,此外比較模組和取反模組的訊號屬性signal atrributes均應設為Boolean格式。

圖3

圖4

步驟3:設定s-builder模組,這個設定也很簡單,但是看起來有點多,圖2中的svpwm模組就是用simulink中的s-function builder建立的,只是名字改成svpwm罷了,有圖2可以看出svpwm產生的三個時間比較值與repeating sequence產生的等腰三角波進行比較,從而產生想要的六路PWM波,svpwm的核心演算法是使用C語言編寫的,下面詳細介紹該模組的設定,s-fanction builder的介面如下圖:

圖5

在s-function name 中輸入svpwm,如果你把我下面說的設定完後,再按一下s-function name旁邊的build,接著就會在matlab的顯示路徑資料夾中(如“我的文件/matlab”)產生幾個格式各異的以svpwm開頭的檔案,如svpwm.c,svpwm.tlc等,不過這是後話,先說說設定,在initialization中的各引數均設為0,sample mode 設為inherited,如圖5所示,這些都是預設值,也是說可以不用管它就可以了,在data properties中設:

圖6

port name 為u (預設是u0),行數row為4(因為有四個輸入引數),其他選用預設值,如圖6所示,設output ports的輸出port name為y(原來為y0),行數rows為3(因為有三個輸出),其他引數預設,剩下的兩個parameters和data type attributes均採用預設值;在libraries中全部使用預設值;接下來要改的就是outputs中的內容,也是實現SVPWM的核心演算法,必須注意要必須勾選inputs are needed in the output function(direct feedthrough),這句話的意思是:輸出結果直接用到了輸入資料,比如y=u+1,將下面給出的C語言程式複製到空白處,如圖7所示:

圖7

/*u[4]={vaphar,vbetar,Tz,Vdc}*/
int A,B,C,N;
double X,Y,Z,Tx,Ty,T0,Tl,Tm,Th;
if (u[1]>0) A = 1;
else A=0;
   
if ((1.732051*u[0]-u[1])>0) B = 1;
else B=0;

if ((-1.732051*u[0]-u[1])>0) C = 1;
else C=0;

N=A+2*B+4*C;

X=1.732051*u[1]*u[2]/u[3];
Y=(0.8660*u[1]+1.5*u[0])*u[2]/u[3];
Z=(-0.8660*u[1]+1.5*u[0])*u[2]/u[3];

switch (N)
{
    case 1: Tx= Y;Ty=-Z;break;
    case 2: Tx=-X;Ty= Y;break;
    case 3: Tx= Z;Ty= X;break;
    case 4: Tx=-Z;Ty=-X;break;
    case 5: Tx= X;Ty=-Y;break;
   default: Tx=-Y;Ty= Z;
}

if ((Tx+Ty)>u[2])
{
Tx=Tx*u[2]/(Tx+Ty);
Ty=Ty*u[2]/(Tx+Ty);
}

T0=(u[2]-(Tx+Ty))/4;
Tl=(u[2]+Tx-Ty)/4;/*Tl=T0/4+Tx/2*/
Tm=(u[2]-Tx+Ty)/4;/*Tm=T0/4+Ty/2*/
Th=(u[2]+Tx+Ty)/4;/*Th=T0/4+Ty/2+Ty/2*/

switch (N)
{
    case 1 :y[0]=Tm;y[1]=T0;y[2]=Th;break;
    case 2 :y[0]=T0;y[1]=Th;y[2]=Tm;break;
    case 3 :y[0]=T0;y[1]=Tl;y[2]=Th;break;
    case 4 :y[0]=Th;y[1]=Tm;y[2]=T0;break;
    case 5 :y[0]=Th;y[1]=T0;y[2]=Tl;break;
   default :y[0]=Tl;y[1]=Th;y[2]=T0;
}

接下來的兩個continuous derivatives和discrete update都不用改,使用預設值,這兩個只有在有導數時才會用到,最後一個在build info中勾選show comlile steps(在build時會顯示編譯過程)、create a debugged mex-file和generate wrapper tlc(這個我也不知道幹什麼用的)。這下所有的細節設定都結束了,

步驟4:設定模擬引數,回到mdl主介面,選擇選單欄中的simulation/configurate parameters,裡面的模擬時間可以根據實際情況自己定,在sover options中,type建議選fixed-step,fixed step size應本人設為5e-6,這個引數是模擬時最小的步長,這個引數必須比開關週期Tz小,否則無法模擬,其他引數都不用管它,要想知道這些引數是什麼意思,就多看看matlab 中的help,裡面都有詳細說明。

步驟5是安裝lcc,在matlab的command window中輸入mex -setup,然後按照提示將LCC安裝上,安裝完畢的提示是done。。。,接下來你就可以做跟你有用有關的事了,把SVPWM當做一個模組了使用。

步驟6:開啟s-function builder,單擊一下里面的build,接著您就可以看到編譯過程,如果看到success,那就說明您已經成功了。編譯完後關閉s-function builder,接下來做你的系統模擬吧,只要您的svpwm模組和編譯出來的svpwm.c放在一個資料夾中,以後模擬就不用再點build了。

很簡單吧,其實SVPWM的模擬沒什麼難的!需要提醒同志們的是,在模擬之前必須build一下s-function builder,不然無法執行模組,採用s-builder的原因是建成的模組很簡潔,而且執行速度要比其他方法快的多,接下來同志們該去自己試一下了!

相關文章