% This script runs an example of a load line analysis for a MOSFET amp
% to find the operating point for Vgs through iteration. A special WHILE
% loop is used to progressivly make the interation interval smaller as
% the final answer is approached. The interation loop will stop once the
% error is within some specified tolerance interval. The quiesent values
% of Gate voltage Vgs, Drain Source voltage Vds, and Drain current Ids are
% computed in the end.
%
% The function nmos.m is needed to run this script
%
% Written by Kevin D. Donohue (donohue@engr.uky.edu) 10/2003
% Set Parameters: Operating point will be set to half VDD
K=.5; vto = 1.8; % Nmos parameters
W=1; L=1; KP=2*K; % Nmos parameters
VDD=15; RS=400; RD=1e3; % Load line parameters
idsmax = VDD/(RD+RS); % Maximum Load line value on Drain current axis
% Operation point will be the max drain current divided by 2.
vds = [0:.05:VDD]; % Create X-Axis
idsll = -vds/(RD+RS) + VDD/(RD+RS); % Generate Load Line
err = 2; %Set initial error for quiesent point to get while loop started
toler = .05e-6; % Set tolerance value for stopping rule on while loop
incgs = .1; % Set increment for vgs to find intersection with load line.
vgs = vto; % Initialize vgs to threshold voltage so initial guess will below desired operating point
% Set flag to denote when guess goes above the the operating point in
% order to reduce interation interval.
passflag = 0; % If zero implies the last step is below the desired value, 1 implies last step was above
% Set while loop to run until error is below tolerance
while err >= toler
ids = nmos(vds,vgs,KP,W,L,vto); % Compute characteristic curve
[edum, inderr] = min(abs(idsll - ids)); % Find intersection with loadline
err =abs(idsmax/2 - idsll(inderr(1))); % Find error between desired current and actual
% Check to see if we are above or below the target and make adjustments to move closer to desired operating point
if idsmax/2>ids(inderr(1)) % If below target value ....
vgs = vgs + incgs % Still below threshold so increase
if passflag == 1
incgs = incgs/2; % If we just came from above the threshod cut increment in half for more resolution
passflag = 0; % reset flag
end
else % If above target value
vgs = vgs - incgs % Still above threshold so decrease
if passflag == 0
incgs = incgs/2; % If we just came from below the threshold cut increment in half for more resolution
passflag = 1; % reset flag
end
end
% Comment out the next 4 lines to stop the while loop from being interupted by plots and pauses
figure(1)
plot(vds, idsmax*ones(size(vds))/2, 'c--', vds,idsll,'k:',vds,ids,'r') % Check plot along the way
disp(['Iteration in progress'])
pause(.1)
end
vgsq = vgs; % Set quiesent Vgs to last result of interation
disp([' The operating point for Vgs is ' num2str(vgsq)])
% Compute corresponding output quiesent voltage amplitude at output
ids = nmos(vds,vgsq,KP,W,L,vto); % Compute transfer characteristic (TC) curve at quiesent
[err, inderr] = min(abs(ids - idsll)); % Find intersection with load line and TC
vdsq = vds(inderr(1)); % Output voltage quiesent
disp([' The operating point for Vds is ' num2str(vdsq)])
idsq = ids(inderr(1));
disp([' The operating point for Ids is ' num2str(idsq)])