home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / misc / hamstuff / network.bas (.txt) < prev    next >
Encoding:
GW-BASIC  |  1985-08-20  |  6.5 KB  |  272 lines

  1. 1000  ' NETWORK - An AC electronic circuit simulator program
  2. 1001  '
  3. 1002  ' Origional: "Verify Network Frequency Response With This
  4. 1003  '             Simple BASIC Program", Werner Schnider, EDN
  5. 1004  '<UNK! {0009}><UNK! {0009}>   magazine, Oct. 5, 1977 (HP 9830 implementation).  
  6. 1005  '
  7. 1010  ' Next:      "Basic Program Performs Circuit Analysis", Richard
  8. 1011  ' <UNK! {0009}><UNK! {0009}>   Steincross, EDN magazine, Sept. 1, 1982 (Apple ][
  9. 1012  ' <UNK! {0009}><UNK! {0009}>   implementation with inductive elements added)<UNK! {0009}>
  10. 1013  '
  11. 1020  ' Now:<UNK! {0009}>  Converted for the IBM PC/XT and compatibles by
  12. 1021  '<UNK! {0009}><UNK! {0009}>  Bruce A. Trolli, Cleveland, Oh., 2/16/85
  13. 1022  '
  14. 1100  CLS
  15. 1110  LOCATE 2,10:PRINT "AC ELECTRONIC CIRCUIT FREQUENCY RESPONSE"
  16. 1120  LOCATE 4,20:PRINT "NETWORK   (V1.0)"
  17. 1140  PRINT
  18. 1160  I=0:J=0:K=0:N=0:I1=0
  19. 1180  GOSUB 6200  <UNK! {0009}><UNK! {0009}><UNK! {0009}>' Print help information on screen
  20. 1190  PRINT
  21. 1200  Y=40                               ' Allocate memory for circuit
  22. 1220  'Note: If you have less than 64K in your system, you must decrease Y
  23. 1240  DIM A(Y,Y),B(Y,Y),P(Y,Y),Q(Y,Y),B1(Y,Y),Q1(Y,Y)
  24. 1300  N=0:PI=3.14159:LGTEN=8.68589<UNK! {0009}>' Initialize constants<UNK! {0009}>
  25. 1340  INPUT"What file for input? [Hit CR for list.] ",F$
  26. 1360  IF F$="" THEN FILES"*.net":GOTO 1340 <UNK! {0009}>' Show possible input files
  27. 1380  FOR I=1 TO LEN(F$)<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>' Check for extension
  28. 1400  IF MID$(F$,I,1)="." THEN J=I
  29. 1420  NEXT I
  30. 1440  IF J<>0 THEN F$=MID$(F$,1,J-1)<UNK! {0009}><UNK! {0009}>' Add .NET if missing<UNK! {0009}>
  31. 1460  F$=F$+".net"
  32. 1500  OPEN F$ FOR INPUT AS #1
  33. 1510  PRINT
  34. 1530  '
  35. 1531  '
  36. 1532  '************* Main Loop for Input of Circuit Description *************
  37. 1533  '
  38. 1540  IF EOF(1) THEN GOTO 2220
  39. 1545  INPUT #1,Z$
  40. 1550  PRINT Z$
  41. 1560  E$=Z$:Z$=LEFT$(Z$,1)
  42. 1570  IF Z$=";" THEN GOTO 1540              'Comment for Description of Circuit
  43. 1580  IF Z$="R" OR Z$="r" THEN 1860         'Resistors
  44. 1600  IF Z$="C" OR Z$="c" THEN 1900         'Capacitors
  45. 1620  IF Z$="L" OR Z$="l" THEN 1960         'Inductors
  46. 1640  IF Z$="O" OR Z$="o" THEN 2140         'Amplifiers
  47. 1660  IF Z$="F" OR Z$="f" THEN 2020         'Fets
  48. 1680  IF Z$="B" OR Z$="b" THEN 2060         'Bipolar Transistors
  49. 1720  CLOSE #1                              'Not Valid Component
  50. 1730  BEEP:BEEP
  51. 1740  PRINT
  52. 1760  PRINT"Bad component type":PRINT Z$
  53. 1800  PRINT
  54. 1840  END
  55. 1850  '
  56. 1851  '
  57. 1852  ' ************** Enter Component Parameters into Matrix ****************
  58. 1853  '
  59. 1860  INPUT #1,I,J,V <UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'resistor
  60. 1861  PRINT I,J,V
  61. 1880  V=1/V:GOSUB 3900:GOTO 1540
  62. 1900  INPUT #1,I,J,V <UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>' capacitor
  63. 1901  PRINT I,J,V
  64. 1920  V=V/1E+06
  65. 1940  GOSUB 4120:GOTO 1540
  66. 1960  INPUT #1,I,J,V <UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>' inductor
  67. 1961  PRINT I,J,V
  68. 1980  V=-1/V
  69. 2000  GOSUB 4260:GOTO 1540
  70. 2020  INPUT #1,K,J,I,V <UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'fet
  71. 2021  PRINT K,J,I,V
  72. 2040  L=J:GOTO 2200
  73. 2060  INPUT #1,K,J,I,B1,V <UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'npn transistor
  74. 2061  PRINT K,J,I,B1,V
  75. 2080  L=I:I=K:V=1/V:GOSUB 3900
  76. 2100  I=L:L=J:GOTO 2180
  77. 2120  <UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>' op amp
  78. 2140  INPUT #1,K,L,J,I,B1,V 'in+,-:out+,-:,gain,ohms
  79. 2141  PRINT K,L,J,I,B1,V
  80. 2160  V=1/V:GOSUB 3900
  81. 2180  V=B1*V
  82. 2200  GOSUB 4400:GOTO 1540
  83. 2220  E=1:F=N                                            'end read io
  84. 2240  CLOSE #1
  85. 2300  FOR I=0 TO N
  86. 2320  FOR J=0 TO N
  87. 2340  P(I,J)=A(I,J)
  88. 2360  Q1(I,J)=B1(I,J)
  89. 2380  Q(I,J)=B(I,J)
  90. 2400  NEXT J:NEXT I
  91. 3000  PRINT
  92. 3020  PRINT "This circuit has ";N;"nodes"
  93. 3040  PRINT "Node";E;"is INPUT &  Node";F;"IS OUTPUT"
  94. 3060  PRINT
  95. 3200  ' entry point for new freq range
  96. 3225  INPUT "Enter file for data save [CR for no-save]: ",DATFILE$
  97. 3226  IF DATFILE$<>"" THEN OPEN DATFILE$ FOR OUTPUT AS #2
  98. 3260  PRINT
  99. 3280  PRINT "Frequency range [Start,End,Increment (- for log incr)] ";
  100. 3320  INPUT G,H,D
  101. 3340  PRINT
  102. 3360  PRINT"        Frequency         Amplitude       Amplitude(db)  Phase"
  103. 3370  PRINT"--------------------------------------------------------------------"
  104. 3380  IF D<0 THEN F2=-D:GOTO 3420
  105. 3400  F2=1+(H-G)/D
  106. 3420  IF D<0 THEN D=-((H/G)^(1/(-D-1)))
  107. 3440  F1=G
  108. 3460  FOR I1=1 TO F2
  109. 3480  W=2*PI*F1:D1=E:D2=F:GOSUB 5660
  110. 3500  V=B1:U=D2
  111. 3520  IF (-1)^(E+F) >0 THEN 3560
  112. 3540  U=U-180
  113. 3560  D1=E:D2=E
  114. 3580  GOSUB 5660:V=V/B1:U=U-D2
  115. 3600  IF U>180 THEN U=U-360
  116. 3620  IF U<-180 THEN U=U+360
  117. 3640  DB=LGTEN*LOG(V)
  118. 3645  T1=F1
  119. 3646  T2=V
  120. 3647  T3=DB
  121. 3648  T4=U
  122. 3660  PRINT USING "##########.#######";T1;
  123. 3680  PRINT USING "###########.#######";T2;
  124. 3685  PRINT USING "#######.#######";T3;
  125. 3700  PRINT USING "#####.#######";T4
  126. 3705  IF DATFILE$<>"" THEN WRITE #2,T1,T2,T3,T4
  127. 3720  IF D<0 THEN F1 =-F1*D:GOTO 3760
  128. 3740  F1=F1+D
  129. 3760  NEXT I1
  130. 3765  CLOSE #2
  131. 3780  PRINT CHR$(7): ' ring bell
  132. 3800  PRINT "Do you want a new freq sweep ";
  133. 3820  INPUT Z$
  134. 3840  PRINT:IF Z$="y" OR Z$="Y" THEN 3000
  135. 3860  END
  136. 3885  '
  137. 3886  ' Calculation Portion
  138. 3887  '
  139. 3888  '
  140. 3900  IF I=0 THEN 4000
  141. 3920  A(I,I)=A(I,I)+V
  142. 3940  IF J=0 THEN 4020
  143. 3960  A(I,J)=A(I,J)-V
  144. 3980  A(J,I)=A(J,I)-V
  145. 4000  A(J,J)=A(J,J)+V
  146. 4020  IF I<N THEN 4060
  147. 4040  N=I
  148. 4060  IF J<N THEN 4100
  149. 4080  N=J
  150. 4100  RETURN
  151. 4120  IF I=0 THEN 4220
  152. 4140  B(I,I)=B(I,I)+V
  153. 4160  IF J=0 THEN 4020
  154. 4180  B(I,J)=B(I,J)-V
  155. 4200  B(J,I)=B(J,I)-V
  156. 4220  B(J,J)=B(J,J)+V
  157. 4240  GOTO 4020
  158. 4260  IF I=0 THEN 4360
  159. 4280  B1(I,I)=B1(I,I)+V
  160. 4300  IF J=0 THEN 4020
  161. 4320  B1(I,J)=B1(I,J)-V
  162. 4340  B1(J,I)=B1(J,I)-V
  163. 4360  B1(J,J)=B1(J,J)+V
  164. 4380  GOTO 4020
  165. 4400  IF I<>0 AND K<>0 THEN A(I,K)=A(I,K)+V
  166. 4420  IF J<>0 AND L<>0 THEN A(J,L)=A(J,L)+V
  167. 4440  IF J<>0 AND K<>0 THEN A(J,K)=A(J,K)-V
  168. 4460  IF I<>0 AND L<>0 THEN A(I,L)=A(I,L)-V
  169. 4480  IF K<N THEN 4520
  170. 4500  N=K
  171. 4520  IF L<N THEN 4560
  172. 4540  N=L
  173. 4560  GOTO 4020
  174. 4580  ' determinant computation
  175. 4600  IF N>1 THEN 4640
  176. 4620  D1=A(N,N):D2=B(N,N):RETURN
  177. 4640  D1=1:D2=0:K=1
  178. 4660  L=K
  179. 4680  S=ABS(A(K,K))+ABS(B(K,K))
  180. 4700  FOR I=K TO N
  181. 4720  T=ABS(A(I,K))+ABS(B(I,K))
  182. 4740  IF S>=T THEN 4780
  183. 4760  L=I:S=T
  184. 4780  NEXT I
  185. 4800  IF L=K THEN 4960
  186. 4820  FOR J=1 TO N
  187. 4840  S=-A(K,J)
  188. 4860  A(K,J)=A(L,J)
  189. 4880  A(L,J)=S
  190. 4900  S1=-B(K,J)
  191. 4920  B(K,J)=B(L,J):B(L,J)=S1
  192. 4940  NEXT J
  193. 4960  L=K+1
  194. 4980  FOR I=L TO N
  195. 5000  S1=A(K,K)*A(K,K)+B(K,K)*B(K,K)
  196. 5020  S=(A(I,K)*A(K,K)+B(I,K)*B(K,K))/S1
  197. 5040  B(I,K)=(A(K,K)*B(I,K)-A(I,K)*B(K,K))/S1
  198. 5060  A(I,K)=S:NEXT I
  199. 5080  J2=K-1
  200. 5100  IF J2=0 THEN 5220
  201. 5120  FOR J=L TO N
  202. 5140  FOR I=1 TO J2
  203. 5160  A(K,J)=A(K,J)-A(K,I)*A(I,J)+B(K,I)*B(I,J)
  204. 5180  B(K,J)=B(K,J)-B(K,I)*A(I,J)-A(K,I)*B(I,J)
  205. 5200  NEXT I:NEXT J
  206. 5220  J2=K:K=K+1
  207. 5240  FOR I=K TO N
  208. 5260  FOR J=1 TO J2
  209. 5280  A(I,K)=A(I,K)-A(I,J)*A(J,K)+B(I,J)*B(J,K)
  210. 5300  B(I,K)=B(I,K)-B(I,J)*A(J,K)-A(I,J)*B(J,K)
  211. 5320  NEXT J:NEXT I
  212. 5340  IF K<>N THEN 4660
  213. 5360  L=1
  214. 5380  J2=INT(N/2)
  215. 5400  IF N=2*J2 THEN 5480
  216. 5420  L=0
  217. 5440  D1=A(N,N)
  218. 5460  D2=B(N,N)
  219. 5480  FOR I=1 TO J2
  220. 5500  J=N-I+L
  221. 5520  S=A(I,I)*A(J,J)-B(I,I)*B(J,J)
  222. 5540  S1=A(I,I)*B(J,J)+A(J,J)*B(I,I)
  223. 5560  T=D1*S-D2*S1
  224. 5580  D2=D2*S+D1*S1
  225. 5600  D1=T
  226. 5620  NEXT I
  227. 5640  RETURN
  228. 5660  N1=N:N=N-1:I=0
  229. 5680  FOR K=1 TO N
  230. 5700  IF K<>D1 THEN 5740
  231. 5720  I=1
  232. 5740  J=0
  233. 5760  FOR L=1 TO N
  234. 5780  IF L<>D2 THEN 5820
  235. 5800  J=1
  236. 5820  A(K,L)=P(K+I,L+J)
  237. 5840  B(K,L)=W*Q(K+I,L+J)+Q1(K+I,L+J)/W
  238. 5860  NEXT L:NEXT K
  239. 5880  GOSUB 4600
  240. 5900  N=N1
  241. 5920  B1=SQR(D1*D1+D2*D2)
  242. 5940  IF D1<>0 THEN 6020
  243. 5960  IF D2=0 THEN 6100
  244. 5980  IF D2>0 THEN D2=90:GOTO 6100
  245. 6000  D2=-90:GOTO 6100
  246. 6020  IF D1<0 THEN Q=180:GOTO 6060
  247. 6040  Q=0
  248. 6060  IF D2<0 THEN Q=-Q
  249. 6080  D2=Q+180*ATN(D2/D1)/PI
  250. 6100  RETURN
  251. 6200  '
  252. 6201  '
  253. 6202  '
  254. 6205  '******************** Print help information *****************
  255. 6206  '
  256. 6220  PRINT"Data must be in a text file in the following format:"
  257. 6240  PRINT
  258. 6260  PRINT"R    (resistor)"
  259. 6280  PRINT"from node #, to node #, value in ohms"
  260. 6300  PRINT"C    (capacitor)"
  261. 6320  PRINT"from node #, to node #, value in microfarads"
  262. 6340  PRINT"L    (inductor)"
  263. 6360  PRINT"from node #, to node #, value in henries"
  264. 6380  PRINT"F    (fet transistor)"
  265. 6400  PRINT"gate, source, drain, gain (amps/volts)"
  266. 6420  PRINT"B    (bipolar transistor)"
  267. 6440  PRINT"base, emitter, collector, beta, b-e ohms"
  268. 6460  PRINT"O    (op-amp)"
  269. 6480  PRINT"+in, -in, +out, -out, gain, ohms out"
  270. 6540  PRINT
  271. 6560  RETURN
  272.