From dc85a009700bc7d22379a1dd98a0088e971c8832 Mon Sep 17 00:00:00 2001 From: Julien Barrier <1346858+julienbarrier@users.noreply.github.com> Date: Wed, 23 Aug 2023 17:17:32 +0200 Subject: [PATCH 1/4] add driver --- .../drivers/RohdeSchwarz/SMB100A.py | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py diff --git a/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py b/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py new file mode 100644 index 000000000..00bbf39bf --- /dev/null +++ b/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- +"""QCoDeS-Driver for Rohde & Schwartz SMB100A microwave signal generator: +https://www.rohde-schwarz.com/us/products/test-and-measurement/analog-signal-generators/rs-smb100a-microwave-signal-generator_63493-9379.html + +Authors: + Julien Barrier, + +Future improvements: + add modulation functions +""" +import logging +from typing import Any + +from qcodes import VisaInstrument, Parameter +from qcodes import validators as vals +from qcodes.utils.helpers import create_on_off_val_mapping + +log = logging.getLogger(__name__) + + +class RohdeSchwarz_SMB100A(VisaInstrument): + """ + Class to represent a Rohde & Schwartz SMB100A microwave signal generator + + status: beta-version + + Args: + name (str): name for the instrument + address (str): Visa resource name to connect + """ + def __init__(self, name: str, address: str, **kwargs: Any) -> None: + super().__init__(name, address, terminator='\n', **kwargs) + + self.frequency = Parameter( + 'frequency', + label='Frequency', + unit='Hz', + get_cmd='SOUR:FREQ?', + set_cmd='SOUR:FREQ {:.2f}', + get_parser=float, + vals=vals.Numbers(1e5, 20e9), + instrument=self + ) + + self.phase = Parameter( + 'phase', + label='Phase', + unit='deg', + get_cmd='SOUR:PHAS?', + set_cmd='SOUR:PHAS {:.2f}', + get_parser=float, + vals=vals.Numbers(0, 360), + instrument=self + ) + + self.power = Parameter( + 'power', + label='Power', + unit='dBm', + get_cmd='SOUR:POW?', + set_cmd='SOUR:POW {:.2f}', + get_parser=float, + vals=vals.Numbers(-120, 30), + instrument=self + ) + + self.status = Parameter( + 'status', + label='RF Output', + get_cmd=':OUTP:STAT?', + set_cmd=':OUTP:STAT {}', + val_mapping=create_on_off_val_mapping(on_val='1', off_val='0'), + instrument=self + ) + + self.pulsemod_state = Parameter( + 'pulsemod_state', + label='Pulse Modulation', + get_cmd=':SOUR:PULM:STAT?', + set_cmd=':SOUR:PULM:STAT {}', + val_mapping=create_on_off_val_mapping(on_val='1', off_val='0'), + instrument=self + ) + + self.sweep_freq_start = Parameter( + 'sweep_freq_start', + label='Sweep: start frequency', + unit='Hz', + get_cmd='FREQ:START?', + set_cmd='FREQ:START {:.12f} Hz', + get_parser=float, + vals=vals.Numbers(100e3, 20e9), + instrument=self + ) + + self.sweep_freq_stop = Parameter( + 'sweep_freq_stop', + label='Sweep: stop frequency', + unit='Hz', + get_cmd='FREQ:STOP?', + set_cmd='FREQ:STOP {:.12f} Hz', + get_parser=float, + vals=vals.Numbers(100e3, 20e9), + instrument=self + ) + + self.sweep_step = Parameter( + 'sweep_stop', + label='Sweep: frequency step', + unit='Hz', + get_cmd='SWE:STEP?', + set_cmd='SWE:STEP {:.12f} Hz', + get_parser=float, + vals=vals.Numbers(100e3, 20e9), + instrument=self + ) + + self.sweep_points = Parameter( + 'sweep_points', + label='Sweep: frequency points', + unit='', + get_cmd='SWE:POIN?', + set_cmd='SWE:POIN {:.12f}', + get_parser=int, + vals=vals.Numbers(2, 20e9), + instrument=self + ) + + self.sweep_dwell_time = Parameter( + 'sweep_dwell_time', + label='Sweep: dwell time', + unit='s', + get_cmd='SWE:DWEL?', + set_cmd='SWE:DWEL {:.12f} s', + get_parser=float, + vals=vals.Numbers(5e-3, 1000), + instrument=self + ) + + self.sourcemode = Parameter( + 'sourcemode', + label='Source mode', + get_cmd='SOUR:FREQ:MODE?', + set_cmd='SOUR:FREQ:MODE {}', + vals=vals.Enum('CW', 'SWE'), + instrument=self + ) + + self.sweepmode = Parameter( + 'sweepmode', + label='Frequency sweep mode', + get_cmd='TRIG:FSW:SOUR?', + set_cmd='TRIG:FSW:SOUR {}', + vals=vals.Enum('AUTO', 'SING'), + instrument=self + ) + + self.connect_message() + + def reset(self) -> None: + self.write('*RST') + + def run_self_tests(self) -> None: + self.write('*TST?') + + def on(self) -> None: + self.status('on') + + def off(self) -> None: + self.status('off') + + def start_sweep(self) -> None: + self.write('*TRG') From 8134f0cc71d34552f89d922dd4cd76a8e60af1e2 Mon Sep 17 00:00:00 2001 From: Julien Barrier <1346858+julienbarrier@users.noreply.github.com> Date: Thu, 24 Aug 2023 10:01:02 +0200 Subject: [PATCH 2/4] add logging and val_mapping --- .../drivers/RohdeSchwarz/SMB100A.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py b/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py index 00bbf39bf..1b29bd84f 100644 --- a/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py +++ b/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py @@ -142,6 +142,9 @@ def __init__(self, name: str, address: str, **kwargs: Any) -> None: label='Source mode', get_cmd='SOUR:FREQ:MODE?', set_cmd='SOUR:FREQ:MODE {}', + val_mapping={ + 'CW': 'CW', + 'sweep': 'SWE'}, vals=vals.Enum('CW', 'SWE'), instrument=self ) @@ -151,6 +154,9 @@ def __init__(self, name: str, address: str, **kwargs: Any) -> None: label='Frequency sweep mode', get_cmd='TRIG:FSW:SOUR?', set_cmd='TRIG:FSW:SOUR {}', + val_mapping={ + 'auto': 'AUTO', + 'single': 'SING'}, vals=vals.Enum('AUTO', 'SING'), instrument=self ) @@ -158,16 +164,21 @@ def __init__(self, name: str, address: str, **kwargs: Any) -> None: self.connect_message() def reset(self) -> None: + self.log.info('Reset') self.write('*RST') def run_self_tests(self) -> None: + self.log.info('Initiate self-test of the instrument.') self.write('*TST?') def on(self) -> None: + self.log.info('Output on') self.status('on') def off(self) -> None: + self.log.info('Output off') self.status('off') def start_sweep(self) -> None: + self.log.info('Start sweep (generate manual trigger signal)') self.write('*TRG') From 69ba97296878e5198e7a4954d13a8d4fbd7fef43 Mon Sep 17 00:00:00 2001 From: Julien Barrier <1346858+julienbarrier@users.noreply.github.com> Date: Thu, 24 Aug 2023 10:01:38 +0200 Subject: [PATCH 3/4] use qcodes official API --- qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py b/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py index 1b29bd84f..176376efa 100644 --- a/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py +++ b/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py @@ -11,9 +11,9 @@ import logging from typing import Any -from qcodes import VisaInstrument, Parameter +from qcodes.instrument import VisaInstrument +from qcodes.parameters import Parameter, create_on_off_val_mapping from qcodes import validators as vals -from qcodes.utils.helpers import create_on_off_val_mapping log = logging.getLogger(__name__) From 43fd32b68f0ceccc79b6637e4212c41a5f00cb20 Mon Sep 17 00:00:00 2001 From: Julien Barrier <1346858+julienbarrier@users.noreply.github.com> Date: Thu, 31 Aug 2023 12:08:43 +0200 Subject: [PATCH 4/4] add validators --- .../drivers/RohdeSchwarz/SMB100A.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py b/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py index 176376efa..49e97eff1 100644 --- a/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py +++ b/qcodes_contrib_drivers/drivers/RohdeSchwarz/SMB100A.py @@ -3,10 +3,7 @@ https://www.rohde-schwarz.com/us/products/test-and-measurement/analog-signal-generators/rs-smb100a-microwave-signal-generator_63493-9379.html Authors: - Julien Barrier, - -Future improvements: - add modulation functions + Julien Barrier , 2023 """ import logging from typing import Any @@ -25,8 +22,8 @@ class RohdeSchwarz_SMB100A(VisaInstrument): status: beta-version Args: - name (str): name for the instrument - address (str): Visa resource name to connect + name: name for the instrument + address: Visa resource name to connect """ def __init__(self, name: str, address: str, **kwargs: Any) -> None: super().__init__(name, address, terminator='\n', **kwargs) @@ -70,6 +67,7 @@ def __init__(self, name: str, address: str, **kwargs: Any) -> None: get_cmd=':OUTP:STAT?', set_cmd=':OUTP:STAT {}', val_mapping=create_on_off_val_mapping(on_val='1', off_val='0'), + vals=vals.Ints(0, 1), instrument=self ) @@ -79,6 +77,7 @@ def __init__(self, name: str, address: str, **kwargs: Any) -> None: get_cmd=':SOUR:PULM:STAT?', set_cmd=':SOUR:PULM:STAT {}', val_mapping=create_on_off_val_mapping(on_val='1', off_val='0'), + vals=vals.Ints(0, 1), instrument=self )