Rev 1233 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1230 | lvd | 1 | #!/usr/bin/env python |
2 | |||
3 | import sys |
||
4 | from sympy import * |
||
5 | |||
6 | e24 = [1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7, 3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1]; |
||
7 | e6 = [1.0, 1.5, 2.2, 3.3, 4.7, 6.8 ]; |
||
8 | |||
9 | |||
10 | |||
11 | def calc_mfb_lowpass(): |
||
12 | |||
1231 | lvd | 13 | # as in sloa049, fig.7-1 |
1233 | lvd | 14 | r1,r2,r3,c1,c2 = symbols('r1 r2 r3 c1 c2', real=True, positive=True) |
1230 | lvd | 15 | |
1231 | lvd | 16 | # v is input voltage, u is output, x is voltage at r1/c2/r2/r3 node |
17 | u,v,x = symbols('u v x') |
||
1230 | lvd | 18 | |
1231 | lvd | 19 | # currents through appropriate elements. |
20 | # ir1,ir2,ir3 flow into the node x, |
||
21 | # ic2 flows out of the node x |
||
22 | ir1,ic2,ir2,ir3 = symbols('ir1,ic2,ir2,ir3') |
||
1230 | lvd | 23 | |
1231 | lvd | 24 | # angular frequency (omega) |
1233 | lvd | 25 | w = symbols('w', real=True, positive=True) |
1230 | lvd | 26 | |
1231 | lvd | 27 | # make set of equations to calculate H |
28 | # |
||
29 | # current through r1 |
||
30 | h_eq1 = Eq( ir1, (v-x)/r1 ) |
||
31 | # |
||
32 | # current through c2 |
||
33 | h_eq2 = Eq( ic2, x/(1/(I*w*c2)) ) |
||
34 | # |
||
35 | # current through r2 |
||
36 | h_eq3 = Eq( ir2, (u-x)/r2 ) |
||
37 | # |
||
38 | # current through r3/c1 |
||
39 | h_eq4 = Eq( ir3, (u-x)/(r3 + 1/(I*w*c1)) ) |
||
40 | # |
||
41 | # node x charge conservation |
||
42 | h_eq5 = Eq( ir1+ir2+ir3, ic2 ) |
||
43 | # |
||
44 | # opamp NFB condition |
||
45 | h_eq6 = Eq( u-ir3*(1/(I*w*c1)), 0 ) |
||
1230 | lvd | 46 | |
1231 | lvd | 47 | # solve the set |
48 | u_solve = solve( [h_eq1, h_eq2, h_eq3, h_eq4, h_eq5, h_eq6], [x,u,ir1,ic2,ir2,ir3], dict=True, domain=S.Complexes ) |
||
1230 | lvd | 49 | |
1231 | lvd | 50 | if len(u_solve)!=1: |
51 | sys.stderr.write("Many or no solutions: {} !\n".format(u_solve)) |
||
52 | exit(1) |
||
53 | |||
54 | u_expr = u_solve[0] |
||
1230 | lvd | 55 | |
1231 | lvd | 56 | h_expr = u_expr[u]/v |
1230 | lvd | 57 | |
1231 | lvd | 58 | print(h_expr) |
1230 | lvd | 59 | |
60 | |||
61 | |||
1231 | lvd | 62 | # now make more substitutions |
63 | # |
||
1233 | lvd | 64 | h = symbols('h') |
65 | k = symbols('k', real=True, negative=True) |
||
66 | q,wc = symbols('q wc', real=True, positive=True) |
||
1231 | lvd | 67 | # |
68 | # filter gain |
||
69 | s_eq1 = Eq( k, -r2/r1 ) |
||
70 | # |
||
71 | # cutoff angular frequency |
||
72 | s_eq2 = Eq( wc, 1/sqrt(r2*r3*c1*c2) ) |
||
73 | # |
||
74 | # quality |
||
1233 | lvd | 75 | s_eq3 = Eq( q, sqrt(r2*r3*c1*c2)/(r3*c1+r2*c1-r3*c1*k) ) |
76 | #s_neq3 = Lt( k, 0 ) |
||
1231 | lvd | 77 | # |
78 | # new H expression |
||
79 | s_eq4 = Eq( h, h_expr ) |
||
1230 | lvd | 80 | |
1231 | lvd | 81 | # solve |
82 | h_solve = solve( [s_eq1, s_eq2, s_eq3, s_eq4], [h, r1, r2, r3, c1, c2], dict=True ) |
||
1230 | lvd | 83 | |
1231 | lvd | 84 | if len(h_solve)!=1: |
85 | sys.stderr.write("Many or no solutions: {} !\n".format(h_solve)) |
||
86 | exit(1) |
||
87 | |||
88 | h_expr = h_solve[0] |
||
89 | h_result = h_expr[h] |
||
90 | |||
1232 | lvd | 91 | init_printing() |
1233 | lvd | 92 | print('') |
1234 | lvd | 93 | #pprint(h_expr) |
1233 | lvd | 94 | print('') |
1234 | lvd | 95 | pprint(Eq(h,h_result)) |
1231 | lvd | 96 | |
97 | |||
1234 | lvd | 98 | rc_solve = solve( [s_eq1, s_eq2, s_eq3], [r3,c2], dict=True ) |
1231 | lvd | 99 | |
1234 | lvd | 100 | rc_expr = rc_solve[0] |
1231 | lvd | 101 | |
1234 | lvd | 102 | print('') |
103 | pprint(Eq(c2,rc_expr[c2])) |
||
104 | print('') |
||
105 | pprint(Eq(r3,rc_expr[r3])) |
||
106 | print('') |
||
1231 | lvd | 107 | |
1234 | lvd | 108 | """ |
109 | 2 |
||
110 | k⋅q⋅wc |
||
111 | h = ─────────────────────── |
||
112 | 2 2 |
||
113 | - q⋅w + q⋅wc + ⅈ⋅w⋅wc |
||
114 | |||
115 | q⋅(k - 1) |
||
116 | c₂ = ────────────────────── |
||
117 | r₂⋅wc⋅(c₁⋅q⋅r₂⋅wc - 1) |
||
118 | |||
119 | c₁⋅q⋅r₂⋅wc - 1 |
||
120 | r₃ = ─────────────── |
||
121 | c₁⋅q⋅wc⋅(k - 1) |
||
122 | |||
123 | """ |
||
124 | |||
125 | |||
126 | |||
1230 | lvd | 127 | def main(): |
128 | |||
1234 | lvd | 129 | #calc_mfb_lowpass() |
1230 | lvd | 130 | |
131 | |||
132 | if __name__=="__main__": |
||
1234 | lvd | 133 | main() |
1230 | lvd | 134 | |
1234 | lvd | 135 | |
136 |