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