This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
vsc e5f4633c39 This commit was generated by cvs2svn to compensate for changes in r4,
which included commits to RCS files with non-trunk default branches.


git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
2001-04-09 19:54:03 +00:00

314 lines
10 KiB
Plaintext

/*
**********************************************************************
*
* CLP(R) Version 2.0 (Example Programs Release)
* (C) Copyright, March 1986, Monash University
*
**********************************************************************
*/
%
% Transistor amplifier design and analysis package.
% The goal
% ?- go1.
% analyses an existing amplifier circuit, while the goal
% ?- go2.
% imposes certain design constraints on an amplifier of
% a certain form and then determines suitable component values,
% by choosing them from a list of available (preffered) components.
%
/****************************************************************************/
/* Major goals */
/****************************************************************************/
dc_analysis(Vcc1,Vcc2,Circuit):-
solve_dc(mean,Circuit ,[n(cc1,Vcc1,[_]),n(cc2,Vcc2,[_]),n(gnd,0,[_])],
Nodelist,Collector_Currents),
current_solve(Nodelist),
print_value(Nodelist),
print_circuit(Circuit).
full_analysis(Vcc1,Vcc2,Circuit,In,Out,Type,Stability,Gain,Inresist,Outresist):-
Inresist = -1 / Iin,
Gain = Vout,
Outresist = -1 / Iout,
circuit(Vcc1, Vcc2, Circuit,In, Out,Type),
solve_dc(mean,Circuit ,[n(cc1,Vcc1,[_]), n(cc2,Vcc2,[_]), n(gnd,0,[_])],
Nodelist,Collector_Currents),
current_solve(Nodelist),
%print_value(Nodelist),
stability(Vcc1,Vcc2,Circuit,Collector_Currents,Stability),
printf("Stab %\n",[Stability]),
solve_ss(Circuit,Collector_Currents,
[n(cc1,0,[_]),n(cc2,0,[_]),n(gnd,0,[_]),
n(In,1,[Iin]),n(Out,Vout,[])],Nodelist2),
current_solve(Nodelist2),
%print_value(Nodelist2),
solve_ss(Circuit,Collector_Currents,
[n(cc1,0,[_]),n(cc2,0,[_]),n(gnd,0,[_]),
n(Out,1,[Iout])],Nodelist3),
%print_value(Nodelist3),
current_solve(Nodelist3),
%print_value(Nodelist3),
printf("Outresist % \n",[Outresist]),
print_circuit(Circuit).
/****************************************************************************/
/* small signal equivalent solve */
/****************************************************************************/
solve_ss([],[], List,List).
solve_ss([[Component,_,Data,Points]|Rest],CCin,Innodes,Outnodes):-
connecting(Points,Volts,Amps,Innodes,Tmpnodes),
component_ss(Component,Data,Volts,Amps,CCin,CCout),
solve_ss(Rest,CCout,Tmpnodes,Outnodes).
component_ss(resistor,R,[V1,V2],[I,-1*I],Cc,Cc):-
V1-V2 = R*I,
resistor_val(R).
component_ss(capacitor,_,[V,V],[I,-1*I],Cc,Cc).
component_ss(transistor,[npn,Code,active],[Vb,Vc,Ve], [Ib,Ic,Ie],[Icol|CC],CC):-
Vb - Ve = (Beta * Vt / Icol) * Ib,
Ic = Beta * Ib,
Ie + Ic + Ib = 0,
transistor_type(Type,Code,Beta,_,_,Vt,mean).
/****************************************************************************/
/* dc component solving */
/****************************************************************************/
solve_dc(_, [], List, List, []).
solve_dc(Kind,[[Component,_,Data,Points] | Rest], Inlist,Outlist,CCin):-
connecting(Points, Volts, Amps, Inlist,Tmplist),
component_dc(Component,Data,Volts,Amps,CCin,CCout,Kind),
solve_dc(Kind, Rest, Tmplist,Outlist,CCout).
component_dc(resistor,R,[V1,V2],[I,-1*I],Cc,Cc,_):-
V1-V2 = R*I,
resistor_val(R).
component_dc(capacitor,_,[V1,V2],[0,0],Cc,Cc,_).
component_dc(transistor,[Type,Code,State],Volts, [Ib,Ic,Ie],[Ic|CC],CC,Kind):-
transistor_type(Type,Code,Beta,Vbe,Vcesat,_,Kind),
transistor_state(Type,State,Beta,Vbe,Vcesat,Volts,[Ib,Ic,Ie]).
component_dc(diode,[Code,State],Volts,Amps,Cc,Cc,_):-
diode_type(Code,Vf,Vbreak),
diode_state(State,Vf,Vreak,Volts,Amps).
/****************************************************************************/
/* diode and transistor states / and relationships */
/****************************************************************************/
diode_state(forward,Vf,Vbreak,[Vp,Vm],[I, -1*I]):-
/* forward biased */
Vp - Vm = Vf,
I >= 0.
diode_state(reverse,Vf,Vbreak,[Vp,Vm],[I, -1*I]):-
/* reverse biased */
Vp - Vm < Vf,
Vm - Vp < Vbreak,
I = 0.
transistor_state(npn, active, Beta, Vbe,_,[Vb, Vc, Ve], [Ib, Ic, Ie]):-
Vb = Ve + Vbe,
Vc >= Vb,
Ib >= 0,
Ic = Beta*Ib,
Ie+Ib+Ic = 0.
transistor_state(pnp, active, Beta, Vbe,_,[Vb, Vc, Ve], [Ib, Ic, Ie]):-
Vb = Ve + Vbe,
Vc <= Vb,
Ib <= 0,
Ic = Beta*Ib,
Ie+Ib+Ic = 0.
transistor_state(npn, saturated, Beta, Vbe, Vcesat,[Vb, Vc, Ve], [Ib, Ic, Ie]):-
Vb = Ve + Vbe,
Vc = Ve + Vcesat,
Ib >= 0,
Ic >= 0,
Ie+Ib+Ic = 0.
transistor_state(pnp, saturated, Beta, Vbe, Vcesat,[Vb, Vc, Ve], [Ib, Ic, Ie]):-
Vb = Ve + Vbe,
Vc = Ve + Vcesat,
Ib <= 0,
Ic <= 0,
Ie+Ib+Ic = 0.
transistor_state(npn, cutoff, Beta, Vbe, Vcesat,[Vb, Vc, Ve], [Ib, Ic, Ie]):-
Vb <= Ve + Vbe,
Ib = 0,
Ic = 0,
Ie = 0.
transistor_state(pnp, cutoff, Beta, Vbe, Vcesat,[Vb, Vc, Ve], [Ib, Ic, Ie]):-
Vb >= Ve + Vbe,
Ib = 0,
Ic = 0,
Ie = 0.
/****************************************************************************/
/* connecting components routines */
/****************************************************************************/
connecting([],[],[],List,List).
connecting([P|PR],[V|VR],[I|IR], Inlist,Outlist):-
connect(P,V,I,Inlist,Tmplist),
connecting(PR,VR,IR,Tmplist,Outlist).
connect(P,V,I,[],[n(P,V,[I])]):-!.
connect(P,V,I, [n(P,V,Ilist) | Rest],[n(P,V,[I|Ilist])|Rest]):-!.
connect(P,V,I, [A|Rest], [A|Newrest]) :-
connect(P,V,I, Rest, Newrest).
/****************************************************************************/
/* Stability Analysis */
/****************************************************************************/
stability(Vcc1,Vcc2,Circuit, CollectorCurrents, Stability):-
solve_dc(minn,Circuit ,[n(cc1,Vcc1,[_]),n(cc2,Vcc2,[_]),n(gnd,0,[_])],
Nodelist1,MinCurrents),
current_solve(Nodelist1),
% printf(" Min %\n Minmodes \n",[MinCurrents]),
% print_value(Nodelist1),
solve_dc(maxx,Circuit ,[n(cc1,Vcc1,[_]),n(cc2,Vcc2,[_]),n(gnd,0,[_])],
Nodelist2,MaxCurrents),
current_solve(Nodelist2),
% printf(" Max %\n Maxnodes\n",[MaxCurrents]),
% print_value(Nodelist2),
calculate(MinCurrents,MaxCurrents,CollectorCurrents,Stability).
calculate(MinCurrents,MaxCurrents,CollectorCurrents,Stability):-
cal(MinCurrents,MaxCurrents,CollectorCurrents,Percents),
% printf(" Percent % \n",[Percents]),
maxi(Percents,0,Stability).
cal([Min|Rin],[Max|Rax],[Ic|Rc],[Pc|Rpc]):-
Pc=max(Ic-Min,Max-Ic),
cal(Rin,Rax,Rc,Rpc).
cal([],[],[],[]).
maxi([N1|R],N2,P):-
M=max(N1,N2),
maxi(R,M,P).
maxi([],P,P).
/****************************************************************************/
/* Miscellaneous things */
/****************************************************************************/
current_solve([]).
current_solve([n(_,_,L) | Rest]) :-
kcl(L),
current_solve(Rest).
print_value([]).
print_value([n(P,V,I) | Rest]) :-
printf("% at % %\n",[P,V,I]),
print_value(Rest).
print_circuit([]).
print_circuit([[Comp,Name,Data,Points] | Rest]) :-
printf(" % at % %\n",[Comp,Name,Data]),
print_circuit(Rest).
sum([X|T],Z) :-
X+P = Z,
sum(T,P).
sum([],0).
kcl(L) :-
sum(L,0).
/****************************************************************************/
/* Database of circuits and components */
/****************************************************************************/
resistor_val(100).
resistor_val(50).
resistor_val(27).
resistor_val(5).
resistor_val(2).
resistor_val(1).
diode_type(di1, 0.6, 100).
transistor_type(npn, tr0, 100, 0.7, 0.3, 0.025,mean).
transistor_type(npn, tr0, 50, 0.8, 0.3, 0.025,minn).
transistor_type(npn, tr0, 150, 0.6, 0.3, 0.025,maxx).
transistor_type(pnp, tr1, 100, -0.7, -0.3, 0.025,mean).
transistor_type(pnp, tr1, 50, -0.8, -0.3, 0.025,minn).
transistor_type(pnp, tr1, 150, -0.6, -0.3, 0.025,maxx).
circuit(15,0,[
[capacitor,c1,c1,[in,b]],
[resistor,r1,R1,[b,cc1]],
[resistor,r2,R2,[b,gnd]],
[transistor,tr,[npn,tr0,active],[b,c,e]],
[resistor,re,Re,[e,gnd]],
[capacitor,c2,c2,[c,out]],
[resistor,rc,Rc,[c,cc1]],
[capacitor,c3,c3,[e,gnd]]],
in,out,common_emitter).
circuit(15,0,[
[capacitor,c1,C1,[gnd,b]],
[resistor,r1,R1,[b,cc1]],
[resistor,r2,R2,[b,gnd]],
[transistor,tr,[pnp,tr1,active],[b,c,e]],
[resistor,re,Re,[e,gnd]],
[capacitor,c2,C2,[c,in]],
[resistor,rc,Rc,[c,cc1]],
[capacitor,c3,C3,[e,out]]],
in,out,common_base).
circuit(15,0,[
[capacitor,c1,C1,[in,b]],
[resistor,r1,R1,[b,cc1]],
[resistor,r2,R2,[b,gnd]],
[transistor,tr,[npn,tr0,active],[b,cc1,e]],
[resistor,re,Re,[e,gnd]],
[capacitor,c3,C3,[e,out]]],
in,out,emitter_follower).
go1:- dc_analysis(15,-12,[
[diode,d1,[di1,St1],[a,gnd]],
[diode,d2,[di1,St2],[a,cc1]],
[resistor,r1,100,[a,cc1]],
[diode,d3,[di1,St3],[a,p1]],
[diode,d4,[di1,St4],[p1,b]],
[resistor,r2,100,[b,cc2]],
[transistor,tr,[npn,tr0,State],[b,c,gnd]],
[resistor,rc,100,[c,cc1]]]).
% Answer:
% cc1 at 15 [0, 0.144, 0, -0.144]
% cc2 at -12 [-0.114, 0.114]
% gnd at 0 [0, -0.03, 0.03]
% a at 0.6 [0.114, -0.144, 0, 0.03]
% p1 at 0 [0.114, -0.114]
% b at -0.6 [0, 0.114, -0.114]
% c at 15 [0, 0]
% diode at d1 [di1, forward]
% diode at d2 [di1, reverse]
% resistor at r1 100
% diode at d3 [di1, forward]
% diode at d4 [di1, forward]
% resistor at r2 100
% transistor at tr [npn, tr0, cutoff]
% resistor at rc 100
go2:-
Vcc = 15, Stability < 0.5, Gain > 0.5,
Inresistance >= 25, Outresistance <= 2,
full_analysis(Vcc, _, Circuit, _, _, emitter_follower, Stability,
Gain, Inresistance, Outresistance),
write(Circuit),nl.
% Answer:
% Stab 0.001947
% Outresist 0.857107
% capacitor at c1 Data_48
% resistor at r1 100
% resistor at r2 100
% transistor at tr [npn, tr0, active]
% resistor at re 100
% capacitor at c3 Data_52
% [[capacitor, c1, C1_48, [in, b]], [resistor, r1, 100, [b, cc1]],
% [resistor, r2, 100, [b, gnd]], [transistor, tr, [npn, tr0, active],
% [b, cc1, e]], [resistor, re, 100, [e, gnd]], [capacitor, c3, C3_52,
% [e, out]]]
?- printf("\n>>> Sample goals: go1/0, go2/0\n", []).