136 lines
4.4 KiB
Python
136 lines
4.4 KiB
Python
import time
|
|
import argparse
|
|
|
|
import fn_gen.errors as fg_err
|
|
from common import close_output, abs, get_preamplified
|
|
from fn_gen import DG2052
|
|
from fn_gen.enums import SweepSignalType, SweepSpacing, SweepTriggerSource
|
|
|
|
|
|
def sweep_over_signal(
|
|
signal: str,
|
|
v_min: float,
|
|
v_max: float,
|
|
delay: int,
|
|
duration: int,
|
|
freq_start: int,
|
|
freq_stop: int,
|
|
phase: int,
|
|
spacing: str,
|
|
):
|
|
fg = DG2052("TCPIP::192.168.1.11::INSTR")
|
|
v_min = get_preamplified(13.0, v_min)
|
|
v_max = get_preamplified(13.0, v_max)
|
|
v = (v_max - v_min)/2
|
|
channel = 2
|
|
# signal_type = SweepSignalType.SINE
|
|
match signal:
|
|
case "sine":
|
|
fg.set_sine_wave(channel, freq_start, v, 0, 0)
|
|
case "square":
|
|
fg.set_square_wave(channel, freq_start, v, 0, 0)
|
|
case "ramp":
|
|
fg.set_ramp(channel, freq_start, v, 0, 0)
|
|
spacing_type = SweepSpacing.LOG
|
|
match spacing:
|
|
case "lin":
|
|
spacing_type = SweepSpacing.LIN
|
|
case "log":
|
|
spacing_type = SweepSpacing.LOG
|
|
try:
|
|
print(fg.whoami())
|
|
print(f"\nOutput{channel} Impedance: {fg.get_output_impedance(channel)} Ohm")
|
|
print(f"Output{channel} Load: {fg.get_output_load(channel)} Ohm")
|
|
print(f"Output{channel} Voltage Limits: {fg.get_output_volt_limits(channel)} V")
|
|
print(
|
|
f"Output{channel}: {fg.get_output_signal(channel)} | {fg.get_output_state(channel)}"
|
|
)
|
|
fg.set_output(channel, True)
|
|
time.sleep(delay)
|
|
# fg.trigger_sweep(channel)
|
|
t0 = time.time()
|
|
t1 = time.time()
|
|
freq = freq_start
|
|
freq_delta = (freq_stop - freq_start) / (duration*10_000)
|
|
while (t1 - t0) < duration:
|
|
print(f"Current Frequency: {fg.get_output_signal(channel)}")
|
|
if spacing_type == SweepSpacing.LIN:
|
|
freq = freq + freq_delta
|
|
match signal:
|
|
case "sine":
|
|
fg.set_sine_wave(channel, freq, v, 0, 0)
|
|
case "square":
|
|
fg.set_square_wave(channel, freq, v, 0, 0)
|
|
case "ramp":
|
|
fg.set_ramp(channel, freq, v, 0, 0)
|
|
time.sleep(0.0001)
|
|
t1 = time.time()
|
|
print(f"Output{channel} State: {fg.get_output_state(channel)}")
|
|
except fg_err.ValueOutOfBoundsError as err:
|
|
print(err)
|
|
except fg_err.UndefinedValueError as err:
|
|
print(err)
|
|
except KeyboardInterrupt:
|
|
pass
|
|
finally:
|
|
close_output(fg, channel)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(
|
|
description="This program is for testing the DG2052 function genrator library. It sweeps over a signal with the supplied parameters."
|
|
)
|
|
parser.add_argument(
|
|
"-s",
|
|
"--signal",
|
|
type=str,
|
|
choices=["sine", "square", "ramp"],
|
|
default="sine",
|
|
help='The type of signal being sweeped',
|
|
)
|
|
parser.add_argument(
|
|
"--vmin", type=float, default=0, help="The minimum voltage supplied"
|
|
)
|
|
parser.add_argument(
|
|
"--vmax", type=float, default=1, help="The maximum voltage supplied"
|
|
)
|
|
parser.add_argument(
|
|
"-d",
|
|
"--delay",
|
|
type=int,
|
|
default=0,
|
|
help="The buffer time before the sweep starts",
|
|
)
|
|
parser.add_argument(
|
|
"--duration", type=int, default=5 * 60, help="The duration of the sweep"
|
|
)
|
|
parser.add_argument(
|
|
"--freq-start", type=int, default=10, help="The start frequency of the sweep"
|
|
)
|
|
parser.add_argument(
|
|
"--freq-stop", type=int, default=1000, help="The stop frequency of the sweep"
|
|
)
|
|
parser.add_argument(
|
|
"-p",
|
|
"--phase",
|
|
type=int,
|
|
default=0,
|
|
help="The phase shift of the signal generated (must be between 0 and 360)",
|
|
)
|
|
parser.add_argument(
|
|
"--spacing",
|
|
type=str,
|
|
choices=["lin", "log"],
|
|
default="log",
|
|
help='The spacing of the sweep',
|
|
)
|
|
args = parser.parse_args()
|
|
if (
|
|
args.phase not in range(0, 360)
|
|
or args.spacing not in ["lin", "log"]
|
|
or args.signal not in ["sine", "square", "ramp"]
|
|
):
|
|
parser.print_help()
|
|
exit(1)
|
|
sweep_over_signal(args.signal, args.vmin, args.vmax, args.delay, args.duration, args.freq_start, args.freq_stop, args.phase, args.spacing)
|