SA/GEN integration tests + bugfixes

This commit is contained in:
Jan Käberich 2022-11-20 20:48:36 +01:00
parent ec6fae5822
commit 0c17288ece
11 changed files with 171 additions and 15 deletions

View file

@ -5,6 +5,8 @@ testmodules = [
'tests.TestMode',
'tests.TestVNASweep',
'tests.TestCalibration',
'tests.TestGenerator',
'tests.TestSASweep',
]
suite = unittest.TestSuite()

View file

@ -149,10 +149,10 @@ class TestCalibration(TestBase):
cal.reset()
# grab trace data
S11 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S11"))
S12 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S12"))
S21 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S21"))
S22 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S22"))
S11 = self.vna.parse_VNA_trace_data(self.vna.query(":VNA:TRACE:DATA? S11"))
S12 = self.vna.parse_VNA_trace_data(self.vna.query(":VNA:TRACE:DATA? S12"))
S21 = self.vna.parse_VNA_trace_data(self.vna.query(":VNA:TRACE:DATA? S21"))
S22 = self.vna.parse_VNA_trace_data(self.vna.query(":VNA:TRACE:DATA? S22"))
# Attenuation is frequency dependent, use excessively large limits
# TODO: use smaller limits based on frequency

View file

@ -0,0 +1,16 @@
from tests.TestBase import TestBase
class TestGenerator(TestBase):
def test_Generator(self):
self.vna.cmd(":DEV:MODE GEN")
self.assertEqual(self.vna.query(":DEV:MODE?"), "GEN")
self.vna.cmd(":GEN:FREQ 2000000000")
self.assertEqual(float(self.vna.query(":GEN:FREQ?")), 2000000000)
self.vna.cmd(":GEN:LVL -12.34")
self.assertEqual(float(self.vna.query(":GEN:LVL?")), -12.34)
self.assertEqual(self.vna.query(":GEN:PORT?"), "0")
self.vna.cmd(":GEN:PORT 2")
self.assertEqual(self.vna.query(":GEN:PORT?"), "2")

View file

@ -0,0 +1,98 @@
from tests.TestBase import TestBase
import time
class TestSASweep(TestBase):
def waitSweepTimeout(self, timeout = 1):
self.assertEqual(self.vna.query(":SA:ACQ:FIN?"), "FALSE")
stoptime = time.time() + timeout
while self.vna.query(":SA:ACQ:FIN?") == "FALSE":
if time.time() > stoptime:
raise AssertionError("Sweep timed out")
def assertTrace_dB(self, trace, dB_nominal, dB_deviation):
for S in trace:
self.assertLessEqual(S[1], dB_nominal + dB_deviation)
self.assertGreaterEqual(S[1], dB_nominal - dB_deviation)
def test_sweep_frequency(self):
self.vna.cmd(":DEV:MODE SA")
self.vna.cmd(":SA:FREQ:CENT 2000000000")
self.vna.cmd(":SA:FREQ:SPAN 200000")
self.assertEqual(float(self.vna.query(":SA:FREQ:START?")), 1999900000)
self.assertEqual(float(self.vna.query(":SA:FREQ:STOP?")), 2000100000)
self.vna.cmd(":SA:ACQ:RBW 10000")
self.waitSweepTimeout(10)
port1 = self.vna.parse_SA_trace_data(self.vna.query(":SA:TRACE:DATA? PORT1"))
port2 = self.vna.parse_SA_trace_data(self.vna.query(":SA:TRACE:DATA? PORT2"))
self.assertEqual(port1[0][0], 1999900000)
self.assertEqual(port1[-1][0], 2000100000)
self.assertEqual(port2[0][0], 1999900000)
self.assertEqual(port2[-1][0], 2000100000)
# No signal present, signal level should be very low
self.assertTrace_dB(port1, -140, 60)
self.assertTrace_dB(port2, -140, 60)
def test_sweep_zerospan(self):
self.vna.cmd(":DEV:MODE SA")
self.vna.cmd(":SA:FREQ:CENT 2000000000")
self.vna.cmd(":SA:FREQ:SPAN 0")
self.assertEqual(float(self.vna.query(":SA:FREQ:START?")), 2000000000)
self.assertEqual(float(self.vna.query(":SA:FREQ:STOP?")), 2000000000)
self.vna.cmd(":SA:ACQ:RBW 10000")
self.waitSweepTimeout(10)
port1 = self.vna.parse_SA_trace_data(self.vna.query(":SA:TRACE:DATA? PORT1"))
port2 = self.vna.parse_SA_trace_data(self.vna.query(":SA:TRACE:DATA? PORT2"))
self.assertEqual(port1[0][0], 0.0)
self.assertGreater(port1[-1][0], 4.5)
self.assertLess(port1[-1][0], 5)
self.assertEqual(port2[0][0], 0.0)
self.assertGreater(port2[-1][0], 4.5)
self.assertLess(port2[-1][0], 5)
# No signal present, signal level should be very low
self.assertTrace_dB(port1, -140, 60)
self.assertTrace_dB(port2, -140, 60)
def test_tracking_generator(self):
self.vna.cmd(":DEV:MODE SA")
self.vna.cmd(":SA:FREQ:CENT 2000000000")
self.vna.cmd(":SA:FREQ:SPAN 200000")
self.vna.cmd(":SA:ACQ:RBW 10000")
self.vna.cmd(":SA:TRACK:PORT 1")
self.assertEqual(self.vna.query(":SA:TRACK:PORT?"), "1")
self.vna.cmd(":SA:TRACK:LVL -20")
self.vna.cmd(":SA:TRACK:OFFSET 0")
self.vna.cmd(":SA:TRACK:EN TRUE")
self.waitSweepTimeout(10)
port1 = self.vna.parse_SA_trace_data(self.vna.query(":SA:TRACE:DATA? PORT1"))
level = port1[0][1]
self.assertGreater(level, -30)
self.assertLess(level, -10)
# check tracking generator signal
self.assertTrace_dB(port1, level, 5)
# Enable normalization
self.vna.cmd(":SA:TRACK:NORM:LVL -10")
self.vna.cmd(":SA:TRACK:NORM:EN TRUE")
# wait for normalization to finish
self.waitSweepTimeout(10)
# trigger the next sweep
self.vna.cmd(":SA:ACQ:SINGLE TRUE")
self.waitSweepTimeout(10)
# Reported level on port1 should match normalization very closely now
port1 = self.vna.parse_SA_trace_data(self.vna.query(":SA:TRACE:DATA? PORT1"))
self.assertTrace_dB(port1, -10, 1)

View file

@ -20,7 +20,7 @@ class TestVNASweep(TestBase):
self.vna.cmd(":VNA:FREQuency:STOP 6000000000")
self.waitSweepTimeout(2)
S11 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S11"))
S11 = self.vna.parse_VNA_trace_data(self.vna.query(":VNA:TRACE:DATA? S11"))
self.assertEqual(S11[0][0], 1000000)
self.assertEqual(S11[-1][0], 6000000000)
@ -36,7 +36,7 @@ class TestVNASweep(TestBase):
self.vna.cmd(":VNA:FREQuency:ZERO 1500000000")
self.waitSweepTimeout(2)
S11 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S11"))
S11 = self.vna.parse_VNA_trace_data(self.vna.query(":VNA:TRACE:DATA? S11"))
self.assertEqual(S11[0][0], 0.0)
# Sweep should take about 0.125 seconds
self.assertGreater(S11[-1][0], 0.1)
@ -53,7 +53,7 @@ class TestVNASweep(TestBase):
self.vna.cmd(":VNA:POWER:STOP -10")
self.waitSweepTimeout(2)
S11 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S11"))
S11 = self.vna.parse_VNA_trace_data(self.vna.query(":VNA:TRACE:DATA? S11"))
self.assertEqual(S11[0][0], -30)
self.assertEqual(S11[-1][0], -10)