Hey all,
I acquired an HP 5370B about 11 months ago along with some other gear. Haven't done much with it up to this point, but a week ago I was talking to a colleague and the fact that their group had a rubidium standard (SRS SIM940/PRS10) came up. I was interested in characterizing the 5370B a bit since the last cal date on it is unknown to me. They were kind enough to let me set up the boat anchor in their lab and take some measurements of the rubidium standard over the weekend.
The SIM940 was marked as calibrated last in mid-2011, putting it within 3.5E-9 of 10 MHz (35 mHz) if I understand the
datasheet correctly. From the conversation I had, it seems that the unit has not been used in a while if that makes a difference in stability.
I believe the 5370B came from the local branch of CTS Microelectronics that shut down sometime in the last ten years. The unit is marked with a company sticker stating it is a calibration standard from the metrology department and not to be used for direct measurements, so my guess is that it was kept in calibration until they closed. Aging for this is less than 0.5 ppm (5 mHz) per day of operation if the device was on continuously for at least 30 days and off for less than 24 hrs or less than 1E-7 per day for continuous operation (I assume this means until the conditions for the 5E-10 ageing are met). I doubt that it met the 30 day condition, as I often unplug the power strip to my test equipment when I am not using it to save $$ and protect it from thunderstorms/poor line regulation; The house we rent is old and has ungrounded outlets just about everywhere, except for the remodeled kitchen and bathroom. Haven't convinced the XYL to let me set up the lab in either of those locations yet.
For the test, both instruments were plugged in Friday morning in the lab. Ideally I would have staggered this to isolate the drift to one instrument or the other, but I wanted to maximize sampling time. I started sampling roughly 15 minutes after plugging the instruments in and turning them on. The rubidium source is speced to be within 10 mHz of its final value by this point, so I attribute the majority of the drift to the 5370B settling in. Frequency measurements were taken on the 10 MHz output with a 1s gate. With the measurement read and save delay, the time between samples was [usually] 2 seconds. This is what I used for my graphs, but the end time on the graph is a few hours before when I actually ended the measurement, so there were some points that obviously had more than a 2 second gap between them. Final frequency value by Monday afternoon was about 36 mHz above 10Mhz, around the expected maximum ageing of the rubidium source. Not sure how much of that is the counter and how much is the standard, but doesn't seem too bad for 7-10 years after last cal.
I have downloaded Stable32 to try to look at the stability in more detail, but I am still trying to figure out the program and how to get a sigma - tau plot. Haven't taken stability this seriously before, so I am learning as I go. Below is the python code snippet I used to collect data from the 5370B over GPIB. Only issue I had was that the instrument didn't know how to interpret a pyvisa close() command, so I had to power cycle it between runs
I was writing and testing this code late the night before I started collecting data, so I gave up on trying to fix that and went to bed instead.
Any feedback or suggestion for next steps in analysis are welcome. At the very least, if I get nothing else from this, I have a counting good to within a Hz that I can used to calibrate my other counter as well as my analog function/pulse generators.
Jackson
import sys
import visa
rm = visa.ResourceManager()
try:
hp = rm.open_resource("GPIB0::20::INSTR", read_termination='\r\n')
except visa.VisaIOError as e:
print(e.args)
sys.exit()
hp.write("FN3 ST1 SS1 GT4 MD4")
#print(hp.query("MR"))
with open('RubidiumData.csv','a+') as f:
try:
while True:
hp.wait_for_srq()
data = hp.read()
print(hp.read())
f.write(data+'\n')
except KeyboardInterrupt:
print('Interrupted!')
hp.write('MD1')
f.close()