Программа Python для построения IV кривых биполярного транзистора
Я пытаюсь написать программу на Python, которая может построить кривые IV биполярного транзистора с заданными параметрами устройства Is, Vt, Va и Beta. Я также хочу иметь возможность, учитывая Q-точку устройства, вычислять параметры слабого сигнала r_pi, ro и transconductance.
Я создал графический интерфейс с использованием библиотек PyQt4, matplotlib и numpy. Моя проблема в том, что мои кривые не получаются, как ожидалось, и я не уверен, почему. Я предоставил свой код для расчета тока коллектора, Ic. Кто-нибудь знает, что я могу делать не так? Для параметров я использовал значения:
Is = 10 * 10 ^ -15, бета = 100, Vt = 0,025 и Va = 100
Я думаю, может быть, я могу использовать плохие значения напряжения для Vbe и Vce, но я не уверен.
Код:
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
import numpy as np
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
import random
Vbe = [0 for x in range(7)]
Vbc = [0 for x in range(7)]
class Window(QtGui.QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
#### Create Widgets ####
self.plotButton = QtGui.QPushButton('Plot')
self.plotButton.setFixedWidth(100)
self.plotButton.setFixedHeight(30)
self.plotButton.clicked.connect(self.plot)
self.clearButton = QtGui.QPushButton('Clear Plot')
self.clearButton.setFixedWidth(100)
self.clearButton.setFixedHeight(30)
self.clearButton.clicked.connect(self.clear)
self.calculate = QtGui.QPushButton('r_pi, r_o, g_m')
self.calculate.setFixedWidth(120)
self.calculate.setFixedHeight(30)
self.calculate.clicked.connect(self.stuff)
self.param = QtGui.QLabel('<b>Enter Parameters:</b>')
self.param.setAlignment(QtCore.Qt.AlignLeft)
self.beta = QtGui.QLineEdit()
self.beta.setFixedWidth(70)
self.bLabel = QtGui.QLabel('Beta')
self.bLabel.setAlignment(QtCore.Qt.AlignRight)
self.Is = QtGui.QLineEdit()
self.Is.setFixedWidth(70)
self.IsLabel = QtGui.QLabel('I<sub>s</sub>')
self.IsLabel.setAlignment(QtCore.Qt.AlignRight)
self.Vt = QtGui.QLineEdit()
self.Vt.setFixedWidth(70)
self.VtLabel = QtGui.QLabel('V<sub>T</sub>')
self.VtLabel.setAlignment(QtCore.Qt.AlignRight)
self.Va = QtGui.QLineEdit()
self.Va.setFixedWidth(70)
self.VaLabel = QtGui.QLabel('V<sub>A</sub>')
self.VaLabel.setAlignment(QtCore.Qt.AlignRight)
self.VceEdit = QtGui.QLineEdit()
self.VceEdit.setFixedWidth(70)
self.VceEdit.setAlignment(QtCore.Qt.AlignLeft)
self.VceLabel = QtGui.QLabel('V<sub>CE</sub> (Q-Point)')
self.VceLabel.setAlignment(QtCore.Qt.AlignRight)
self.IcEdit = QtGui.QLineEdit()
self.IcEdit.setFixedWidth(70)
self.IcEdit.setAlignment(QtCore.Qt.AlignLeft)
self.IcLabel = QtGui.QLabel('I<sub>C</sub> (Q-Point)')
self.IcLabel.setAlignment(QtCore.Qt.AlignRight)
#### Set The Layout ####
layout = QtGui.QVBoxLayout()
layout.addWidget(self.canvas)
layout.addWidget(self.param)
layout2 = QtGui.QHBoxLayout()
layout2.addWidget(self.bLabel)
layout2.addWidget(self.beta)
layout2.addWidget(self.IsLabel)
layout2.addWidget(self.Is)
layout2.addWidget(self.VtLabel)
layout2.addWidget(self.Vt)
layout2.addWidget(self.VaLabel)
layout2.addWidget(self.Va)
layout2.addWidget(self.VceLabel)
layout2.addWidget(self.VceEdit)
layout2.addWidget(self.IcLabel)
layout2.addWidget(self.IcEdit)
layout.addLayout(layout2)
layout.addWidget(self.plotButton)
layout.addWidget(self.clearButton)
layout.addWidget(self.calculate)
self.setLayout(layout)
def clear(self):
plt.clf()
plt.cla()
print ('cleared')
def stuff(self):
self.qIc1 = str("%s" % self.IcEdit.text())
self.qVc1 = str("%s" % self.VceEdit.text())
def plot(self):
plt.cla()
self.betaVal = str("%s" % self.beta.text())
self.IsVal = str("%s" % self.Is.text())
self.VtVal = str("%s" % self.Vt.text())
self.VaVal = str("%s" % self.Va.text())
#### Compute Collector Current ####
data1, data2, data3 = [], [], []
Vbe1, Vbe2, Vbe3 = [], [], []
Vce1, Vce2, Vce3 = [], [], []
x1, x2, x3 = 6, 5, 4 #Vce
y1, y2, y3 = 5, 4, 2 #Vbe
for j in range(600):
x1, x2, x3 = x1 + 0.01, x2 + 0.01, x3 + 0.01
y1, y2, y3 = y1 + 0.01, y2 + 0.01, y3 + 0.01
Vce1.append(x1)
Vbe1.append(y1)
Vce2.append(x2)
Vbe2.append(y2)
Vbe3.append(x3)
Vce3.append(y3)
for i in range(600):
e1 = np.exp(Vbe1[i]/float(self.VtVal))
e2 = np.exp((Vbe1[i] - Vce1[i])/float(self.VtVal))
e3 = (float(self.IsVal)/float(self.betaVal))*(np.exp((Vbe1[i] - Vce1[i])/float(self.VtVal)) - 1)
e4 = (Vce1[i] + float(self.VaVal))/float(self.VaVal)
subtract = float(self.IsVal)*(e1 - e2) - e3
ic = subtract * e4
data1.append(ic)
e1 = np.exp(Vbe2[i]/float(self.VtVal))
e2 = np.exp((Vbe2[i] - Vce2[i])/float(self.VtVal))
e3 = (float(self.IsVal)/float(self.betaVal))*(np.exp((Vbe2[i] - Vce2[i])/float(self.VtVal)) - 1)
e4 = (Vce2[i] + float(self.VaVal))/float(self.VaVal)
subtract = float(self.IsVal)*(e1 - e2) - e3
#m1 = float(self.IsVal)*subtract
ic = subtract * e4
data2.append(ic)
e1 = np.exp(Vbe3[i]/float(self.VtVal))
e2 = np.exp((Vbe3[i] - Vce3[i])/float(self.VtVal))
e3 = (float(self.IsVal)/float(self.betaVal))*(np.exp((Vbe3[i] - Vce3[i])/float(self.VtVal)) - 1)
e4 = (Vce3[i] + float(self.VaVal))/float(self.VaVal)
subtract = float(self.IsVal)*(e1 - e2) - e3
#m1 = float(self.IsVal)*subtract
ic = subtract * e4
data3.append(ic)
self.ax = self.figure.add_subplot(111)
plt.xlabel('Vce')
plt.ylabel('Ic')
plt.title('BJT I-V Characteristics')
self.ax.plot(data1, 'r')
self.ax.plot(data2, 'b')
self.ax.plot(data3, 'g')
self.canvas.draw()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
main = Window()
main.setWindowTitle('BJT I-V Curve Plotter')
main.resize(1000, 600)
main.show()
sys.exit(app.exec_())
Мои результаты:
https://drive.google.com/file/d/0B3fmw_rxjp4nYVVMR2x2RThXTXc/view?usp=sharing
что бы я ожидал:
https://awrcorp.com/download/faq/english/examples/images%5Cbjt_amp_oppnt_bjt_iv_curves_graph.gif