在上期中介紹了在Simulink仿真中用S函數(shù)構(gòu)建控制器,方便代碼從仿真到嵌入式設(shè)備的遷移,本期則直接進(jìn)入正題,通過(guò)兩電平逆變器模型來(lái)介紹S函數(shù)在電力電子仿真中的應(yīng)用。
01S函數(shù)的簡(jiǎn)單介紹
官方對(duì)S函數(shù)是這樣介紹的:S-Function 可以使用 MATLAB?, C, C++, Ada,或 Fortran 語(yǔ)言來(lái)編寫。 使用 MEX實(shí)用工具,將 C, C++, Ada,和 Fortran 語(yǔ)言的 S-Function 編譯成MEX-文件,在需要的時(shí)候,它們可與其它的MEX-文件一起動(dòng)態(tài)地連接到 MATLAB 中。
S-Function 使用一種特殊的調(diào)用格式讓你可以與 Simulink 方程求解器相互作用,這與發(fā)生在求解器和內(nèi)置 Simulink塊之間的相互作用非常相似。 S-Function 的形式是非常通用的,且適用于連續(xù)、離散和混合系統(tǒng)。
這段話包含以下幾層意思:
1. S函數(shù)可以用m語(yǔ)言,c語(yǔ)言等多種語(yǔ)言編寫,Simulink庫(kù)中的User-Defined Functions中的S-Function Example包含了多種語(yǔ)言的多種模板, S-Function Builder 是一個(gè) Simulink 模塊,可以通過(guò)設(shè)定自動(dòng)生成c語(yǔ)言的S函數(shù);
圖1 Simulink庫(kù)中S函數(shù)相關(guān)模塊
2. S函數(shù)與Simulink的運(yùn)行原理相似,要了解S函數(shù)是如何工作的,就要了解Simulink 是如何進(jìn)行模型仿真的, Simulink模型的執(zhí)行分幾個(gè)階段進(jìn)行。 首先進(jìn)行的是初始化階段,在此階段, Simulink將庫(kù)塊合并到模型中來(lái),確定傳送寬度、數(shù)據(jù)類型和采樣時(shí)間,計(jì)算塊參數(shù),確定塊的執(zhí)行順序,以及分配內(nèi)存。 然后, Simulink進(jìn)入到“仿真循環(huán)”,每次循環(huán)可認(rèn)為是一個(gè)“仿真步”。 在每個(gè)仿真步期間,Simulink 按照初始化階段確定的塊執(zhí)行順序依次執(zhí)行模型中的每個(gè)塊。 對(duì)于每個(gè)塊而言,Simulink 調(diào)用函數(shù)來(lái)計(jì)算塊在當(dāng)前采樣時(shí)間下的狀態(tài),導(dǎo)數(shù)和輸出。 如此反復(fù),一直持續(xù)到仿真結(jié)束。
下圖所示為一個(gè)仿真的步驟:
圖2 Simulink 執(zhí)行仿真的步驟
3. S函數(shù)使用一種特殊的調(diào)用格式使其在 Simulink方程求解器相互作用,S函數(shù)主要通過(guò)多種特殊格式的回調(diào)函數(shù),用來(lái)表示仿真執(zhí)行的初始化、輸出、計(jì)算導(dǎo)數(shù)、結(jié)束等多個(gè)階段。
02兩電平逆變器調(diào)制的S函數(shù)示例
文章結(jié)尾的下載鏈接提供了兩電平逆變器調(diào)制的S函數(shù)的示例程序,該示例主體程序部分如下:
圖3 兩電平逆變器調(diào)制的S函數(shù)主體部分
該S函數(shù)主要包含以下回調(diào)函數(shù):
a. mdlInitializeSizes回調(diào)函數(shù)
對(duì)參數(shù)進(jìn)行初始化設(shè)置,比如離散狀態(tài)個(gè)數(shù)、連續(xù)狀態(tài)個(gè)數(shù)、模塊輸入和輸出的路數(shù)、模塊的采樣周期個(gè)數(shù)、狀態(tài)變量初始數(shù)值等;
b. mdlInitializeSampleTimes回調(diào)函數(shù)
該函數(shù)設(shè)置S-Function模塊的采樣時(shí)間,決定了mdlOutputs多久執(zhí)行一次;
c. mdlInitializeConditions回調(diào)函數(shù)
初始化時(shí)調(diào)用,對(duì)輸入輸出數(shù)組指針地址進(jìn)行定義;
d. mdlOutputs回調(diào)函數(shù)
可以用來(lái)執(zhí)行我們定義的函數(shù),本例中執(zhí)行了三個(gè)任務(wù):
來(lái)自S函數(shù)的外部數(shù)據(jù)的輸入;
執(zhí)行100us的定時(shí)中斷(計(jì)算輸出電壓相位,輸出電壓指令)、741us的定時(shí)中斷(模擬PWM中斷,調(diào)用兩電平SVPWM調(diào)制算法)。
S函數(shù)輸出(輸出內(nèi)部監(jiān)視變量和PWM波占空比)
e. mdlUpdate回調(diào)函數(shù)
如果該塊具有離散的狀態(tài)變量,則在處理完所有塊的輸出函數(shù)之后的主要時(shí)間步中,將調(diào)用一次更新函數(shù),本例未使用;
f. mdlTerminate回調(diào)函數(shù)
S函數(shù)終止時(shí)執(zhí)行的函數(shù),本例未使用。
多個(gè)回調(diào)函數(shù)的執(zhí)行順序如下:
圖4 兩電平逆變器調(diào)制的S函數(shù)回調(diào)函數(shù)執(zhí)行順序
完成S函數(shù)的c文件的編寫后,需要在Matlab中調(diào)用編譯器對(duì)S函數(shù)的c文件進(jìn)行編譯。 由于Matlab存在32位和64位,調(diào)用的編譯器也不一樣。 32位直接使用自帶的lcc-win32即可,64位則需要額外安裝的VS的C++編譯器。 matlab通過(guò)mex-setup命令選擇編譯器。
本示例模型在Simulink的File->Model Properties->Model Properties->Callbacks->InitFcn中通過(guò)以下命令對(duì)S函數(shù)編譯,使模式在每次運(yùn)行時(shí)執(zhí)行該編譯命令生成格式mexw64的文件給Simulink模型調(diào)用:
-g -v InveterController.c Func_SVPWM_2L.c...
03仿真結(jié)果
運(yùn)行仿真模型:INV_2L3Ph_SPWM.slx,在S函數(shù)的mdlOutputs回調(diào)函數(shù)中,調(diào)用Func_SVPWM_2L()調(diào)制函數(shù)之后,數(shù)組y_Scope輸出ABC三相PWM波的占空比為:
圖5 ABC三相PWM波的占空比
在S函數(shù)的mdlOutputs回調(diào)函數(shù)中采集了逆變器的模擬量,通過(guò)數(shù)組y_Scope輸出,其波形為:
圖6 S函數(shù)的輸出波形
-
調(diào)制
+關(guān)注
關(guān)注
0文章
156瀏覽量
29654 -
逆變器
+關(guān)注
關(guān)注
283文章
4694瀏覽量
206353 -
仿真
+關(guān)注
關(guān)注
50文章
4048瀏覽量
133431 -
Simulink
+關(guān)注
關(guān)注
22文章
522瀏覽量
62312 -
S函數(shù)
+關(guān)注
關(guān)注
0文章
6瀏覽量
6643
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論