From 89d3bec13998e767c3f0258f2533cce04f83eccb Mon Sep 17 00:00:00 2001 From: xans Date: Thu, 27 Feb 2025 23:10:32 +0100 Subject: [PATCH] Add NV-Scan-S7081-HP3488.py --- NV-Scan-S7081-HP3488.py | 155 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 NV-Scan-S7081-HP3488.py diff --git a/NV-Scan-S7081-HP3488.py b/NV-Scan-S7081-HP3488.py new file mode 100644 index 0000000..374656d --- /dev/null +++ b/NV-Scan-S7081-HP3488.py @@ -0,0 +1,155 @@ +import pyvisa +import os.path +import sys +import os +import csv +import datetime +import bme280 +import time + +NUMMEAS = 1 +NUMSAMPLES = 4 +NUMCHANNELS = 7 +NULLINGCHANNEL = 7 +SCANNERSLOT = 2 +AUTOZERO = 1 +ENVMON = 0 +BASESAVENAME = "Prod_VoltageBankLog_Ch" + +bus = smbus2.SMBus(1) +calibration_params = bme280.load_calibration_params(bus, 0x76) + +rm = pyvisa.ResourceManager() +inst2 = rm.open_resource('GPIB0::18::INSTR') # Meter +inst1 = rm.open_resource('GPIB0::9::INSTR') # Scanner + +def openCloseGPIB(openClose): + global GPIB + global inst1 + global inst2 + if openClose == "close": + GPIB.close + elif openClose == "open": + inst2 = GPIB.Gpib(0,18) # Meter + inst1 = GPIB.Gpib(0,9) # Scanner + +def getEnvironment(instObj, i2cbus): + value = instObj.sample(i2cbus, 0x76, calibration_params) + return value + +def closeChannel(instObj, scannerCardSlot, channel): + print("----- Closing channel: "+str(f"{channel:02}")+" on slot: "+str(scannerCardSlot)+" -----") + instObj.write("CLOSE "+str(scannerCardSlot)+str(f"{channel:02}")) + +def openChannel(instObj, scannerCardSlot, channel = 9): + if channel >= 9: + instObj.write("RESET") + else: + instObj.write("OPEN "+str(scannerCardSlot)+str(f"{channel:02}")) + +def readNVM(instObj): + # dummy reading for auto range + instObj.write("MOD=VDC:RAN=AUTO:NI=5")# DCV, AUTO RANGE, 5.5 digits + instObj.write("MEAS=SI") + time.sleep(2) + instObj.write("NI=8")# 8.5 digits + output = [] + # Set amount of samples + for i in range(NUMSAMPLES): + time.sleep(1) + instObj.write("MEAS=SI") + time.sleep(110*(AUTOZERO+1)) + output.append(instObj.read()) + output = instObj.read().split(' ') + output = map(float, output) + return (list(output)) + +def getMeanSTDev(values): + mean = sum(values)/len(values) + variance = sum([(x - mean) ** 2 for x in values]) / (len(values) - 1) + stddev = variance ** 0.5 + #print(mean,variance,stddev) + return mean, stddev + +# NVM Setup +inst2.write("DIS=ON") +inst2.write("HISTORY,CLEAR") +time.sleep(3) +inst2.write("MOD=VDC:RAN=10:NI=8")# 10VDC RANGE, 8.5 digits +inst2.write("MEAS=CON") +inst2.write("DELI=END") # Delimeter set to END +inst2.write("OUTPUT,GP-IB,ON") # Sets output via GPIB +inst2.write("DR=OFF") # Turns Drift Correction OFF +if AUTOZERO: + inst2.write("DR=ON") # Turns Drift Correction ON + +# Scanner setup +inst1.write("RESET") +inst1.write("CRESET 2") +inst1.write("CRESET 3") + +readings = [] + +for i in range(NUMCHANNELS): + # get the nulled channel value + closeChannel(inst1, SCANNERSLOT, i+10) + print("NULLING...") + nullMeanStatsA = [] + nullStddevStatsA = [] + for nulling in range(NUMMEAS): + nullReadingsA = readNVM(inst2) + nullMeanA, nullStddevA = getMeanSTDev(nullReadingsA) + nullMeanStatsA.append(nullMeanA) + nullStddevStatsA.append(nullStddevA) + nullMeanStats = [] + nullMeanStatsB = [] + nullStddevStatsB = [] + openChannel(inst1, SCANNERSLOT, i+10) + + closeChannel(inst1, SCANNERSLOT, i) + for nulling in range(NUMMEAS): + nullReadingsB = readNVM(inst2) + nullMeanB, nullStddevB = getMeanSTDev(nullReadingsB) + nullMeanStatsB.append(nullMeanB) + nullStddevStatsB.append(nullStddevB) + openChannel(inst1, SCANNERSLOT, i) + + nullMeanStats = nullMeanStatsB - nullMeanStatsA + + # read value + closeChannel(inst1, SCANNERSLOT, i) + MeanStats = [] + StddevStats = [] + for nulling in range(NUMMEAS): + Readings = readNVM(inst2) + Mean, Stddev = getMeanSTDev(Readings) + MeanStats.append(Mean) + StddevStats.append(Stddev) + openChannel(inst1, SCANNERSLOT, i) + + # compensate for nulling + meanNull, x = getMeanSTDev(nullMeanStats) + x, stddevNull = getMeanSTDev(nullMeanStats) + meanMeas, x = getMeanSTDev(MeanStats) + stddevMeas, x = getMeanSTDev(StddevStats) + meanCompensated = meanMeas - meanNull + stddevCompensated = stddevMeas + stddevNull + d = datetime.datetime.now() + dx = d - datetime.timedelta(microseconds=d.microsecond) + data = getEnvironment(bme280, bus) + fields=[dx.strftime("%d-%m-%y %H:%M:%S"),i+1,round(meanNull,10),round(stddevNull,10),round(meanMeas,10),round(stddevMeas,10),round(meanCompensated,10),round(stddevCompensated,10),round(data.humidity,2),round(data.temperature,2),round(data.pressure,2)] + print(fields) + + if not os.path.exists("data/"): + os.makedirs("data/") + if not os.path.exists("data/"+BASESAVENAME+str(i+1)+".csv"): + with open("data/"+BASESAVENAME+str(i+1)+".csv", 'w') as file: + file.writelines("DateTime;Channel;NullingMean;NullingStddev;MeasuredMean;MeasuredStddev;CompensatedMean;CompensatedStddev;EnvHumidity;EnvTemperature;EnvPressure") + else: + with open("data/"+BASESAVENAME+str(i+1)+".csv", 'a') as f: + writer = csv.writer(f) + writer.writerow(fields) +#inst1.write(":DISP:ENAB 0") +inst2.write("A1,''X") +#inst1.write(":DISP:TEXT:STAT 0") +GPIB.close() \ No newline at end of file