Three methods to generate an intersective pwm: leading edge modulation, trailing edge modulation or centered modulation. The reference signal is a sine wave, not plotted. See
Image:Pwm.svg for more information.
trailsignal(t) := t - floor(t);
leadsignal(t) := ceiling(t)-t;
centersignal(t) := 2*abs(t-floor(t-1/2)-1);
freq : 0.05;
sinesignal(t) := (1/2) + (499/1000)*sin(2*%pi*freq*t);
pwmlead(t) := (if(leadsignal(t) > sinesignal(t)) then 0.0 else 1.0);
pwmtrail(t) := (if(trailsignal(t) > sinesignal(t)) then 0.0 else 1.0);
pwmcenter(t) := (if(centersignal(t) > sinesignal(t)) then 0.0 else 1.0);
load(draw);
draw(terminal=svg,file_name="Three_PWM_types",
gr2d(yrange=[-0.25,1.25],nticks=20,grid=true,
user_preamble="set mxtics;set format x "";
set origin 0,0.67; set size 1,.3;set bmargin 0;
set tmargin 0",font="Times",
ylabel="lead",ytics={0,1},axis_bottom=false,
color=green,explicit(leadsignal(x),x,0,19),
color=blue,explicit(pwmlead(x),x,0,19)),
gr2d(yrange=[-0.25,1.25],nticks=20,grid=true,
user_preamble="set mxtics;set format x "";
set origin 0,0.37",font="Times",
ylabel="trail",ytics={0,1},axis_bottom=false,
color=green,explicit(trailsignal(x),x,0,19),
color=blue,explicit(pwmtrail(x),x,0,19)),
gr2d(yrange=[-0.25,1.25],nticks=20,grid=true,
user_preamble="set mxtics;set format x "%1.0f T";
set origin 0,.07",font="Times",
ylabel="center",ytics={0,1},
color=green,explicit(centersignal(x),x,0,19),
color=blue,explicit(pwmcenter(x),x,0,19))
);