def _solve_(self): """Solve circuit, updating circuit variables dictionary.""" cv = self.cv cv['fp'] = 1./(2 * np.pi * cv['R'] * cv['C']) # A(s) = 1/(RCs + 1) cv['tfnum'] = [1] cv['tfden'] = [cv['R'] * cv['C'], 1] cv['fmin'] = 10 ** (np.floor(np.log10(cv['fp'])) - 3) cv['fmax'] = 10 ** ((np.floor(np.log10(cv['fp'])) + 1) + 3) cv['par_txt'] = 'R = '+nf(cv['R'])+r'$\Omega$'+'\nC = '+ nf(cv['C'])+'F'
def _solve_circuit(self): """Solve circuit, adding keys to cv dictionary.""" cv = self.cv bv = eledp.bjt.get_transistor(cv['Q']) cv['Vbb'] = Vbb = (cv['R2'] * 1./(cv['R1']+ cv['R2'])) * cv['Vcc'] cv['Rb'] = Rb = par(cv['R1'], cv['R2']) cv['IcQ'] = IcQ = (Vbb - bv['Vg']) * 1./cv['Re'] cv['VceQ'] = VceQ = cv['Vcc'] - (cv['Rc'] + cv['Re'])*IcQ cv['IbQ'], cv['hfe'], cv['hie'] = IbQ, hfe, hie = \ eledp.bjt.get_cp(VceQ, IcQ, cv['Q']) if IbQ < 0: # IbQ > 0 print 'a' self._valid = False return if VceQ < bv['Vces']: # VceQ > Vces print 'b' self._valid = False return if 50 * Rb*IbQ > Vbb: # Rb * IbQ << Vbb print 'c' self._valid = False return if 50 * IbQ > IcQ: # IcQ >> IbQ print 'd' self._valid = False return cv['Rc_o'] = cv['R'] + par(Rb, hie + cv['Re']*(1 + hfe)) cv['Rce_o'] = par(cv['Re'], (Rb + hie)*1./(1 + hfe)) cv['Rce_c'] = par(cv['Re'], (par(Rb, cv['R']) + hie) * 1./(1 + hfe)) cv['Rc_ce'] = cv['R'] + par(Rb, hie) cv['Rcc_o'] = cv['Rc'] a1 = cv['C']*cv['Rc_o'] + cv['Ce']*cv['Rce_o'] a2 = cv['C'] * cv['Ce'] * cv['Rce_o'] * cv['Rc_ce'] b1 = cv['Cc'] * cv['Rcc_o'] cv['fp1'] = - 1./(2*np.pi) * (-a1 - (a1**2 - 4*a2)**0.5) / (2*a2) cv['fp2'] = - 1./(2*np.pi) * (-a1 + (a1**2 - 4*a2)**0.5) / (2*a2) cv['fp3'] = 1./(2 * np.pi * cv['Cc'] * cv['Rcc_o']) cv['fz'] = 1./(2 * np.pi * cv['Re'] * cv['Ce']) # fp3 >> fp1,fp2,fz ovvero separazione in banda if 100 * cv['fp1'] > cv['fp3']: print 'e' self._valid = False return if 100 * cv['fp2'] > cv['fp3']: print 'f' self._valid = False return if 100 * cv['fz'] > cv['fp3']: print 'g' self._valid = False return cv['Acb'] = - cv['Rc'] * hfe * (1./(1 + hie*1./Rb)) * \ 1./(par(hie, Rb) + cv['R']) cv['fcap'] = - cv['fp1'] * cv['fp2'] * 1./cv['fz'] / cv['Acb'] cv['fmin'] = min(cv['fp1'], cv['fp2'], cv['fp3'], cv['fz']) * 10**-2 cv['fmax'] = max(cv['fp1'], cv['fp2'], cv['fp3'], cv['fz']) * 10**2 cv['tfnum']= [-1./(4 * np.pi**2 * cv['fcap'] * cv['fz']), -1./(2 * np.pi * cv['fcap']), 0] cv['tfden']=[b1* a2, a2 + a1*b1, a1 + b1, 1] cv['VuQ'] = cv['Vcc'] - cv['Rc']*cv['IcQ'] def pf(i): """On purpose function. See ahead""" pd = {'R': r'$\Omega$', 'C': 'F', 'V': 'V', 'I': 'A'} c = pd[i[0]] if i[0] in pd.keys() else '' return c cl = [] cl.append('Q: ' + cv['Q'] + '\n') for i in sorted(CVSTD.keys(), reverse=True): if i != 'Q': cl.append(i+ ' = ' + nf(cv[i]) + pf(i) + '\n') cv['par_txt'] = ''.join(cl) cv['freqs_txt'] = \ r'$f_z\,=\,' + ('%.4g' % cv['fz']) + 'Hz$\n' + \ r'$f_{p1}\,=\,' + ('%.4g' % cv['fp1']) + 'Hz$\n' + \ r'$f_{p2}\,=\,' + ('%.4g' % cv['fp2']) + 'Hz$\n' + \ r'$f_{p3}\,=\,' + ('%.4g' % cv['fp3']) + 'Hz$\n' + \ r'$\hat{f}\,=\,' + ('%.4g' % cv['fcap']) + 'Hz$'