Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add checks for signal current level and voltage level queries in Keysight E4980A driver #2561

Merged
merged 27 commits into from Jan 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
c98f555
Add checks for signal current level and voltage level queries
Akshita07 Dec 25, 2020
39c9ca5
fix raised errors
Akshita07 Dec 25, 2020
2c0ff03
f-str to normal string as no var in string
Akshita07 Dec 25, 2020
77f64c1
Update exception type
Akshita07 Dec 28, 2020
6b936cb
Add set functions for volt and curr level params
Akshita07 Jan 11, 2021
0ca67fb
Update log statements
Akshita07 Jan 11, 2021
40aea6b
Add instrument sim and test file
Akshita07 Jan 11, 2021
fb81373
Rename according to convention
Akshita07 Jan 11, 2021
158641b
Add signal mode manual parameter and update get/set methods
Akshita07 Jan 11, 2021
2a7de14
Fix test
Akshita07 Jan 11, 2021
fd31aa4
Remove unused import
Akshita07 Jan 11, 2021
af49ad2
Update scope to function for fixture
Akshita07 Jan 11, 2021
cfb73d9
Update values validator for manual parameter
Akshita07 Jan 11, 2021
19d89dc
pylint fixes
Akshita07 Jan 11, 2021
0efd2d5
Update device yaml
Akshita07 Jan 12, 2021
b1c6abb
Add volt and current level param tests
Akshita07 Jan 12, 2021
31e62cb
Replace query end character in yaml
Akshita07 Jan 12, 2021
31d0434
minor fixes for driver after testing on instrument
Akshita07 Jan 12, 2021
ee1258c
update yaml and tests
Akshita07 Jan 12, 2021
8a9d9ed
Merge branch 'master' into fixBugKeysightE4980A
jenshnielsen Jan 12, 2021
62fe92d
cleaner linebreak
jenshnielsen Jan 12, 2021
5750d5e
do not use an initial value for the group parameters
jenshnielsen Jan 12, 2021
edf3669
cleaner way to avoid pylint warning
jenshnielsen Jan 12, 2021
c297f74
set to a valid value
jenshnielsen Jan 12, 2021
fd09de6
set back
jenshnielsen Jan 12, 2021
6625d4d
Merge pull request #43 from jenshnielsen/fixBugKeysightE4980A
Akshita07 Jan 12, 2021
ac64427
Merge branch 'master' into fixBugKeysightE4980A
jenshnielsen Jan 12, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
37 changes: 37 additions & 0 deletions qcodes/instrument/sims/Keysight_E4980A.yaml
@@ -0,0 +1,37 @@
spec: "1.0"
devices:
device 1:
eom:
GPIB INSTR:
q: "\n"
r: "\n"
error: ERROR
dialogues:
- q: "*RST"
- q: "*CLS"
- q: "*OPT?"
r: "001"
- q: "*IDN?"
r: "Keysight Technologies,E4980A,MY46516036,A.02.10"

properties:

voltage_level:
default: 0
getter:
q: ":VOLTage:LEVel?"
r: "{}"
setter:
q: ":VOLTage:LEVel {}"

current_level:
default: 0
getter:
q: ":CURRent:LEVel?"
r: "{}"
setter:
q: ":CURRent:LEVel {}"

resources:
GPIB::1::INSTR:
device: device 1
71 changes: 59 additions & 12 deletions qcodes/instrument_drivers/Keysight/keysight_e4980a.py
Expand Up @@ -2,7 +2,8 @@
from distutils.version import LooseVersion

from qcodes import VisaInstrument, InstrumentChannel
from qcodes.instrument.parameter import MultiParameter, ParamRawDataType
from qcodes.instrument.parameter import (MultiParameter, ParamRawDataType,
ManualParameter)
from qcodes.utils.helpers import create_on_off_val_mapping
from qcodes.utils.validators import Enum, Numbers, Bool, Ints
from qcodes.instrument.group_parameter import GroupParameter, Group
Expand Down Expand Up @@ -188,8 +189,9 @@ def __init__(self,

idn = self.IDN.get()

self.has_firmware_a_02_10_or_above = LooseVersion(idn["firmware"]) >=\
LooseVersion("A.02.10")
self.has_firmware_a_02_10_or_above = (
LooseVersion(idn["firmware"]) >= LooseVersion("A.02.10")
)

self.has_option_001 = '001' in self._options()
self._dc_bias_v_level_range: Union[Numbers, Enum]
Expand Down Expand Up @@ -224,19 +226,17 @@ def __init__(self,

self.add_parameter(
"current_level",
get_cmd=":CURRent:LEVel?",
set_cmd=":CURRent:LEVel {}",
get_parser=float,
get_cmd=self._get_current_level,
set_cmd=self._set_current_level,
unit="A",
vals=self._i_level_range,
docstring="Gets and sets the current level for measurement signal."
)

self.add_parameter(
"voltage_level",
get_cmd=":VOLTage:LEVel?",
set_cmd=":VOLTage:LEVel {}",
get_parser=float,
get_cmd=self._get_voltage_level,
set_cmd=self._set_voltage_level,
unit="V",
vals=self._v_level_range,
docstring="Gets and sets the AC bias voltage level for measurement "
Expand Down Expand Up @@ -292,16 +292,15 @@ def __init__(self,

self.add_parameter(
"meas_time_mode",
initial_value="medium",
val_mapping={"short": "SHOR", "medium": "MED", "long": "LONG"},
parameter_class=GroupParameter
)

self.add_parameter(
"averaging_rate",
initial_value=1,
vals=Ints(1, 256),
parameter_class=GroupParameter,
get_parser=int,
docstring="Averaging rate for the measurement."
)

Expand All @@ -325,11 +324,19 @@ def __init__(self,
"the BIAS field of the display."
)

self.add_parameter(
"signal_mode",
initial_value=None,
vals=Enum("Voltage", "Current", None),
parameter_class=ManualParameter,
docstring="This parameter tracks the signal mode which is being "
"set."
)

self.add_submodule(
"_correction",
Correction4980A(self, "correction")
)

self.connect_message()

@property
Expand Down Expand Up @@ -386,6 +393,46 @@ def _set_measurement(self,
self._measurement_pair = measurement_pair
self.write(f":FUNCtion:IMPedance {measurement_pair.name}")

def _get_voltage_level(self) -> float:
"""
Gets voltage level if signal is set with voltage level parameter
otherwise raises an error.
"""
if self.signal_mode() == "Current":
raise RuntimeError("Cannot get voltage level as signal is set "
"with current level parameter.")

v_level = self.ask(":VOLTage:LEVel?")

return float(v_level)

def _set_voltage_level(self, val: str) -> None:
"""
Sets voltage level
"""
self.signal_mode("Voltage")
self.write(f":VOLTage:LEVel {val}")

def _set_current_level(self, val: str) -> None:
"""
Sets current level
"""
self.signal_mode("Current")
self.write(f":CURRent:LEVel {val}")

def _get_current_level(self) -> float:
"""
Gets current level if signal is set with current level parameter
otherwise raises an error.
"""
if self.signal_mode() == "Voltage":
raise RuntimeError("Cannot get current level as signal is set "
"with voltage level parameter.")

i_level = self.ask(":CURRent:LEVel?")

return float(i_level)

def _options(self) -> Tuple[str, ...]:
"""
Returns installed options numbers. Combinations of different installed
Expand Down
57 changes: 57 additions & 0 deletions qcodes/tests/drivers/test_keysight_e4980a.py
@@ -0,0 +1,57 @@
import pytest
import re

import qcodes.instrument_drivers.Keysight.keysight_e4980a as E4980A
import qcodes.instrument.sims as sims

VISALIB = sims.__file__.replace('__init__.py', 'Keysight_E4980A.yaml@sim')


@pytest.fixture(name="driver")
def _make_driver():
instr = E4980A.KeysightE4980A('E4980A',
address="GPIB::1::INSTR",
visalib=VISALIB)
yield instr
instr.close()


def test_idn(driver):
assert {'firmware': 'A.02.10',
'model': 'E4980A',
'serial': 'MY46516036',
'vendor': 'Keysight Technologies'} == driver.IDN()


def test_raise_error_for_volt_level_query_when_signal_set_as_current(driver):
driver.current_level(0.01)
msg = re.escape("Cannot get voltage level as signal is set with current "
"level parameter.")
with pytest.raises(RuntimeError, match=msg):
driver.voltage_level()


def test_voltage_level_set_method(driver):
driver.voltage_level(3)
assert driver.voltage_level() == 3


def test_signal_mode_parameter(driver):
driver.voltage_level(2)
assert driver.signal_mode() == "Voltage"

driver.current_level(0.005)
assert driver.signal_mode() == "Current"


def test_raise_error_for_curr_level_query_when_signal_set_as_voltage(driver):
driver.voltage_level(1)
msg = re.escape("Cannot get current level as signal is set with voltage "
"level parameter.")
with pytest.raises(RuntimeError, match=msg):
driver.current_level()


def test_current_level_set_method(driver):
driver.current_level(0.003)
assert driver.current_level() == 0.003