1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
SHEPWM是特定谐波消除脉宽调制,即通过开关时刻的优化选择,产生PWM来消除选定的低次谐波。
MATLAB仿真中的SHEPWM的发波采用S函数编写,S函数是一种用于描述Simulink仿真模块的计算机语言,它结合了m文件和Simulink仿真模块的优点,可以极大地增强和扩展Simulink仿真能力,用户可以通过编写S函数来构造用户自己的模块,以实现一些复杂的功能。
为了方便开关角的动态切换,SHEPWM发波函数分为3个S函数,分别实现A、B、C单相发波,S函数的输入为1/4周期的开关角度值以及调制波频率,输入的1/4周期的SHEPWM开关角数最大为15个,最小为0个,当输入0个开关角时,S函数输出为方波。S函数的输入为16维,前15个为1/4周期内的SHEPWM开关角度值输入,开关角值按顺序输入,不足的补零;第16个输入为电压矢量角度输入,用于发波。
S函数状态变量设置为离散型,状态变量数为SHEPWM一周期内的开关数,状态变量是通过输入的1/4周期的开关角来计算出全周期的SHEPWM的开关角,
三相的S函数中的输入和开关角的计算方法都一样,只是在方波方式中采用移相的方法,当正转的时候,B相相位滞后120度,C相相位滞后240度,当反转的时候,B相相位滞后240度,C相相位滞后120度,其SHEPWM的高低电平根据开关角数和开关时刻段来判断,如图1和图2所示,当开关角数为奇数时,开关时间段为奇数时,输出低电平,开关时间段为偶数时,输出高电平;当开关角数为偶数时,开关时间段为奇数时,输出高电平,开关时间段为偶数时,输出低电平。
因为S函数的电压矢量角度表示的是电压矢量相对静止坐标系A轴的角度,而一个完整的SHEPWM的基波部分都是正弦波,所以必须要对电压矢量角做一定处理,即
shepwm技术的特定消谐方程组是非线性超越方程,在初值的选取上存在难度,方程求解难度复杂,收敛效果不佳,由于微处理器主频速度低,目前大部分shepwm多采用查表法生成pwm波形来进行电机控制,用(1)离线法将计算出的开关角度存储在程序中,同时对希望输出的电压进行分析,计算并找到角度结果相近似的开关角度,以此来进行igbt的开关状态,该方法输出的电压并不连续,同时随着精度的增高,程序的存储空间加大,算法的灵活性与实时性变差;(2)数值法是求解超越方程组最常见的的方法,该方法通过选择合适的初值以保证方程的迭代收敛性,当初值选择不同时,得到的开关角轨迹也不相同,计算速度快,数值精度高,因此该方法的重点是如何选取方程的初值,同时保证方程的迭代性。但是数值迭代法计算速度快,精度高,但是其收敛性较差,初值计算困难,必须选择合适的初值才能够得到shepwm方程组的解,无法做到全调至域m解得范围,当m等于0或者m>0,9后,易形成窄脉冲;(3)在现在控制算法中,遗传算法遵循进化论,按照自然选择和基因的生物学规律进行全局优化寻找,利用该方法的全局寻解功能对shepwm方程组进行求解,以求解全调至域下的逆变器的开关角度,计算速度慢,收敛性存在不稳定。
3.MATLAB核心程序
function [sys,x0,str,ts]=mdlInitializeSizes(Ts) sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 4*15+3; sizes.NumOutputs = 5; sizes.NumInputs =16; sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 = zeros(4*15+3,1); str = []; ts = [Ts 0]; %在T特定值时采样 %============================================================================= %更新状态变量 function sys=mdlUpdate(t,x,u,Ts) %计算相应alpha角对应时间 m=find(u(1:15)); N=numel(m); if N==0 x(1)=pi; else x(1)=0; x(2:N+1)=u(1:N); for k=1:N x(N+k+1)=pi-x(N-k+2); x(2*N+k+2)=pi+x(k+1); x(3*N+k+2)=2*pi-x(N-k+2); end x(2*N+2)=pi; x(4*N+3)=2*pi; end sys=x; %============================================================================= % 计算输出时间 function sys=mdlOutputs(t,x,u,Ts) % PWM generation global p1; global p2; global p3; global p4; u(16)=u(16)+pi/2; while (u(16)>2*pi) u(16)=u(16)-2*pi; end if (u(16)>=pi/2)&&(u(16)<pi/2+pi/10) %if (u(16)>=0)&&(u(16)<pi/10) starta=1; else starta=0; end m=find(u(1:15)); N=numel(m); if N==0 if(u(16)>pi/2&&u(16)<3*pi/2) if u(16)<x(1) p1=1;p2=1;p3=0;p4=0; elseif (u(16)>=x(1))&&(u(16)<2*pi) p1=0;p2=1;p3=1;p4=0; end else if u(16)<x(1) p1=0;p2=0;p3=1;p4=1; elseif (u(16)>=x(1))&&(u(16)<2*pi) p1=0;p2=1;p3=1;p4=0; end end else for i=1:4*N+2 if (u(16)>=x(i))&&(u(16)<x(i+1)) flag1=mod(N,2); flag2=mod(i,2); if xor(flag1,flag2)==1 if u(16)>pi/2&&u(16)<3*pi/2 p1=1;p2=1;p3=0;p4=0; else p1=0;p2=0;p3=1;p4=1; end else p1=0;p2=1;p3=1;p4=0; end end end end
标签:&&,Clark,16,SHEPWM,sizes,SPWM,开关,模块,pi From: https://www.cnblogs.com/51matlab/p/17444547.html