Hello community,
here is the log from the commit of package octave-forge-control for
openSUSE:Factory checked in at 2015-09-11 09:04:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/octave-forge-control (Old)
and /work/SRC/openSUSE:Factory/.octave-forge-control.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "octave-forge-control"
Changes:
--------
---
/work/SRC/openSUSE:Factory/octave-forge-control/octave-forge-control.changes
2015-07-12 22:52:58.000000000 +0200
+++
/work/SRC/openSUSE:Factory/.octave-forge-control.new/octave-forge-control.changes
2015-09-11 09:04:23.000000000 +0200
@@ -1,0 +2,6 @@
+Wed Sep 9 18:16:09 UTC 2015 - [email protected]
+
+- Update to version 2.8.4
+ * Bug fixes and minor changes
+
+-------------------------------------------------------------------
Old:
----
control-2.8.3.tar.gz
New:
----
control-2.8.4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ octave-forge-control.spec ++++++
--- /var/tmp/diff_new_pack.iwT37y/_old 2015-09-11 09:04:24.000000000 +0200
+++ /var/tmp/diff_new_pack.iwT37y/_new 2015-09-11 09:04:24.000000000 +0200
@@ -18,7 +18,7 @@
%define octpkg control
Name: octave-forge-%{octpkg}
-Version: 2.8.3
+Version: 2.8.4
Release: 0
Summary: Computer-Aided Control System Design (CACSD) Tools
License: GPL-3.0+
++++++ control-2.8.3.tar.gz -> control-2.8.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/control/DESCRIPTION new/control/DESCRIPTION
--- old/control/DESCRIPTION 2015-07-01 06:48:37.000000000 +0200
+++ new/control/DESCRIPTION 2015-09-02 16:41:23.000000000 +0200
@@ -1,6 +1,6 @@
Name: control
-Version: 2.8.3
-Date: 2015-07-01
+Version: 2.8.4
+Date: 2015-09-02
Author: Lukas Reichlin <[email protected]>
Maintainer: Lukas Reichlin <[email protected]>
Title: Control Systems
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/control/INDEX new/control/INDEX
--- old/control/INDEX 2015-07-01 06:48:37.000000000 +0200
+++ new/control/INDEX 2015-09-02 16:41:23.000000000 +0200
@@ -4,6 +4,7 @@
optiPID
Anderson
Madievski
+ VLFamp
Linear Time Invariant Models
dss
filt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/control/NEWS new/control/NEWS
--- old/control/NEWS 2015-07-01 06:48:37.000000000 +0200
+++ new/control/NEWS 2015-09-02 16:41:23.000000000 +0200
@@ -1,6 +1,18 @@
Summary of important user-visible changes for releases of the control package
===============================================================================
+control-2.8.4 Release Date: 2015-09-02 Release Manager: Lukas Reichlin
+===============================================================================
+
+** tf
+ Fixed a bug which affected interconnections of MIMO transfer functions.
+ (Reported by Piet Wertelaers)
+
+** VLFamp
+ Included new demo created by Thomas D. Dean.
+
+
+===============================================================================
control-2.8.3 Release Date: 2015-07-01 Release Manager: Lukas Reichlin
===============================================================================
Files old/control/doc/control.pdf and new/control/doc/control.pdf differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/control/doc/control.tex new/control/doc/control.tex
--- old/control/doc/control.tex 2015-07-01 06:48:38.000000000 +0200
+++ new/control/doc/control.tex 2015-09-02 16:41:23.000000000 +0200
@@ -5,7 +5,7 @@
@c use chapter name instead of title in the header of even pages
@c @settitle CACSD Tools for GNU Octave
@afourpaper
-@set VERSION 2.8.3
+@set VERSION 2.8.4
@finalout
@c @afourwide
@c %**end of header
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/control/doc/functions.texi
new/control/doc/functions.texi
--- old/control/doc/functions.texi 2015-07-01 06:48:38.000000000 +0200
+++ new/control/doc/functions.texi 2015-09-02 16:41:23.000000000 +0200
@@ -243,6 +243,33 @@
@cite{Sampled-Data Controller Reduction Procedure},
IEEE Transactions of Automatic Control,
Vol. 40, No. 11, November 1995
+@section VLFamp
+@findex VLFamp
+
+ @deftypefn{Function File} {} VLFamp
+ @deftypefnx{Function File} {@var{result} =} VLFamp (@var{verbose})
+ Calculations on a two stage preamp for a multi-turn,
+ air-core solenoid loop antenna for the reception of
+ signals below 30kHz.
+
+ The Octave Control Package functions are used extensively to
+ approximate the behavior of operational amplifiers and passive
+ electrical circuit elements.
+
+ This example presents several 'screen' pages of documentation of the
+ calculations and some reasoning about why. Plots of the results are
+ presented in most cases.
+
+ The process is to display a 'screen' page of text followed by the
+ calculation and a 'Press return to continue' message. To proceed in
+ the example, press return. ^C to exit.
+
+ At one point in the calculations, the process may seem to hang, but,
+ this is because of extensive calculations.
+
+ The returned transfer function is more than 100 characters long so
+ will wrap in screens that are narrow and appear jumbled.
+ @end deftypefn
@chapter Linear Time Invariant Models
@section dss
@findex dss
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/control/inst/@tf/__sys_connect__.m
new/control/inst/@tf/__sys_connect__.m
--- old/control/inst/@tf/__sys_connect__.m 2015-07-01 06:48:37.000000000
+0200
+++ new/control/inst/@tf/__sys_connect__.m 2015-09-02 16:41:23.000000000
+0200
@@ -35,7 +35,7 @@
## Author: Lukas Reichlin <[email protected]>
## Created: October 2009
-## Version: 0.2
+## Version: 0.3
function sys = __sys_connect__ (sys, M)
@@ -44,18 +44,6 @@
num = sys.num;
den = sys.den;
- ## TODO: Implementation for MIMO models. There are three possibilities:
- ## 1. An _algebraic_ solution of the inversion problem in order
- ## to not introduce unwanted zero/pole pairs. Difficult.
- ## 2. A numeric solution of the inversion problem. Afterwards,
- ## elimination of _all_ zero/pole pairs by minreal. Bad.
- ## 3. Conversion to state-space, solving the problem there and
- ## converting back to transfer function. Easier, but obviously,
- ## this way needs MIMO __sys2ss__ and __sys2tf__ implementations
- ## as described in Thomas Kailath's classic "Linear Systems".
- ## Possibly this is the way to go, but it works for proper systems
- ## only unless descriptor state-space models are implemented.
-
## WARNING: The code below is a cheap hack to quickly enable SISO TF
connections.
## TODO: Check for den = 0, e.g. in feedback (tf (1), tf (-1))
@@ -73,7 +61,7 @@
elseif (p == 3 && m == 4 && num{1,3} == 0 && num{1,4} == 0 ...
&& num{2,1} == 0 && num{2,2} == 0 && num{2,4} == 0 ...
&& num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 0 ...
- && M == [0, 1, 0; 0, 0, 1; 0, 0, 0; 0, 0, 0])
+ && isequal (M, [0, 1, 0; 0, 0, 1; 0, 0, 0; 0, 0, 0]))
## horzcat [sys1, sys2], plus, minus
sys.num(:) = tfpoly (0);
sys.den(:) = tfpoly (1);
@@ -91,18 +79,18 @@
sys.den(3,4) = den{3,4};
elseif (p == 3 && m == 3 && num{1,3} == 0 ...
- && num{2,1} == 0 && num{2,2} == 0 && num{2,3} == 1 ...
- && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 1 ...
- && M == [0, 1, 0; 0, 0, 1; 0, 0, 0])
+ && num{2,1} == 0 && num{2,2} == 0 && num{2,3} == 1 && den{2,3} == 1
...
+ && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 1 && den{3,3} == 1
...
+ && isequal (M, [0, 1, 0; 0, 0, 1; 0, 0, 0]))
## plus, minus
sys.num(1,3) = num{1,1} * den{1,2} + num{1,2} * den{1,1};
sys.den(1,3) = den{1,1} * den{1,2};
elseif (p == 4 && m == 3 && num{1,2} == 0 && num{1,3} == 0 ...
&& num{2,1} == 0 && num{2,3} == 0 ...
- && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 1 ...
- && num{4,1} == 0 && num{4,2} == 0 && num{4,3} == 1 ...
- && M == [0, 0, 1, 0; 0, 0, 0, 1; 0, 0, 0, 0])
+ && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 1 && den{3,3} == 1
...
+ && num{4,1} == 0 && num{4,2} == 0 && num{4,3} == 1 && den{4,3} == 1
...
+ && isequal (M, [0, 0, 1, 0; 0, 0, 0, 1; 0, 0, 0, 0]))
## vertcat [sys1; sys2]
sys.num(1,3) = num{1,1};
sys.num(2,3) = num{2,2};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/control/inst/VLFamp.m new/control/inst/VLFamp.m
--- old/control/inst/VLFamp.m 1970-01-01 01:00:00.000000000 +0100
+++ new/control/inst/VLFamp.m 2015-09-02 16:41:23.000000000 +0200
@@ -0,0 +1,502 @@
+## Copyright (C) 2015 Thomas D. Dean
+##
+## This file is part of LTI Syncope.
+##
+## LTI Syncope is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## LTI Syncope is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with LTI Syncope. If not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn{Function File} {} VLFamp
+## @deftypefnx{Function File} {@var{result} =} VLFamp (@var{verbose})
+## Calculations on a two stage preamp for a multi-turn,
+## air-core solenoid loop antenna for the reception of
+## signals below 30kHz.
+##
+## The Octave Control Package functions are used extensively to
+## approximate the behavior of operational amplifiers and passive
+## electrical circuit elements.
+##
+## This example presents several 'screen' pages of documentation of the
+## calculations and some reasoning about why. Plots of the results are
+## presented in most cases.
+##
+## The process is to display a 'screen' page of text followed by the
+## calculation and a 'Press return to continue' message. To proceed in
+## the example, press return. ^C to exit.
+##
+## At one point in the calculations, the process may seem to hang, but,
+## this is because of extensive calculations.
+##
+## The returned transfer function is more than 100 characters long so
+## will wrap in screens that are narrow and appear jumbled.
+## @end deftypefn
+
+## Author: Thomas D. Dean <[email protected]>
+## Created: June 2015
+## Version: 0.1
+
+function retval = VLFamp (verbose = false)
+
+ if (nargin > 1)
+ print_usage ();
+ endif
+
+ clc;
+ disp ("---- VLF Pre-Amplifier Design ----");
+ disp ("");
+ disp ("This example covers the design of a pre-amplifier for use in");
+ disp ("receiving radio frequencies below 30kHz.");
+ disp ("");
+ disp ("See http://www.vlf.it for details of Narural Radio Sources");
+ disp ("");
+ disp ("The Octave Control Package functions are used extensively to");
+ disp ("approximate the behavior of operational amplifiers and passive");
+ disp ("electrical circuit elements.");
+ disp ("");
+ disp ("This example presents several 'screen' pages of documentation of
the");
+ disp ("calculations and some reasoning about why. Plots of the results
are");
+ disp ("presented in most cases.");
+ disp ("");
+ disp ("Often, when multiple plots are displayed, they may be overlaid");
+ disp ("on the screen. You may use the mouse and move them for better
viewing.");
+ disp ("");
+ disp ("The process is to display a 'screen' page of text followed by the");
+ disp ("calculation and a 'Press return to continue' message. To proceed in");
+ disp ("the example, press return. ^C to exit.");
+ disp ("");
+ disp ("At one point in the calculations, the process may seem to hang,
but,");
+ disp ("this is because of extensive calculations.");
+ disp ("");
+ disp ("The returned transfer function is more than 100 characters long so");
+ disp ("will wrap in screens that are narrow and appear jumbled.");
+ disp ("");
+ ##
+ input ("Press Return to continue:");
+ blanks ();
+ ##
+ disp ("");
+ disp ("The amplifier consists of two AD797 op amps and a low pass filter.");
+ disp ("With biasing and blocking capacitors omitted, three blocks remain.");
+ disp ("");
+ disp ("");
+ disp (" Gain = 10");
+ disp (" +-------------+");
+ disp (" | | -- Low Pass Filter --");
+ disp (" ---+ p |");
+ disp (" Loop | Stage 1 +--+----R3--+--R4--+--R5--+---> To Stage 2");
+ disp (" | Amplifier | | | | |");
+ disp (" -+-+ n | | C1 C2 C3");
+ disp (" | | | | | | |");
+ disp (" | +-------------+ | Gnd Gnd Gnd");
+ disp (" | |");
+ disp (" +----+---R2--------+");
+ disp (" |");
+ disp (" R1");
+ disp (" |");
+ disp (" Gnd");
+ disp ("");
+ disp ("");
+ disp ("");
+ disp (" Gain = 10");
+ disp (" +-------------+");
+ disp (" | |");
+ disp (" Gnd--+ p |");
+ disp (" | Stage 2 +--+----R8--+----> Output");
+ disp (" | Amplifier | | |");
+ disp (" From >---+-+ n | | R9");
+ disp (" Filter | | | | |");
+ disp (" | +-------------+ | Gnd");
+ disp (" | |");
+ disp (" +----+---R6--------+");
+ disp (" |");
+ disp (" R7");
+ disp (" |");
+ disp (" Gnd");
+ disp ("");
+ disp ("");
+ disp ("R1 and R2 profide feedback to control the gain of Stage 1.");
+ disp ("R3 through R5 with C1 through C3 form a low pass filter to limit
the");
+ disp (" bandwidth.");
+ disp ("R6 and R7 profide feedback to control the gain of Stage 2.");
+ disp ("R8 and R9 provide impedance matching to the cable and/or receiver,");
+ disp (" possibly a PC sound card.");
+ disp ("");
+ ##
+ input ("Press Return to continue:");
+ blanks ();
+ ##
+ disp ("");
+ disp ("");
+ disp ("The graphs in the ad797 datasheet reveal the following parameters:");
+ disp ("");
+
+ show ("a0 = 1e7; ## Open Loop Gain");
+ show ("p1 = 55; ## Pole (Hz)");
+ show ("p2 = 1e6; ## Pole (Hz)");
+ show ("z1 = 4.3e6; ## Zero (Hz)");
+
+ disp ("");
+ disp ("The open loop transfer function of an op amp with m zeros and n");
+ disp ("poles is expressed in the form:");
+ disp (" tf = open_loop_gain * zero_expressions / pole_expressions");
+ disp ("where ");
+ disp (" zero_expressions = (1+s/z1) * (1+s/z2) * ... * (1+s/zm) ");
+ disp (" pole_expressions = (1+s/p1) * (1+s/p2) * ... * (1+s/pn)");
+ disp (" z1 ... zm are the m zeros");
+ disp (" p1 ... pn are the n poles");
+ disp ("");
+
+ ##
+ input ("Press Return to continue:");
+ blanks ();
+ ##
+
+ disp ("");
+ disp ("The amplifier stages have 1 zero and 2 poles:");
+ disp ("");
+ show ("s = tf ('s')")
+ disp ("");
+ show ("TFopen = a0 * (1+s/z1) / (1+s/p1) / (1+s/p2)")
+ disp ("");
+ show ("TFopen_norm = minreal (TFopen)")
+
+ disp ("");
+ disp ("Note: The difference between the op amp expression and the usual");
+ disp ("Zero-Pole-Gain expression is in the modification of the gain");
+ disp ("parameter. The gain argument to zpk() is modified by the zeros");
+ disp ("and poles, so the derived transfer function matches actual");
+ disp ("measurements.");
+ disp ("");
+
+ show ("Azpk = zpk ([-z1], [-p1, -p2], 1e7*p1*p2/z1)")
+
+ ##
+ input ("Press Return to continue:");
+ blanks ();
+ ##
+ disp ("");
+ disp ("The bode plot of these two open loop transfer functions produce");
+ disp ("identical results. And, the plots show the same shape as the");
+ disp ("graphs in the datasheet.");
+ disp ("");
+
+ show ("figure 1");
+ show ("bode (TFopen)");
+ show ("subplot (2,1,1)");
+ show ("title ('Equation Bode Diagram')");
+ show ("figure 2");
+ show ("bode (Azpk)");
+ show ("subplot (2,1,1)");
+ show ("title ('ZPK Bode Diagram')");
+
+ disp ("");
+ disp ("Two Bode Diagrams should be visible, possibly overlaid.");
+ disp ("");
+ ##
+ input ("Press Return to close the plots and continue:");
+ blanks ();
+ ##
+
+ close all;
+ disp ("");
+ disp ("The normalized step response of the ad797 is:");
+
+ disp ("");
+ show ("TFnorm = TFopen/dcgain(TFopen)")
+ disp ("");
+ show ("step (TFnorm, 'b')");
+ show ("title ('AD797 Normalized Open-Loop Step Response')");
+ show ("ylabel ('Normalized Amplitude')");
+ disp ("");
+
+ ##
+ input ("Press Return to close the plot and continue:");
+ blanks ();
+ ##
+
+ close all;
+ disp ("");
+ disp ("--- Design Stage 1 of the VLFamp ---");
+ disp ("");
+ disp ("Resistors R1 and R2 form a feedback system to control the gain of ");
+ disp ("Stage 1. This feedback system returns a portion of the output to
the");
+ disp ("negative input. This is normally expressed as:");
+ disp (" Vfb = Vout * R1 / (R1 + R2)");
+ disp ("So, the transfer function of the feedback network is:");
+ disp (" tf = Vfb / Vout = R1 / (R1 + R2)");
+ disp ("The effects of the AD797 gain on the input and the feedback may be ");
+ disp ("represented as TFstage1 = Vout/Vp = gain / (1 + dcgain *
TFfeedback).");
+ disp ("If dcgain is sufficiently large, this reduces to");
+ disp (" TFstage1 = 1 / TFfeedback.");
+ disp ("The dcgain of the AD797 is >> 1, so, the feedback completely
controls");
+ disp ("the output and variations in the dcgain will not effect the Stage
gain.");
+ disp ("");
+ disp ("The feedback is added to the AD797 using the feedback function");
+ disp ("");
+ show ("Gfb = 10");
+ show ("b = 1 / Gfb");
+ show ("R1 = 10e3");
+ show ("R2 = R1 * (1/b - 1)")
+ disp ("");
+ show ("TFstage1 = feedback (TFopen, b)");
+ disp ("");
+
+ show ("bodemag (TFopen, 'r', TFstage1, 'b')");
+ show ("legend ('Open Loop Gain (TFopen)', 'Closed Loop Gain (TFstage1)')");
+ disp ("");
+
+ disp ("The use of negative feedback to reduce the low-frequency (LF) gain");
+ disp ("has led to a corresponding increase in the system bandwidth
(defined");
+ disp ("as the frequency where the gain drops 3dB below its maximum value).");
+ disp ("");
+ disp ("With this feedback, we have a gain of 10, or 20db up to 10MHz,");
+ disp ("far more than the frequency range of interest.");
+ disp ("");
+ ##
+ input ("Press Return to close the plot and continue:");
+ blanks ();
+ ##
+ close all;
+ disp ("");
+ disp ("Since the gain is now dominated by the feedback network, a useful");
+ disp ("relationship to consider is the sensitivity of this gain to
variation");
+ disp ("in the op amp's open-loop gain.");
+ disp ("");
+ disp ("Before deriving the system sensitivity, however, it is useful to");
+ disp ("define the loop gain, L(s)=a(s)b(s), which is the total gain a
signal");
+ disp ("experiences traveling around the loop:");
+ disp ("");
+ disp ("Sensitivity = partial(TFstage1/TFopen)*TFopen/TFstage1");
+ disp ("or S(s) = 1 / (1 + TFopen(s) * TFstage1(s))");
+ disp ("or S(s) = 1 / (1 + L(s)), which has the same form as feedback");
+ disp ("So, use the feedback function to develop the sensitivity.");
+ disp ("");
+
+ show ("L = TFopen * b")
+ disp ("");
+ show ("Sens = feedback (1, L)")
+ disp ("");
+ show ("figure 1");
+ show ("bodemag (TFstage1, 'b', Sens, 'g')");
+ disp ("");
+
+ disp ("The very small low-frequency sensitivity (more than -100 dB)
indicates");
+ disp ("a design whose closed-loop gain suffers minimally from open-loop
gain");
+ disp ("variation. Such variation in a(s) is common due to manufacturing");
+ disp ("variability, temperature change, etc.");
+ disp ("");
+ ##
+ input ("Press Return to close the plot and continue:");
+ blanks ();
+ ##
+ disp ("");
+ disp ("You can check the step response of A(s) using the STEP command:");
+ disp ("");
+
+ show ("figure 2");
+ show ("step (TFstage1)");
+
+ disp ("");
+ disp ("The stability margin can be analyzed by plotting the loop gain,
L(s)");
+ disp ("with the margin function.");
+ disp (" ");
+ disp ("This plot may display warning messages, you can safely ignore
them.");
+ disp (" "); fflush(stdout);
+ show ("margin (L)");
+ disp (" "); fflush(stdout); fflush(stderr);
+ disp (" ");
+ disp ("Two plots are displayed, possibly overlaid.");
+ disp (" ");
+ ##
+ input ("Press Return to close the plots and continue:");
+ blanks ();
+ ##
+
+ disp ("");
+ disp ("The plot indicates a phase margin of less than 3 degrees. Stage 1");
+ disp ("needs to be compensated to increase this to an acceptible level,");
+ disp ("more than 45 degrees, if possible.");
+ disp ("");
+ disp ("Feedback Lead Compensation");
+ disp ("");
+ disp ("A commonly used method of compensation in this type of circuit is");
+ disp ("feedback lead compensation. This technique modifies b(s) by adding");
+ disp ("a capacitor, C, in parallel with the feedback resistor, R2.");
+ disp ("The capacitor value is chosen so as to introduce a phase lead to
b(s)");
+ disp ("near the crossover frequency, thus increasing the amplifier's phase");
+ disp ("margin.");
+ disp ("The new feedback transfer function is shown below.");
+ disp ("You can approximate a value for C by placing the zero of b(s) at
the");
+ disp ("0dB crossover frequency of L(s):");
+ disp ("");
+
+ show ("[Gm, Pm, Wcg, Wcp] = margin (L)");
+ show ("C = 1/(R2*Wcp)")
+ disp ("");
+ if (C < 1e-12)
+ disp ("The calculated value of C is very small.");
+ disp ("Now, look at a range of values.");
+ endif;
+
+ disp (" ");
+ disp ("The next plots take some time...");
+ disp (" ");
+
+ ##
+ input ("Press Return to close the plot and continue:");
+ blanks ();
+ ##
+ close all;
+ disp ("The next plots take some time...");
+ disp ("");
+
+ show ("K = R1/(R1+R2);");
+ show ("C = [10:10:200]*1e-12;");
+ show ("b_array = arrayfun (@(C) tf ([K*R2*C, K], [K*R2*C, 1]),
C,'uniformoutput',false);");
+ show ("A_array = cellfun (@feedback, {TFopen}, b_array, 'uniformoutput',
false);");
+ show ("L_array = cellfun (@mtimes, {TFopen}, b_array, 'uniformoutput',
false);");
+ show ("S_array = cellfun (@feedback, {1}, L_array, 'uniformoutput',
false);");
+ disp (" "); fflush(stdout);
+ show ("[Gm, Pm, Wcg, Wcp] = cellfun (@margin, L_array);");
+ disp (" ");
+
+ close all
+ show ("figure 1");
+ show ("step (TFstage1, 'r', A_array{:})");
+ show ("figure 2");
+ show ("bode (TFstage1, A_array{:})");
+ show ("figure 3");
+ show ("plot (C, Pm)");
+ show ("grid");
+ show ("xlabel ('Compensation Capacitor, C (pF)')");
+ show ("ylabel ('Phase Margin (deg)')");
+ show ("figure 4");
+ show ("step (A_array{C==50e-12}, 'r', A_array{C==100e-12}, 'b',
A_array{C==200e-12}, 'g')");
+ show ("legend ('Compensated (50 pF)', 'Compensated (100 pF)', 'Compensated
(200 pF)')");
+
+ disp (" ");
+ disp ("Four plots are displayed, possibly overlaid.");
+ disp (" ");
+ ##
+ input ("Press Return to close the plots and continue:");
+ blanks ();
+ ##
+ close all;
+ disp ("");
+ disp ("");
+ disp (" Gain = 10");
+ disp (" +-------------+");
+ disp (" | |");
+ disp (" ---+ p |");
+ disp (" Loop | Stage 1 +--+---->");
+ disp (" | Amplifier | |");
+ disp (" -+-+ n | |");
+ disp (" | | | |");
+ disp (" | +-------------+ |");
+ disp (" | |");
+ disp (" +----+------R2-----+");
+ disp (" | |");
+ disp (" +-----Ccomp---+");
+ disp (" |");
+ disp (" |");
+ disp (" R1");
+ disp (" |");
+ disp (" Gnd");
+ disp ("");
+ disp ("The selected compensation capacitor is 100pf.");
+
+ show ("TFcomp = A_array{C==100e-12}");
+ show ("bode (TFopen, 'b', TFstage1, 'g', TFcomp, 'r')");
+ show ("legend ('TFopen', 'TFstage1', 'TFcomp')");
+
+ disp ("");
+ ##
+ input ("Press Return to close the plot and continue:");
+ blanks ();
+ ##
+ close all;
+ disp ("");
+ disp ("--- Low Pass Filter Design ---");
+ disp ("");
+ disp ("The low pass filter is composed of three equal sections.");
+ disp ("Develop one section and put three in series.");
+ disp ("");
+
+ show ("C = 20e-9");
+ show ("R = 1000");
+ show ("TFsection = tf ([1], [C*R, 1])");
+ disp ("");
+ show ("TFfilter = TFsection * TFsection * TFsection;");
+ if (verbose)
+ TFfilter
+ endif;
+
+ disp ("");
+ disp ("---- Final Design ----");
+ disp ("");
+ disp ("The final configuration is: AD797 --> LP Filter --> AD797");
+ disp ("");
+
+ show ("TFpreamp = TFcomp * TFfilter * TFcomp;");
+
+ show ("figure 1");
+ show ("bode (TFpreamp, {1, 1e5})");
+ show ("figure 2");
+ show ("margin (TFpreamp)");
+
+ disp ("");
+ disp ("Two plots are displayed, possibly overlaid.");
+ disp ("");
+ ##
+ input ("Press Return to close the plots and continue:");
+ blanks ();
+ ##
+ disp ("");
+ disp ("As can be seen from the plots, the gain margin is almost 30db.");
+ disp ("The phase margin is 230 degrees.");
+ disp ("");
+ ## disp ("Use 'close all' to close the plots.");
+ ##
+ close all
+ blanks ();
+ disp ("The resultant transfer function is over 100 characters long");
+ disp ("and will appear jumbled on narrower screens.");
+ disp ("");
+ show ("TFpreamp")
+ ##
+
+ if (nargout > 0)
+ retval = TFpreamp;
+ endif
+
+endfunction
+
+
+## support function to display a command and then
+## execute it in the caller's environment.
+function show (str)
+
+ disp ([">> ", str]);
+ evalin ("caller", str);
+
+endfunction
+
+
+## support function to insert blank lines in the display
+function blanks (n = 5)
+
+ for idx = 1:n
+ disp ("");
+ endfor
+
+endfunction