频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...
文末有仿真模型下載方式
1.1 基于C語言的SIMULINK仿真模型
使用C語言在MATLAB/SIMULINK中仿真,需要借助s-function builder模塊實現。七段式SVPWM仿真模型如圖1-1所示。仿真解算器(Solver)選擇變步長(Variable-step)、ode23,最大仿真步長(Max step size)設置為1e-6,其余參數保持默認值。模型參數具體設置為:直流母線電壓Udc = 100V,Ualpha = 50sin50ωt,Ubeta = 50cos50ωt,PWM開關周期Ts取為0.0001s(對應開關頻率10kHz),則對應的仿真模型中PWM一個周期計數值Tcnt=15000(假設實際DSP的PWM外設時鐘頻率為150MHz,則Tcnt = 150MHz/10kHz = 15000)。
圖1-1 SVPWM仿真模型雙擊Sfunction builder模塊設置(即圖1-1中的SVPWM),首先填寫S-function name:SVM,然后在Initialization選項卡中選擇Sample mode為Discere,意味著使用離散采樣模式,在Sample time value中設置采樣周期,這里采用1e-4(單位:秒,這里與PWM開關周期設置為同一時間),如圖1-2所示。
圖1-2 Initialization選項卡設置Data Properties選項卡用來設置模塊的輸入/輸出接口。首先選擇Input Ports子選項卡進行輸入接口設置,分別添加名為“Ualpha”、“Ubeta”、“Udc”、“Tcnt”的4路輸入接口,如圖1-3所示。然后選擇Output Ports子選項卡進行輸出接口設置,添加名為“Tcm”的3維度輸出接口和名為“Sec”的扇區輸出接口,如圖1-4所示。
圖1-3 Initialization選項卡設置圖1-4 Data Properties選項卡Output Ports設置Librabies選項卡用來指定所需的源文件、頭文件、庫文件等,如圖1-5所示,在左側窗口用來指定頭文件路徑和C源文件(含路徑)。這里舉例頭文件路徑為:INC_PATH ../Include;源文件為:SRC_PATH ../Source Svpwm.c。
圖1-5 Libraries選項卡設置Ouputs選項卡中用來寫測試用的代碼(C語言),一般格式為:1,將模塊輸入量賦值給測試代碼接口;2,調用相關計算函數;3,將計算結果或測試變量賦值給輸出接口。具體視實際項目需要而定,如圖1-6所示,另外,所需的SVPWM核心代碼為I_Svpwm.c和I_Svpwm.h,需要將這兩個文件分別放入Library中指定的路徑下。Ouputs選項卡中測試代碼舉例如下:
#include "Svpwm.h" static SVPWM Svpwm = SVPWM_DEFAULTS;Svpwm.Input.Ualpha = Ualpha[0]; Svpwm.Input.Ubeta = Ubeta[0]; Svpwm.Input.Udc = Udc[0]; Svpwm.Input.Tcnt = Tcnt[0]; Svpwm.Calc(&Svpwm); Tcmp[0] = Svpwm.Output.Tcm1; Tcmp[1] = Svpwm.Output.Tcm2; Tcmp[2] = Svpwm.Output.Tcm3;圖1-6 Outputs選項卡設置最后,在配置完成并將相關被測試代碼(I_Svpwm.c和I_Svpwm.h)放置到相關文件夾(Include和Source)后,點擊界面右上角的Build按鈕進行代碼編譯,在系統提示無錯誤無警告后即可進行仿真,如圖1-7所示。
圖1-7 編譯完成提示信息SVPWM程序如下:
1)Svpwm.h:
#ifndef __SVPWM_H__ #define __SVPWM_H__// Input interface typedef struct { float Ualpha;float Ubeta;float Udc;unsigned int Tcnt; } SVPWM_INPUT;#define SVPWM_INPUT_DEFAULTS { 0,0,0,1 }// Output interface typedef struct { float Tcm1;float Tcm2;float Tcm3; } SVPWM_OUTPUT;#define SVPWM_OUTPUT_DEFAULTS { 0,0,0 }// Temporary variables typedef struct { unsigned int A;unsigned int B;unsigned int C; unsigned int Sector;float X;float Y;float Z;float T1;float T2;float T3;float Ta;float Tb;float Tc;float M; } SVPWM_TEMP;#define SVPWM_TEMP_DEFAULTS { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 }// Struct of space vector PWM typedef struct { SVPWM_INPUT Input;SVPWM_OUTPUT Output;SVPWM_TEMP Temp;void (*Calc)(); } SVPWM;#define SVPWM_DEFAULTS { SVPWM_INPUT_DEFAULTS,SVPWM_OUTPUT_DEFAULTS,SVPWM_TEMP_DEFAULTS,(void (*)(long))SvpwmGen }// Function declaration void SvpwmGen(SVPWM *); #endif2)Svpwm.c:
#include "Svpwm.h"void SvpwmGen(SVPWM *Var) {float TempT1, TempT2;if(Var->Input.Ubeta > 0){Var->Temp.A = 1;}else{Var->Temp.A = 0;}if((1.732 * Var->Input.Ualpha - Var->Input.Ubeta) > 0){Var->Temp.B = 1;}else{Var->Temp.B = 0;}if((1.732 * Var->Input.Ualpha + Var->Input.Ubeta) < 0){Var->Temp.C = 1;}else{Var->Temp.C = 0;}Var->Temp.Sector = Var->Temp.A + 2 * Var->Temp.B + 4 * Var->Temp.C; Var->Temp.X = 1.732 * Var->Input.Ubeta * Var->Input.Tcnt / Var->Input.Udc;Var->Temp.Y = (1.5 * Var->Input.Ualpha + 0.866 * Var->Input.Ubeta) * Var->Input.Tcnt / Var->Input.Udc;Var->Temp.Z = (-1.5 * Var->Input.Ualpha + 0.866 * Var->Input.Ubeta) * Var->Input.Tcnt / Var->Input.Udc;switch(Var->Temp.Sector){ case 1:Var->Temp.T1 = Var->Temp.Z;Var->Temp.T2 = Var->Temp.Y;break;case 2:Var->Temp.T1 = Var->Temp.Y;Var->Temp.T2 = -Var->Temp.X;break; case 3:Var->Temp.T1 = -Var->Temp.Z;Var->Temp.T2 = Var->Temp.X;break;case 4:Var->Temp.T1 = -Var->Temp.X;Var->Temp.T2 = Var->Temp.Z;break; case 5:Var->Temp.T1 = Var->Temp.X;Var->Temp.T2 = -Var->Temp.Y;break;case 6:Var->Temp.T1 = -Var->Temp.Y;Var->Temp.T2 = -Var->Temp.Z;break;default:break;}if((Var->Temp.T1+Var->Temp.T2) > Var->Input.Tcnt){TempT1 = Var->Temp.T1;TempT2 = Var->Temp.T2;Var->Temp.T1 = (TempT1 / (TempT1 + TempT2)) * Var->Input.Tcnt;Var->Temp.T2 = (TempT2 / (TempT1 + TempT2)) * Var->Input.Tcnt;}Var->Temp.Ta = (Var->Input.Tcnt - Var->Temp.T1 - Var->Temp.T2) * 0.25;Var->Temp.Tb = Var->Temp.Ta + Var->Temp.T1 * 0.5;Var->Temp.Tc = Var->Temp.Tb + Var->Temp.T2 * 0.5;switch(Var->Temp.Sector){case 1:Var->Output.Tcm1 = Var->Temp.Tb;Var->Output.Tcm2 = Var->Temp.Ta;Var->Output.Tcm3 = Var->Temp.Tc;break;case 2:Var->Output.Tcm1 = Var->Temp.Ta;Var->Output.Tcm2 = Var->Temp.Tc;Var->Output.Tcm3 = Var->Temp.Tb;break;case 3:Var->Output.Tcm1 = Var->Temp.Ta;Var->Output.Tcm2 = Var->Temp.Tb;Var->Output.Tcm3 = Var->Temp.Tc;break;case 4:Var->Output.Tcm1 = Var->Temp.Tc;Var->Output.Tcm2 = Var->Temp.Tb;Var->Output.Tcm3 = Var->Temp.Ta;break;case 5:Var->Output.Tcm1 = Var->Temp.Tc;Var->Output.Tcm2 = Var->Temp.Ta;Var->Output.Tcm3 = Var->Temp.Tb;break;case 6:Var->Output.Tcm1 = Var->Temp.Tb;Var->Output.Tcm2 = Var->Temp.Tc;Var->Output.Tcm3 = Var->Temp.Ta;break;default:break;} }為了驗證算法的正確性,圖1-8給出了SVPWM 算法的仿真結果。由圖1-8(a)可知,扇區N值為3→1→5→4→6→2且交替出現,與表1-4所示的結果相同;由圖1-8(b)可知,由SVPWM算法得到的調制波呈馬鞍形,這樣有利于提高直流電壓利用率,有效抑制諧波。
(a) 扇區計算結果(b) 切換點(調制波)Tcmp1、Tcmp2、Tcmp3波形?圖1-8 仿真結果
1.2 基于SVPWM模塊的仿真
上一小節是根據SVPWM算法的基本工作原理搭建的SVPWM模塊,可使讀者更加深入地了解SVPWM算法的工作原理和實現方法,同時,基于C語言的仿真具有移植到微控制器(如DSP)快,無須修改等特點。另外MATLAB/SIMULINK內提供了SVPWM模塊(所在位置:Simscape SimPowerSystems Specialized Technology Control and Measurements Library Pulse &. Signal Generators SVPWM Generator (2-Level))。
下面就該模塊的參數設置作以詳細說明。
1、Data type of input reference vector (Uref)(參考電壓矢量輸入類型)
Data type of input reference vector (Uref)(參考電壓矢量輸入類型)的下拉列表中包括3種類型:Magnitude-Angle (rad)(電壓的幅值和相角)、alpha-beta components(靜止坐標系下α-β分量)和Internally generated(內部模式)。
1) Magnitude-Angle (rad)(電壓的幅值和相角):當選擇Magnitude-Angle(rad)時,SVPWM模塊顯示如圖1-9所示。值得說明的是,電壓的幅值|u|采用的是標么值(0 <|u|< l)而非實際值,電壓的相角∠u的單位為弧度(rad)。
圖1-9 選擇Magnitude-Angle (rad) 時SVPWM模塊2) alpha-beta components(靜止坐標系下α-β分量):當選擇alpha-beta components時,SVPWM模塊顯示如圖1-10所示。需要說明的是,靜止坐標系下的α-β分量Uα、Uβ采用的同樣是標么值而非實際值。
圖1-10 選擇alpha-beta components 時SVPWM模塊3) Internally generated(內部模式):當選擇Internally generated時,SVPWM模塊顯示如圖1-11所示。采用該類型時不需要外部變量的輸入,只須在該界面對調制度、相位和頻率進行設置。值得說明的是,輸出電壓的相位(Phase)的單位是電角度(°)而不是弧度(rad)。
圖1-11 選擇Internally generated 時SVPWM模塊?
2、Switching pattern(開關模式)
SVPWM 模塊中包含兩種開關模式:Pattern #1和Pattern #2。實際上,Pattern #1模式就是七段式SVPWM,而Pattern #2模式就是五段式SVPWM,關于兩者的基本工作方式在1.1.6節已進行詳細論述,此處不再贅述。
3、PWM frequency(Hz)(PWM開關頻率)
此處用來設置PWM開關頻率(三角載波)fpwm,它與開關周期Tpwm的關系為
4、Sample time(采樣時間)
此處用來設置SVPWM模塊的采樣時間,單位為秒(s),設置0時代表連續采樣。
最后,使用SVPWM Generator (2-Level)模塊搭建仿真模型,如圖1-12所示。參數設置為 Ualpha = 0.7sin50ωt,Ubeta = 0.7cos50ωt,PWM開關頻率為10kHz,如圖1-13所示。SVPWM Generator (2-Level)模塊的輸出P為6路PWM驅動波形,為了驗證正確性,在輸出端添加低通濾波器(實際使用中無須濾波器),其截止頻率要設置在開關頻率10kHz以下。
圖1-12 基于SVPWM Generator (2-level) 的仿真模型圖1-13 SVPWM Generator (2-level) 參數設置SVPWM輸出的6路波形為等幅不等寬的脈沖,其經過低通濾波器濾掉開關頻次的諧波后應該呈馬鞍波狀,取Sa、Sb、Sc三路觀測,其相位互差120°,如圖1-14所示。
圖1-14 SVPWM三路驅動波形Sa、Sb、Sc濾波后的馬鞍波文中涉及的仿真模型可在公眾號 iFTrue未來已來 中獲取
在公眾號后臺回復以下關鍵字獲取SVPWM仿真模型:SVPWM模型
總結
以上是生活随笔為你收集整理的频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cesium 3dtiles 加载本地数
- 下一篇: python曲线拟合预测_用python