反相运算放大器参数计算与自动查询-OPAC

        平常的电路design中,对于反相运算放大器的使用较为频繁,需要根据输入电压和输出电压范围确定阻值,而实际阻值是离散的,需要反复迭代提高精度,基于此目的,开发了一款反相运算放大器的阻值参数计算与自动查询软件。

使用指南

        界面如下所示,设定输入电压最小、最大值,输出电压最小最大值以及用于偏置的电压,软件会自动计算缩放比例以及偏置电压的大小。(一开始的登录界面不用理会,没有设定密码,可直接打开,可以根据自己需求设定)

        以(1,5,0,3,5)为例,自动计算出缩放比例为0.75,偏置电压2.14V,设定好后,在右上方选择电阻精度,软件变会从库中查询阻值,将所有满足的阻值填充于列表中,并给出每组参数的误差以及功耗,方便选择。

为保证计算可靠性,之后将会加入调动仿真的功能,不断优化该软件。

源代码

主要有5个文件组成

1.主程序        mainV2.py

2.多线程查询 ResEThread.py

3.阻值查找    resSelectFromData.py

4.阻值库        Res.sqlite3

#mainV2.py
import sys
import time
import img
import matplotlib #绘图
import numpy as np
#非商用盈利,使用PyQt5
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QMessageBox, QProgressBar

from ResEThread import * #多线程查找阻值,防止影响主界面ui

matplotlib.use("Qt5Agg")  # 声明使用QT5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt

#界面类
class OPAShow(QWidget):
    def __init__(self):
        super(OPAShow, self).__init__()

        self.offset = 0
        self.scale = 0
        self.width = 1280 #固定窗口宽度
        self.height = 720 #固定窗口高度
        self.setFixedSize(self.width, self.height)

        self.setWindowTitle('OPA')#设定窗口标题
        self.initlogo()
        self.initInout()
        self.initRes()
        self.initTable()
        self.initResSelect()
        self.btn_set.clicked.connect(self.getData)
        self.Res24.clicked.connect(lambda: self.resE(24))#使用lambda表达式简化
        self.Res48.clicked.connect(lambda: self.resE(48))
        self.Res96.clicked.connect(lambda: self.resE(96))
        self.Res192.clicked.connect(lambda: self.resE(192))

    #填表
    def fillTable(self, data1, dataNum1, data2, dataNum2):  # 接受emit传来的信息data,执行相应操作

        if data1[0] == 1 and dataNum1[0] == 0 and data2[0] == 2 and dataNum2[0] == 4:
            QMessageBox.critical(self, "Error", "数据查询存在问题,可能不存在", QMessageBox.Reset)
            return 1

        row = 0
        # data, dataNum =
        self.tableWidget1.setRowCount(dataNum1)  # 行数
        for tup in data1:
            col = 0
            for item in tup:
                oneitem = QTableWidgetItem(item)
                self.tableWidget1.setItem(row, col, oneitem)
                col += 1
            row += 1

        row = 0
        # data, dataNum = result((VCC-self.offset)/self.offset)
        # data, dataNum =
        self.tableWidget2.setRowCount(dataNum2)  # 行数
        for tup in data2:
            col = 0
            for item in tup:
                oneitem = QTableWidgetItem(item)
                self.tableWidget2.setItem(row, col, oneitem)
                col += 1
            row += 1
        # 接收传递回来的值

    #查询完之后,重新显示按键,避免查询时多重触发
    def sqlFinish(self):
        self.Res24.setVisible(True)
        self.Res48.setVisible(True)
        self.Res96.setVisible(True)
        self.Res192.setVisible(True)
        self.state.setVisible(False)
        self.btn_set.setEnabled(True)
        self.btn_set.setStyleSheet(
            "#btn_set{border-radius:10px;background-color:rgba(201,79,79,1);font-size:36px;color:white;font-family:Microsoft YaHei}")

    #多线程操作,查询数据库
    def resE(self, E):
        self.thread = ResEThread(self.inMinValue, self.inMaxValue, self.outMinValue, self.outMaxValue, self.VCCValue,
                                 self.scale, self.offset, str(E))  # 实例化一个线程,参数t设置为100
        self.tableWidget1.clearContents()  # 清空表格所有内容
        self.tableWidget2.clearContents()
        # 将线程thread的信号sqlSignal和UI主线程中的槽函数fillTable进行连接
        self.thread.sqlSignal.connect(self.fillTable)
        self.thread.finished.connect(self.sqlFinish)
        # 启动线程,执行线程类中run函数
        self.thread.start()
        self.Res24.setVisible(False)
        self.Res48.setVisible(False)
        self.Res96.setVisible(False)
        self.Res192.setVisible(False)
        self.state.setVisible(True)
        self.btn_set.setEnabled(False)
        self.btn_set.setStyleSheet(
            "#btn_set{border-radius:10px;background-color:rgba(151, 153, 155,1);font-size:36px;color:white;font-family:Microsoft YaHei}")
        pass

    #校验数据
    def CheckFloat(self, data, type):
        try:
            dataC = float(data)
            return dataC
            # 是数字就返回,不是就reset
        except ValueError:
            ret = QMessageBox.critical(self, "Error", "输入不是有效数字,重新输入", QMessageBox.Reset)
            if ret == QMessageBox.Reset:
                if type == 1:
                    self.inputMin.setText('')
                elif type == 2:
                    self.inputMax.setText('')
                elif type == 3:
                    self.outputMin.setText('')
                elif type == 4:
                    self.outputMax.setText('')
                else:
                    self.VCC.setText('')
            return 123.4

    #精度选择按键ui
    def initResSelect(self):
        self.Res24 = QPushButton(self)
        self.Res24.setText("E24(5%)")
        self.Res24.setObjectName("RES24")
        self.Res24.setGeometry(720, 10, 100, 30)
        self.Res24.setStyleSheet("#RES24{border-radius:5px;background-color:rgba(0,220,180,"
                                 "1);font-size:18px;color:white;font-family:Microsoft YaHei}")
        self.Res24.setVisible(False)

        self.Res48 = QPushButton(self)
        self.Res48.setText("E48(2%)")
        self.Res48.setObjectName("RES48")
        self.Res48.setGeometry(840, 10, 100, 30)
        self.Res48.setStyleSheet("#RES48{border-radius:5px;background-color:rgba(0,194,222,"
                                 "1);font-size:18px;color:white;font-family:Microsoft YaHei}")
        self.Res48.setVisible(False)

        self.Res96 = QPushButton(self)
        self.Res96.setText("E96(1%)")
        self.Res96.setObjectName("RES96")
        self.Res96.setGeometry(960, 10, 100, 30)
        self.Res96.setStyleSheet("#RES96{border-radius:5px;background-color:rgba(0,162,240,"
                                 "1);font-size:18px;color:white;font-family:Microsoft YaHei}")
        self.Res96.setVisible(False)

        self.Res192 = QPushButton(self)
        self.Res192.setText("E192(0.1%)")
        self.Res192.setObjectName("RES192")
        self.Res192.setGeometry(1080, 10, 100, 30)
        self.Res192.setStyleSheet("#RES192{border-radius:5px;background-color:rgba(29,122,221,"
                                  "1);font-size:18px;color:white;font-family:Microsoft YaHei}")
        self.Res192.setVisible(False)

        self.state = QProgressBar(self)
        self.state.setGeometry(650, 10, 600, 30)
        self.state.setRange(0, 0)
        self.state.setObjectName("state")
        self.state.setStyleSheet("#state::chunk{background-color: rgba(57,133,94,1);border-radius: 2px;width: "
                                 "20px;margin:0.5px}#state{border: 2px solid rgba(240,240,240,1);background-color: "
                                 "rgba(240,240,240,1);}")
        self.state.setVisible(False)

    #获取输入数据,并进行数据校验、画图
    def getData(self):
        self.inMinValue = self.CheckFloat(self.inputMin.text(), 1)
        self.inMaxValue = self.CheckFloat(self.inputMax.text(), 2)
        self.outMinValue = self.CheckFloat(self.outputMin.text(), 3)
        self.outMaxValue = self.CheckFloat(self.outputMax.text(), 4)
        self.VCCValue = self.CheckFloat(self.VCC.text(), 5)
        # 数据校验
        if self.inMinValue == 123.4 or self.inMaxValue == 123.4 or self.outMinValue == 123.4 or self.outMaxValue == 123.4 or self.VCCValue == 123.4:
            return 1  # 异常退出,后续程序不再执行
        # print(inMinValue, inMaxValue, outMinValue, outMaxValue)
        inmid = (self.inMinValue + self.inMaxValue) / 2
        indelta = self.inMaxValue - self.inMinValue
        outmid = (self.outMinValue + self.outMaxValue) / 2
        outdelta = self.outMaxValue - self.outMinValue
        if outdelta == 0:
            QMessageBox.critical(self, "Error", "输出范围存在问题,请重新输入", QMessageBox.Reset)
            self.outputMin.setText('')
            self.outputMax.setText('')
            return 1
        try:
            self.scale = round(outdelta / indelta, 2)  # R2/R1=scale
        except:
            QMessageBox.critical(self, "Error", "scale为无穷大,输入数据存在问题,请重新输入", QMessageBox.Reset)
            self.inputMin.setText('')
            self.inputMax.setText('')
            return 1
        self.offset = round((outmid + self.scale * inmid) / (1 + self.scale), 2)

        # ----画图像---#
        self.R1.setText(str(self.scale))
        self.R3.setText(str(self.offset) + "V")

        plt.clf()  # clf() # 清图。cla() # 清坐标轴。close() # 关窗口
        t = np.linspace(self.inMinValue, self.inMaxValue, 50)
        y = self.offset * (self.scale + 1) - self.scale * t
        ax = self.figure.subplots()
        ax.plot(t, y)
        self.canvas.draw()
        self.Res24.setVisible(True)
        self.Res48.setVisible(True)
        self.Res96.setVisible(True)
        self.Res192.setVisible(True)
        self.tableWidget1.clearContents()  # 清空表格所有内容
        self.tableWidget2.clearContents()

    #ui
    #caps,hicaps Logo
    def initlogo(self):
        labelCaps = QLabel(self)
        labelCaps.setGeometry(QRect(11, 21, 371, 100))
        labelCaps.setPixmap(QPixmap(":/res/logo.png"))
        labelCaps.setScaledContents(True)  # 自适应QLabel大小

        labelHCaps = QLabel(self)
        labelHCaps.setGeometry(QRect(420, 1, 200, 130))
        labelHCaps.setPixmap(QPixmap(":/res/HiCaps.png"))
        labelHCaps.setScaledContents(True)  # 自适应QLabel大小

        labelGif = QLabel(self)
        labelGif.setGeometry(QRect(11, 115, 600, 125))
        labelGif.setScaledContents(True)
        labelGif.setPixmap(QPixmap(":/res/solar.png"))

        labelCirc = QLabel(self)
        labelCirc.setGeometry(QRect(250, 240, 371, 224))
        labelCirc.setPixmap(QPixmap(":/res/circuit.png"))
        labelCirc.setScaledContents(True)  # 自适应QLabel大小

    #ui
    #输入输出
    def initInout(self):
        label_inputMin = QLabel(self)
        label_inputMin.setText("InMin")
        label_inputMin.setObjectName("label_inputMin")
        label_inputMin.setAlignment(Qt.AlignVCenter)
        label_inputMin.setGeometry(15, 265, 100, 40)
        label_inputMin.setStyleSheet("#label_inputMin{font-size:20px;color:black;font-family:Microsoft YaHei}")
        self.inputMin = QLineEdit(self)
        self.inputMin.setGeometry(105, 270, 100, 30)
        self.inputMin.setAlignment(Qt.AlignHCenter)
        self.inputMin.setObjectName("inputMin")
        self.inputMin.setStyleSheet("#inputMin{border-radius:5px;"
                                    "font-size:24px;background-color:rgba(220,220,220,1);border:3px solid white;}")

        label_inputMax = QLabel(self)
        label_inputMax.setText("InMax")
        label_inputMax.setObjectName("label_inputMax")
        label_inputMax.setAlignment(Qt.AlignVCenter)
        label_inputMax.setGeometry(15, 305, 100, 40)
        label_inputMax.setStyleSheet("#label_inputMax{font-size:20px;color:black;font-family:Microsoft YaHei}")
        self.inputMax = QLineEdit(self)
        self.inputMax.setGeometry(105, 310, 100, 30)
        self.inputMax.setAlignment(Qt.AlignHCenter)
        self.inputMax.setObjectName("inputMax")
        self.inputMax.setStyleSheet("#inputMax{border-radius:5px;"
                                    "font-size:24px;background-color:rgba(220,220,220,1);border:3px solid white;}")

        label_outputMin = QLabel(self)
        label_outputMin.setText("OutMin")
        label_outputMin.setObjectName("label_outputMin")
        label_outputMin.setAlignment(Qt.AlignVCenter)
        label_outputMin.setGeometry(15, 345, 100, 40)
        label_outputMin.setStyleSheet("#label_outputMin{font-size:20px;color:black;font-family:Microsoft YaHei}")
        self.outputMin = QLineEdit(self)
        self.outputMin.setGeometry(105, 350, 100, 30)
        self.outputMin.setAlignment(Qt.AlignHCenter)
        self.outputMin.setText("0")
        self.outputMin.setObjectName("outputMin")
        self.outputMin.setStyleSheet("#outputMin{border-radius:5px;"
                                     "font-size:24px;background-color:rgba(220,220,220,1);border:3px solid white;}")

        label_outputMax = QLabel(self)
        label_outputMax.setText("OutMax")
        label_outputMax.setObjectName("label_outputMax")
        label_outputMax.setAlignment(Qt.AlignVCenter)
        label_outputMax.setGeometry(15, 385, 130, 40)
        label_outputMax.setStyleSheet("#label_outputMax{font-size:20px;color:black;font-family:Microsoft YaHei}")
        self.outputMax = QLineEdit(self)
        self.outputMax.setGeometry(105, 390, 100, 30)
        self.outputMax.setText("3")
        self.outputMax.setAlignment(Qt.AlignHCenter)
        self.outputMax.setObjectName("outputMax")
        self.outputMax.setStyleSheet("#outputMax{border-radius:5px;"
                                     "font-size:24px;background-color:rgba(220,220,220,1);border:3px solid white;}")

        label_VCC = QLabel(self)
        label_VCC.setText("VCC")
        label_VCC.setObjectName("label_VCC")
        label_VCC.setAlignment(Qt.AlignVCenter)
        label_VCC.setGeometry(15, 425, 130, 40)
        label_VCC.setStyleSheet("#label_VCC{font-size:20px;color:black;font-family:Microsoft YaHei}")
        self.VCC = QLineEdit(self)
        self.VCC.setGeometry(105, 430, 100, 30)
        self.VCC.setAlignment(Qt.AlignHCenter)
        self.VCC.setObjectName("VCC")
        self.VCC.setText("5")  # 默认值
        self.VCC.setStyleSheet("#VCC{border-radius:5px;"
                               "font-size:24px;background-color:rgba(220,220,220,1);border:3px solid white;}")

        self.btn_set = QPushButton(self)
        self.btn_set.setObjectName("btn_set")
        self.btn_set.setText("SET")
        self.btn_set.setGeometry(15, 470, 250, 65)
        self.btn_set.setStyleSheet(
            "#btn_set{border-radius:10px;background-color:rgba(201,79,79,1);font-size:36px;color:white;font-family:Microsoft YaHei}")

    #公式、scale、偏置电压
    def initRes(self):
        self.Mathjx = QLabel(self)
        self.Mathjx.setGeometry(15, 540, 260, 60)
        self.Mathjx.setAlignment(Qt.AlignHCenter)
        self.Mathjx.setObjectName("Mathjx")
        self.Mathjx.setPixmap(QPixmap(":/res/math.png"))
        self.Mathjx.setScaledContents(True)  # 自适应QLabel大小

        label_R1 = QLabel(self)
        label_R1.setText("缩放R2/R1:")
        label_R1.setObjectName("label_R1")
        label_R1.setAlignment(Qt.AlignVCenter)
        label_R1.setGeometry(25, 600, 140, 40)
        label_R1.setStyleSheet("#label_R1{font-size:20px;color:black;font-family:Microsoft YaHei}")
        self.R1 = QLabel(self)
        self.R1.setGeometry(160, 605, 80, 30)
        self.R1.setAlignment(Qt.AlignHCenter)
        self.R1.setObjectName("R1")
        self.R1.setStyleSheet("#R1{border-radius:5px;"
                              "font-size:24px;background-color:rgba(220,220,220,1);}")

        label_R3 = QLabel(self)
        label_R3.setText("偏置电压(+):")
        label_R3.setObjectName("label_R3")
        label_R3.setAlignment(Qt.AlignVCenter)
        label_R3.setGeometry(15, 660, 150, 40)
        label_R3.setStyleSheet("#label_R3{font-size:20px;color:black;font-family:Microsoft YaHei}")
        self.R3 = QLabel(self)
        self.R3.setGeometry(160, 665, 80, 30)
        self.R3.setAlignment(Qt.AlignHCenter)
        self.R3.setObjectName("R3")
        self.R3.setStyleSheet("#R3{border-radius:5px;"
                              "font-size:24px;background-color:rgba(220,220,220,1);}")


        self.TableP = QLabel(self)
        self.TableP.setObjectName("TableP")
        self.TableP.setGeometry(300, 470, 320, 240)
        self.TableP.setStyleSheet("#TableP{border-radius:5px;"
                                  "font-size:24px;background-color:rgba(255,255,255,1);border:3px solid white;}")

        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.TableP.setLayout(layout)

    #表格初始化ui
    def initTable(self):
        self.TableRes = QLabel(self)
        self.TableRes.setObjectName("TableRes")
        self.TableRes.setGeometry(650, 50, 600, 660)
        self.TableRes.setStyleSheet("#TableRes{border-radius:5px;"
                                    "font-size:24px;background-color:rgba(255,255,255,1);border:3px solid white;}")
        self.tableWidget1 = QtWidgets.QTableWidget(self.TableRes)
        self.tableWidget1.setGeometry(QtCore.QRect(10, 10, 500, 200))
        self.tableWidget1.setColumnCount(5)  # 列数
        self.tableWidget1.setHorizontalHeaderLabels(["R1", "R2", "误差%", "损耗R1", "损耗R2"])
        self.tableWidget1.setObjectName("tableWidget1")
        self.tableWidget1.horizontalHeader().setSortIndicatorShown(False)
        self.tableWidget1.setAlternatingRowColors(True)

        self.tableWidget1.setStyleSheet("#tableWidget1{font-size:16px;border:1px solid black;}")

        self.tableWidget2 = QtWidgets.QTableWidget(self.TableRes)
        self.tableWidget2.setGeometry(QtCore.QRect(10, 230, 500, 200))
        self.tableWidget2.setColumnCount(5)  # 列数
        self.tableWidget2.setHorizontalHeaderLabels(["R3", "R4", "误差%", "损耗R3", "损耗R4"])
        self.tableWidget2.setObjectName("tableWidget2")
        self.tableWidget2.horizontalHeader().setSortIndicatorShown(False)
        self.tableWidget2.setAlternatingRowColors(True)

        self.tableWidget2.setStyleSheet("#tableWidget2{font-size:16px;border:1px solid black;}")

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.tableWidget1)
        layout.addWidget(self.tableWidget2)
        self.TableRes.setLayout(layout)

#登录界面
class login(QWidget):
    def __init__(self):
        super(login, self).__init__()
        self.initUI()
        self.btnlogin.clicked.connect(self.checkpw)

    def checkpw(self):
        user = self.user.text()
        pw = self.pw.text()
        # if user == 'ccc' and pw == str((time.localtime().tm_hour+time.localtime().tm_min)):
        # if user == 'ccc' and pw == str(123):
        self.close()
        self.main = OPAShow()
        self.main.show()

    def initUI(self):
        self.width = 960
        self.height = 540
        self.setFixedSize(self.width, self.height)
        self.setWindowTitle('登录')
        # self.setWindowFlags(Qt.CustomizeWindowHint)
        Logo = QLabel(self)
        Logo.setObjectName("Logo")
        Logo.setGeometry(QRect(0, 0, 960, 540))
        Logo.setPixmap(QPixmap(":/res/Login.jpg"))
        Logo.setScaledContents(True)  # 自适应QLabel大小
        grey = QLabel(self)
        grey.setObjectName("grey")
        grey.setGeometry(QRect(300, 180, 360, 220))
        grey.setStyleSheet("#grey{background-color:rgba(220,220,220,0.7);border-radius:10px}")

        LogoCaps = QLabel(self)
        LogoCaps.setGeometry(QRect(350, 60, 266, 93))
        LogoCaps.setPixmap(QPixmap(":/res/HiCapszi.png"))
        LogoCaps.setScaledContents(True)  # 自适应QLabel大小

        label_user = QLabel(self)
        label_user.setObjectName("labeluser")
        label_user.setGeometry(QRect(350, 200, 50, 30))
        label_user.setText("账号")
        label_user.setStyleSheet("#labeluser{font-size:24px;color:black;font-family:Microsoft YaHei}")

        self.user = QLineEdit(self)
        self.user.setObjectName("user")
        self.user.setGeometry(QRect(420, 200, 200, 30))
        self.user.setStyleSheet(
            "#user{border:1px black;font-size:20px;background-color:rgba(240, 240, 240,0.7);border-radius:5px}")

        label_pw = QLabel(self)
        label_pw.setObjectName("labelpw")
        label_pw.setGeometry(QRect(350, 250, 50, 30))
        label_pw.setText("密码")
        label_pw.setStyleSheet("#labelpw{font-size:24px;color:black;font-family:Microsoft YaHei;}")

        self.pw = QLineEdit(self)
        self.pw.setObjectName("pw")
        self.pw.setEchoMode(QLineEdit.Password)
        self.pw.setGeometry(QRect(420, 250, 200, 30))
        self.pw.setStyleSheet(
            "#pw{border:1px black;font-size:20px;background-color:rgba(240, 240, 240,0.7);border-radius:5px}")

        self.btnlogin = QPushButton(self)
        self.btnlogin.setObjectName("btnlogin")
        self.btnlogin.setText("Sign In")
        self.btnlogin.setGeometry(380, 320, 220, 65)
        self.btnlogin.setStyleSheet(
            "#btnlogin{border-radius:10px;background-color:rgba(0, 114, 206,1);font-size:36px;color:white;font-family:Microsoft YaHei}")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    data = []
    w = login()
    w.show()
    sys.exit(app.exec())
#ResEThread.py
from PyQt5.QtCore import QThread, pyqtSignal
from resSelectFromData import result

class ResEThread(QThread):
    # 自定义一个sql查询信号
    sqlSignal = pyqtSignal(list, int, list, int)

    # 带一个参数t
    def __init__(self, inMinValue, inMaxValue, outMinValue, outMaxValue, VCC, scale, offset, E, parent=None):
        super(ResEThread, self).__init__(parent)

        self.E = E
        self.inMinValue = inMinValue
        self.inMaxValue = inMaxValue
        self.outMinValue = outMinValue
        self.outMaxValue = outMaxValue
        self.VCC = VCC
        self.scale = scale
        self.offset = offset

    # run函数是子线程中的操作,线程启动后开始执行
    def run(self):
        try:
            #根据scale查询的结果,scale=R2/R1
            data12, dataNum12 = result(self.inMinValue, self.inMaxValue, self.outMinValue, self.outMaxValue, self.VCC,
                                       self.scale, self.offset, 1, self.E)

            # 根据offset查询的结果,变比=offset/(vcc-offset)
            data34, dataNum34 = result(self.inMinValue, self.inMaxValue, self.outMinValue, self.outMaxValue, self.VCC,
                                       self.scale, self.offset, 2, self.E)

            self.sqlSignal.emit(data12, dataNum12, data34, dataNum34)  # 注意这里与_signal = pyqtSignal(str)中的类型相同
        except:
            self.sqlSignal.emit([1], [0], [2], [4])
#resSelectFromData.py
import sqlite3 as pymysql


def result(inMinValue, inMaxValue, outMinValue, outMaxValue, VCC, scale, offset, type, E):
    res = []
    db = pymysql.connect('Res.sqlite3')
    cursor = db.cursor()
    sql = 'select count(*) from Res' + E + ''
    cursor.execute(sql)
    COUNT = cursor.fetchone()[0]
    #type = 1 查找比例电阻
    if type == 1:
        for i in range(1, COUNT):
            sql = "select value from Res" + E + " where id='{}'".format(i)
            cursor.execute(sql)
            base = cursor.fetchone()[0]
            for j in range(1, COUNT):
                if scale >= 1:
                    if j <= i:
                        continue
                elif scale < 1:
                    if j > i:
                        continue
                sql = "select * from Res" + E + " where id='{}'".format(j)
                cursor.execute(sql)
                dest = cursor.fetchone()
                err = abs(dest[1] - scale * base)

                if err <= base * 0.1:
                    # key = dest[0]
                    loss1 = pow((inMinValue - offset), 2) / base
                    loss2 = pow((inMaxValue - offset), 2) / base
                    lossBase = loss1 if loss1 > loss2 else loss2
                    loss3 = pow((outMinValue - offset), 2) / dest[1]
                    loss4 = pow((outMaxValue - offset), 2) / dest[1]
                    lossdest = loss3 if loss3 > loss4 else loss4
                    tup = (
                        str(base), str(dest[1]), str(round(err/base, 2) * 100), str(round(lossBase, 2)), str(round(lossdest, 2)))
                    res.append(tup)
                    break
        cursor.close()
        db.close()
        resNum = len(res)
        return res, resNum
    else:
        for i in range(1, COUNT):
            sql = "select value from Res" + E + " where id='{}'".format(i)
            cursor.execute(sql)
            base = cursor.fetchone()[0]
            scaleOffset =1/( VCC/offset-1 )#R3/R4
            for j in range(1, COUNT):
                if scaleOffset >= 1:
                    if j <= i:
                        continue
                elif scaleOffset < 1:
                    if j > i:
                        continue
                sql = "select * from Res" + E + " where id='{}'".format(j)
                cursor.execute(sql)
                dest = cursor.fetchone()
                err = abs(dest[1] - scaleOffset * base)

                if err <= base * 0.1:
                    # key = dest[0]
                    loss3 = pow((VCC - offset), 2) / dest[1]
                    loss4 = pow(offset, 2) / base
                    tup = (str(base), str(dest[1]), str(round(err/base, 2) * 100), str(round(loss3, 2)), str(round(loss4, 2)))
                    res.append(tup)
                    break
        cursor.close()
        db.close()
        resNum = len(res)
        return res, resNum

if __name__ == '__main__':
    res = result(0.5,2.1,0,3,5,1.88,1.37,1,'24')
    print(res)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值