part # | description | pitch [mm] | manufacturer | replacement | manufacturer | |
C07, C08 | 2,200µF 35V 85°C 18x35mm SMC | 7.5 | Nippon Chemi-Con | 2,200µF 35V 105°C 16x25mm FR Type A | Panasonic | |
C09 | 15,000µF 16V 85°C 35x26mm SME | 10 | Nippon Chemi-Con | 18,000µF 16V 105°C 30x30mm LGU | Nichicon | |
C17 | 22µF 50V 85°C 10x11mm 513D | 3,5 | Sprague | 22µF 50V 105°C 5x11mm FR Type A | Panasonic |
part # | description | pitch [mm] | manufacturer | replacement | manufacturer | |
U121, U122 | DS1235YW-150 NVSRAM | 28P | Dallas | DS1230Y-120+ on precision socket | Maxim | |
U132 | DS1220Y-150 NVSRAM | 24P | Dallas | DS1220AD-150+ on precision socket | Maxim |
part # | description | pitch [mm] | manufacturer | replacement | manufacturer | |
C1, C11 | 680uF 50V 85°C 16x22mm SXE | 7.5 | Nippon Chemi-Con | 680µF 63V 105°C 16x25mm LXZ (max 25mm - height limited by case) | Europe Chemi-Con | |
C8 | 8,300µF 35V 85°C 25x67mm 53D | 70 | Sprague | 10,000µF 35V 85°C 25x61mm TVX | Nichicon | |
C200, C201 | 47µF 63V 85°C 8x15mm SME | 3,5 | Nippon Chemi-Con | 47µF 63V 105°C 8x11,5mm EB Type A | Panasonic | |
C202 | 330µF 25V 85°C 10x16mm SME | 5 | Nippon Chemi-Con | 330µF 25V 105°C 8x11,5mm FR Type A | Panasonic | |
C203 | 220µF 16V 85°C 8x15mm SME | 3,5 | Nippon Chemi-Con | 220µF 35V 105°C 8x11,5mm FR Type A | Panasonic | |
C15, C16 | 2.2nF 250V~ Y2 40/085/56 3,5x13x7mm PME 271 | 10 | RIFA | 2.2nF 300V~ Y2 55/105/56 4x13x9,5mm MKP | WIMA |
part # | description | pitch [mm] | manufacturer | replacement | manufacturer | |
Fan | 60x60x25mm 12V 0.7W powered with 15V | Papst | 60x60x25mm 24V 2.88W 109R0624D4011 (12-27.6V) | Sanyo Denki | ||
Mains Filter | 3A 47nF 2x750µH FN 323 | 40 | Schaffner | 6A 47nF 2x800µH KFS | Schurter |
The first two weeks were not promising: the SN18A check revealed drift of > 0.43ppm/day.I would hold the breathe, as sometimes bad A3's give you little tease, before they go back driftin. Don't ask me how I know...
It appeared to become a member of A3-sickness club, but fortunately the drift went down to sub 0.01ppm/day for last week :-+
The adc shows a TC of ~0.33ppm, that is below the stated 0.4ppm in HP Journal p. 13.Pretty horrid, if that TC is actually of the unit, and not the measurement setup. I'd say good happy 3458A should be <0.1ppm TC on main 10V range (no ACAL of course).
QuoteThe adc shows a TC of ~0.33ppm, that is below the stated 0.4ppm in HP Journal p. 13.Pretty horrid, if that TC is actually of the unit, and not the measurement setup. I'd say good happy 3458A should be <0.1ppm TC on main 10V range (no ACAL of course).
Hello TiN,
how do you measure that on your 3458As?
Well, I remember we discussed this before at EEVBlog. Perhaps it's time we create separate thread "DMM temperature stability comparison project", not to pollute this fine thread?As there are placeholders and I appreciate all your input and feedback, it would be no problem for me to "pollute" this thread - far from it!
Maybe we should really open another thread about the different T.C. specifications and HW versions of the 3458A.I think there's value in that; I also think there's value in a basic "so you bought a good bench meter and want to know where it stands; here's the first 5 things to do and why..." with sub-threads of "here's how to do that on model XYZ".
...
the drift went down to sub 0.01ppm/day for last week
...
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# developed & tested with Python 3.9
from time import perf_counter_ns, sleep
import atexit
from Gpib import *
from statistics import mean, median, stdev
gpib_address = 22
def setup(addr):
inst = Gpib(0, addr)
inst.timeout(gpib.T10s)
inst.clear()
inst.write("TARM HOLD") # stop measurements
inst.write("PRESET FAST") # preset to fast mode, see p. 156 for high-speed mode
inst.write("END ALWAYS") # EOI line set true when the last byte of each reading sent (read needs end of data info)
#inst.write("DISP OFF") # set by PRESET FAST
#inst.write("MATH OFF") # set by PRESET FAST
#inst.write("MEM OFF") # set by PRESET FAST
#inst.write("AZERO OFF") # set by PRESET FAST
#inst.write("NRDGS 1,AUTO") # set by PRESET FAST
#inst.write("TRIG AUTO") # set by PRESET FAST (triggers whenever the multimeter is not busy)
inst.write("MFORMAT SINT") # DINT set by PRESET FAST
inst.write("OFORMAT SINT") # DINT set by PRESET FAST
inst.write("DEFEAT ON") # !!! input protection reduced (only +-100V up to 10V range allowed, +-1100V on 100V/1000V range) !!! see p. 157
inst.write("LOCK ON") # local lock - does nothing for speed, but prevents interruptions by use of frontpanel
inst.write("APER 1.4E-6") # fastest see manual p. 160
#inst.write("NPLC 1") # for testing throughput with NPLCs
#inst.write("DCV 1") # DCV 10 set by PRESET FAST
inst.write("ARANGE OFF") # needed according to p. 156 for high-speed mode, really needed if set to a range?
inst.write("DELAY 0") # sets the delay to its minimum possible value (100 ns) - see p. 159
return inst
def run_measurement(inst, runs=10000):
data = []
for _1 in range(3): # warmup
value = inst.read()
start = perf_counter_ns()
for i in range(runs):
value = inst.read()
time_ns = perf_counter_ns()
data.append([time_ns, value])
stop = perf_counter_ns()
return data, start, stop
def exit_handler(inst):
inst.clear() # needed to exit fast mode
inst.write("DISP ON") # enable diplay
inst.write("DISP MSG,\" \"") # better as DISP OFF to save display life
inst.write("LOCK OFF") # local lock disable
print('Exited gracefully')
def main():
global gpib_address
ns_to_ms = 1_000_000
dmm = setup(gpib_address)
atexit.register(exit_handler, dmm)
print (f"Starting throughput test with DMM address {gpib_address}, this will take some time ...")
dmm.write("ISCALE?")
scale = float(dmm.read().strip().decode("ascii"))
dmm.write("TARM AUTO") # start measurements (always armed) - see p. 159
sleep(1) # give the DMM some time to process settings
count = 10_000
data, start, stop = run_measurement(dmm, count)
delta_times = []
for n, datum in enumerate(data):
delta_time = datum[0]-data[n-1][0] if n > 0 else datum[0]-start # first delta_time is special
print (f"{n:6.0f}: {datum[0]} > {int.from_bytes(datum[1], byteorder='big', signed=True) * scale:3.6f}V dt: {delta_time/ns_to_ms:.3f}ms")
delta_times.append(delta_time)
print(f"Scale: {scale}")
print( f"mean: {mean(delta_times)/ns_to_ms:.3f}ms"
f"\nmedian: {median(delta_times)/ns_to_ms:.3f}ms"
f"\nstdev: {stdev(delta_times)/ns_to_ms:.3f}ms"
f"\nmin: {min(delta_times)/ns_to_ms:.3f}ms @{min(range(len(delta_times)), key=delta_times.__getitem__)}"
f"\nmax: {max(delta_times)/ns_to_ms:.3f}ms @{max(range(len(delta_times)), key=delta_times.__getitem__)}"
)
print( f"runtime: {(stop-start)/ns_to_ms:.3f}ms"
f"\ntime per sample: {(stop-start)/ns_to_ms/count:.3f}ms/spl")
if __name__ == "__main__":
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# developed & tested with Python 3.9
from time import sleep
from datetime import datetime, timedelta, timezone
from Gpib import *
import atexit
from multiprocessing import Process, Queue
measurement_filename = "3458A 10V 1NPLC test.csv"
gpib_address = 22
def setup_dmm(addr):
inst = Gpib(0, addr)
inst.timeout(gpib.T10s)
inst.clear()
inst.write("PRESET FAST")
inst.write("END ALWAYS")
inst.write("ARANGE OFF")
inst.write("DISP OFF") # Disable Diplay
inst.write("MATH OFF")
inst.write("MEM OFF")
inst.write("OFORMAT DINT") # SINT, ASCII
inst.write("DEFEAT ON")
inst.write("LOCK ON") # Local lock
inst.write("DCV 10")
inst.write("NPLC 1")
#inst.write("APER 1.4E-6")
inst.write("AZERO 0")
inst.write("TARM HOLD")
inst.write("NRDGS 1,AUTO")
inst.write("TRIG AUTO")
inst.write("DELAY 0")
return inst
def run_measurement(inst, filename, scale, queue, finish):
while not finish:
data = inst.read()
test_time = datetime.now(timezone.utc).astimezone()
queue.put(f"{test_time.isoformat()}\t{int.from_bytes(data, byteorder='big', signed=True) * scale:.6e}\n")
def write_data(value, filename, finish):
# with open(filename, 'a') as file_handle: # append
with open(filename, 'w') as file_handle: # overwrite
while not finish:
while not value.empty():
file_handle.write(value.get())
sleep(0.01)
def exit_handler(inst, finish, write_process, measurement):
finish = True # stop processes
inst.clear() # needed to exit fast mode
inst.write("DISP MSG,\" \"") # enable Display and empty
inst.write("LOCK OFF") # local lock disable
while write_process.is_alive() or measurement.is_alive():
print("Waiting for processes to end...")
sleep(0.01)
print('Despite the errors: exited gracefully')
def main():
global measurement_filename
global gpib_address
data = Queue() # multiprocessing queue for data
finish = False # process shared variable
dmm = setup_dmm(gpib_address)
write_process = Process(target=write_data, args=(data, measurement_filename, finish))
write_process.start()
dmm.write("ISCALE?")
scale = float(dmm.read().strip().decode('utf-8'))
dmm.write("TARM AUTO")
print (f"Collect Data DMM {gpib_address} to \"{measurement_filename}\"")
measurement = Process(target=run_measurement, args=(dmm, measurement_filename, scale, data, finish))
measurement.start()
atexit.register(exit_handler, dmm, finish, write_process, measurement) # graceful exit no matter what
print("Measurement running... finish with CTRL-C")
measurement.join()
print("Done with measurements")
if __name__ == "__main__":
main()
from pyvisa import ResourceManager
import time
import pandas as pd
DCVrange = 0.1
NPLC = 0.1
numsamp = 1000
sfreq = 50
sleeptime = 1
stime = 1/sfreq
aper = stime/2
logfile = 'test.csv'
rm = ResourceManager()
dmm = rm.open_resource('GPIB1::22::INSTR')
dmm.timeout = None
dmm.write("END ALWAYS")
dmm.write("BEEP OFF")
#dmm.write("MFORMAT ASCII")
dmm.write("OFORMAT ASCII")
print("")
print("Voltage meter: ", dmm.query("ID?"))
print("")
print("Waiting %d seconds" % sleeptime)
time.sleep(sleeptime)
dmm.write("DCV %f" % DCVrange)
dmm.write("APER %f" % aper)
dmm.write("TIMER %f" % stime)
dmm.write("NRDGS %d, TIMER" % numsamp)
dmm.write("AZERO ONCE")
dmm.write("MEM OFF")
dmm.write("INBUF ON")
dmm.write("RATIO OFF")
dmm.write("TARM AUTO")
dmm.write("TRIG SGL")
df = pd.DataFrame(columns = ("V","freq"), dtype = float)
V = []
times = []
t0 = time.time()
count = int(0)
while count < numsamp:
V.append(dmm.read_ascii_values()[0])
times.append(time.time()-t0)
pct_comp = count/numsamp
print(end='\x1b[2K\r')
print("Progress {:2.1%} ".format(pct_comp), end="\r",)
count = count + 1
df["V"] = V
df.to_csv(path_or_buf= logfile)
delta_t = times[numsamp-1]-times[0]
print("Average sample time: ", delta_t/(numsamp-1))
from pyvisa import ResourceManager
import time
import pandas as pd
import numpy as np
#import matplotlib.pyplot as plt
DCVrange = 0.1
numsamp = 10000
sfreq = 5000
sleeptime = 1
stime = 1/sfreq
aper = 80*stime/100
logfile = 'test.csv'
df = pd.DataFrame(columns = ("V","freq"), dtype = float)
rm = ResourceManager()
dmm = rm.open_resource('GPIB1::22::INSTR')
dmm.timeout = None
# Setup commands and clear errors
dmm.write("END ALWAYS")
dmm.write("BEEP OFF")
dmm.write("TARM HOLD")
dmm.write("TRIG HOLD")
dmm.write("ERR?")
dmm.write("OFORMAT ASCII")
print("")
print("Voltage meter: ", dmm.query("ID?"))
print("")
print("Waiting %d seconds" % sleeptime)
time.sleep(sleeptime)
# For high-speed mode
dmm.write("ARANGE OFF")
dmm.write("MATH OFF")
dmm.write("OFORMAT DINT")
dmm.write("DISP OFF")
# Measurement parameters
dmm.write("DCV %f" % DCVrange)
dmm.write("APER %f" % aper)
dmm.write("TIMER %f" % stime)
dmm.write("NRDGS %d, TIMER" % numsamp)
dmm.write("AZERO OFF")
dmm.write("MEM OFF")
dmm.write("INBUF ON")
dmm.write("RATIO OFF")
dmm.write("TARM AUTO")
V = np.empty([numsamp], dtype=np.int32)
t0 = time.time()
V = dmm.query_binary_values("TRIG SGL", datatype='i', delay=0, container=np.ndarray, data_points=numsamp, is_big_endian=True, header_fmt='empty')
scale_factor = dmm.query_ascii_values("ISCALE?")[0]
t_tot = time.time() - t0
avg_time = t_tot/(numsamp-1)
print("Average sample time: ", avg_time)
dmm.write("DISP ON")
dmm.write("BEEP ONCE")
dmm.write("OFORMAT ASCII")
df["V"] = V*scale_factor
df["freq"][0] = sfreq
df.to_csv(path_or_buf= logfile)
err_code = dmm.query("ERRSTR?")
if(int(err_code[0]) == 0):
print("Valid data: no errors")
else:
print("Invalid data: ", err_code)
Does anyone know what the two-position fan connector is called? I would like to order a replacement to swap fans in quickly.
Thank you.
Does anyone know how I can remove SCAL FREQ REQUIER message from the meter? I checked AC and Frequency and its all good. I just want to get rid of that message :horse:Probably you just have to do a frequency calibration. See service manual, how to.