WinSpice
and Matlab: automation of electronic simulations
In this article, a Matlab
routine to drive the WinSpice circuit
simulator is
presented. This
method can be easily adapted to
simulate and drive any circuit entered in this SPICE version.
The performance of the Matlab
driver is illustrated by simulating a typical amplifier circuit using
some resistors, capacitors and a transistor. In this
example
we're using Matlab ver. 7.0.1 and WinSpice3 ver. 1.04.07.
For more information about Matlab, visit mathworks.com.
For more information about WinSpice, visit winspice.com.
SPICE
stands for Simulation
Program
with Integrated
Circuit
Emphasis
Interchanging
information between Matlab and WinSpice allows
the
implementation of mathematical or optimization algorithms and graphical
possibilities not included in the circuit simulator environment itself.
The
approach
developed here is very flexible and utilizes the inherent capability of
this SPICE simulator to execute text files and print data
to external .csv (comma separated values) files.
First,
the circuit in Spice is defined (.cir file). This
circuit is simulated and tested within the WinSpice
environment
before
any attempt is made to interact with Matlab.
Second,
we prepare the output of the simulator by writing necessary data to an
external file, that is, we include 'write' commands in
the .cir file, so that the results are saved as external
(.csv) text files
available to Matlab.
Third,
we now generate a new version of the .cir file using Matlab
capabilities
for manipulating cellarrays (string matrices), we then insert a Matlab
statement to run the Spice simulator from the command line with the
.cir
filename as a
parameter.
After the simulation, we can read the results in the .csv files,
process them and act accordingly.
First Step:
We create, test and simulate this circuit in WinSpice:
We use these values:
R1 = 10k ohms, R2 = 5k ohms, R3 = 1k ohm,
R4 = 50 ohms, R5 = 1k ohm, R6 = 3k ohms
C1 = C2 = C3 = 10 uF
Q1 = transistor 2N2222
V1(ac) = 0.1V amplitude 1k Hz
V2(dc) = 30 V
The .cir file (text file) needed is:

Simple amplifier with Transistor 
V1
Vin 0 dc 0 ac
1 sin(0 0.1 1e3)
V2
Vcc 0 dc 30
R1
Vcc b 10e3
R2
b 0 5e3
R3
Vcc c 1ek
R4
e Vr 50
R5
Vr 0 1e3
R6
Vout 0 3e3
C1
c Vout 10e6
C2
Vr 0 10e6
C3
b Vin 10e6
Q1
c
b
e Q2N2222
.MODEL
Q2N2222 NPN
+(IS=3.108E15
XTI=3 EG=1.11 VAF=131.5 BF=217.5
+
NE=1.541 ISE=190.7E15 IKF=1.296 XTB=1.5 BR=6.18
+ NC=2
ISC=0 IKR=0 RC=1 CJC=14.57E12 VJC=.75
+
MJC=.3333 FC=.5 CJE=26.08E12 VJE=.75 MJE=.3333
+
TR=51.35E9 TF=451E12 ITF=.1 VTF=10 XTF=2)
.control
AC DEC
10 10 10MEGHZ
plot
vdb(Vout)
TRAN
10E6 5E3
plot
v(Vout)
.endc
.end
The AC and Transient analysis deliver these results:
Second Step:
We include appropriate 'write'
commands in the .cir file, so that the results are saved as
.csv
files available to Matlab.
The control block changes into:
.control
AC DEC
10 10 10MEGHZ
write f_ac_out.csv vdb(Vout)
TRAN
10E6 5E3
write f_tran_out.csv v(Vout)
quit
.endc
.end
Third Step:
We now create a function (to be run by Matlab) that can
reproduce the above .cir file (simulation of the
amplifier), modify relevant parameters with the command 'num2str' (which
changes numbers into strings), and launch the circuit
simulator. This is the full code that accomplishes
it:
function [Rac
Rtran] = spice_amp(x)
%
Create the file .cir to be run by WinSpice3.
%
Builtin function 'num2str' is used to modify parameters
%
wherever it is convenient.
b{1} = ['Simple
amplifier with Transistor '];
b{2} = ['
'];
b{3} = ['
'];
b{4} = ['V1 Vin
0
dc 0
ac 1
sin(0 0.1 1e3) '];
b{5} = ['V2 Vcc
0
dc 30 '];
b{6} = ['
'];
b{7} = ['R1 Vcc
b
10e3 '];
b{8} = ['R2 b
0
5e3 '];
b{9} = ['R3 Vcc
c
'
num2str(x(1))];
b{10} =
['R4 e
Vr '
num2str(x(2))];
b{11} =
['R5 Vr
0
1e3 '];
b{12} =
['R6 Vout 0
3e3 '];
b{13} =
[' '];
b{14} =
['C1 c
Vout
10e6 '];
b{15} =
['C2 Vr
0
10e6 '];
b{16} =
['C3 b
Vin
10e6 '];
b{17} =
[' '];
b{18} =
['Q1 c
b
e
Q2N2222 '];
b{19} =
[' '];
b{20} =
['.MODEL
Q2N2222 NPN '];
b{21} =
['+(IS=3.108E15
XTI=3 EG=1.11 VAF=131.5 BF=217.5 '];
b{22} =
['+
NE=1.541 ISE=190.7E15 IKF=1.296 XTB=1.5 BR=6.18 '];
b{23} =
['+
NC=2 ISC=0 IKR=0 RC=1 CJC=14.57E12 VJC=.75 '];
b{24} =
['+
MJC=.3333 FC=.5 CJE=26.08E12 VJE=.75 MJE=.3333 '];
b{25} =
['+
TR=51.35E9 TF=451E12 ITF=.1 VTF=10 XTF=2) '];
b{26} =
[' '];
b{27} =
['.control
'];
b{28} =
['AC
DEC 10 10 10MEGHZ '];
b{29} =
['write
amp_ac_out.csv vdb(Vout) '];
b{30} =
[' '];
b{31} =
['TRAN
10E6 5E3 '];
b{32} =
['write
amp_tran_out.csv v(Vout) '];
b{33} =
['quit
'];
b{34} =
['.endc
'];
b{35} =
['.end
'];
b{36} =
[' '];
%
Save file .cir linebyline
[r,c] =
size(b);
fp =
fopen('amplifier.cir', 'w+');
for i = 1 :
c
fprintf(fp,
'%s\n', b{i});
end
fclose(fp);
%
Run WinSpice
%
Make sure wspice3.exe and .cir files are available in this directory
!
wspice3 amplifier.cir
%
Read data saved in .csv files
%
(assuming name termination _ac_out.csv and _tran_out.csv)
[Rac
Rtran] = getWSpicedata('amp');
This is an
important portion of additional code to read the .csv files.
function [Rac
Rtran] = getWSpicedata(WSpiceBaseFile)
%
Read csv files generated by a 'write' in a 'WSpiceBaseFile' (.cir file)
%
Rac{1} = Frequency Points
%
Rac{2} = AC response
%
Rtran{1} = Time Points
%
Rtran{2} = Tran response
ac =
fopen([WSpiceBaseFile '_ac_out.csv']);
Rac =
textscan(ac, '%f
%*f %f %*f', 'delimiter',',','headerLines', 1);
tran =
fopen([WSpiceBaseFile '_tran_out.csv']);
Rtran =
textscan(tran, '%f
%f', 'delimiter',',','headerLines', 1);
fclose('all');
Now, we're ready to perform some simulations driving
WinSpice from Matlab.
clear;
clc; close all
%
We try some initial resistors
R3 =
1e3;
R4 = 50;
x = [R3
R4];
%
Matlab launches the simulator including our parameters
[Ra Rt]
= spice_amplifier(x);
figure
semilogx(Ra{1},Ra{2})
grid on
figure
plot(Rt{1},Rt{2})
grid on
%
We try another gain modifying one of the resistors
R3 =
500;
x = [R3
R4];
[Ra Rt]
= spice_amplifier(x);
figure
semilogx(Ra{1},Ra{2})
grid on
figure
plot(Rt{1},Rt{2})
grid on
For R3 =
1k and R4 = 50, the obtained results are:
For R3 = 500 and R4 = 50, the obtained results are:
We can now use WinSpice as if it was another builtin Matlab function!
This
means that we can work through circuit optimization using Matlab...
We
can try some numbers in our design, we can see the results and use
Matlab to modify relevant values in the circuit,
in iterations.
Very powerful, isn't it?
Reference:
/ 2014.
See
a variation of this technique
From
'WSpice' to home
From
'WinSpice' to Matlab Programming

