%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % spwmnat3.m - Determines switching angles for SPWM. % ( tri-state, natural sampling ) % Plots Fourier spectrum. % Uses alf.m % Generates switching patterns for +/- % biased triangular wave. % Last revised 11/16/96 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; global cglob cglob = zeros(1,5); angle = zeros(1,1); time = zeros(1,1); N=15; T=1/60; Tc=T/N/2; % T - period of fundamental N - chops/half cycle % MI - modulation index Ac - amplitude of carrier MI=0.1; Ac=10; A=MI*Ac; if MI>1 | MI<0; disp( 'CAUTION: MI>1 or MI<0'); end m=4*Ac*N/T; w=2*pi/T; for k=1:N td = (k-1)*Tc; x0 = Tc/10; cglob = [-m w A -Ac td ]; alfa = fzero( 'alf', x0 ); if alfa < 0.0; alfa = 0.0; end alfa = alfa + td; time = [ time; alfa ]; angle = [ angle; alfa*360/T ]; x0 = Tc/2; cglob = [m w A Ac td ]; alfa = fzero( 'alf', x0 ); if alfa > Tc; alfa = Tc; end alfa = alfa + td; time = [ time; alfa ]; angle = [ angle; alfa*360/T ]; end angle = [ angle; 180 ]; time = [ time; T/2 ]; x = zeros(1,1024); y = zeros(1,1024); t = linspace(0,T/2,512); k = length( time ); y = A*sin( w*t ); n=2; for i=1:512 if n > k-2, break, end if t(i) < time(n); x(i)=0; elseif t(i) >= time(n) & t(i) <= time(n+1); x(i)=Ac; else; x(i)=0; n=n+2; end end for i=1:512; x(i+512)=-x(i); y(i+512)=-y(i); end clc; alphas = angle' % Display alphas to screen disp('Hit any key to continue'); pause t=linspace(0,T,1024); clf; figure(1); subplot(211), plot(t',x',t',y'); title('SINUSOIDAL PWM WAVEFORM'); xlabel('TIME - s'); ylabel('OUTPUT WAVE FORM'); fn = abs( fft(x) ); fnn = 100*fn/max(fn); subplot(212), plot( [0:50], fnn(1:51) ); title('FOURIER SPECTRUM OF SPWM WAVEFORM'); xlabel('HARMONIC NUMBER'); ylabel('PERCENT'); text(0.15, 0.65, ['MI = ',num2str(MI),' N = ', ... num2str(N)], 'sc');