aboutsummaryrefslogtreecommitdiff
path: root/qolab/hardware/power_supply/psw25045.py
blob: fdeeb820c0fc9b2d0417851b0e7b01d78f06ffc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
"""
Module: GW INSTEK GPP-250-4.5 power supply unit control
Description: This module provides a class to interface with the GW INSTEK GPP250-4.5 power
             supply unit (PSU) using pyvisa for setting current and voltage on the PSU

Author: Mykhailo Vorobiov
Email: mvorobiov@wm.edu
Date: 2024-10-02
Update: 2024-11-06
"""

from qolab.hardware.power_supply._basic import PowerSupplySCPI
from qolab.hardware.basic import BasicInstrument

import pyvisa
import numpy as np

class PSW25045(PowerSupplySCPI):
    """
    A class for interfacing with GW INSTEK GPP250-4.5 
    signle channel power supply unit.
    """
    def __init__(self, resource, *args, **kwds):
        """
        Initialize the PSU class.
        """
        super().__init__(resource, *args, **kwds)
        self.resource = resource

        self.config["Device model"] = "GWInstek PSW 250-4.5"
        self.numberOfChannels = 2
        self.deviceProperties.update({"OpMode"})
        self.resource.read_termination = "\n"
        
        self.MAX_CURRENT = 4.5 # Amp
        self.MAX_VOLTAGE = 250.0 # Volt
        self.enable_output(False)

    @property
    def idn(self):
        return self.get_idn()

    def get_idn(self):
        """
        Query the identification of the instrument.

        :return: Identifier string if query is successful or None otherwise.
        """
        try:
            return self.query('*IDN?').strip()
        except pyvisa.VisaIOError as e:
            print(f'[ERROR!] Error retrieving identification: {e}')
            return None
    @BasicInstrument.tsdb_append
    def get_out_current(self):
        """
        Query the current reading of the instrument.

        :return: Current reading in amps as float number and None if error occurs.
        """

        try:
            return float(self.query('MEAS:CURR?'))
        except pyvisa.VisaIOError as e:
            print(f"[ERROR!] Error querying the current reading: {e}")
            return np.nan()
        
    @BasicInstrument.tsdb_append
    def get_out_voltage(self):
        """
        Query the voltage reading of the instrument.

        :return: Voltage reading in volts as float number and None if error occurs.
        """

        try:
            return float(self.query('MEAS:VOLT?'))
        except pyvisa.VisaIOError as e:
            print(f"[ERROR!] Error querying the voltage reading: {e}")
            return np.nan()

    def get_out_power(self):
        """
        Query the power reading of the instrument.

        :return: Power reading in watts as float number and None if error occurs.
        """

        try:
            return float(self.query('MEAS:POWE?'))
        except pyvisa.VisaIOError as e:
            print(f"[ERROR!] Error querying the power reading: {e}")
            return np.nan()
        

    
    def set_current(self, current):
        """
        Set the target current output of the instrument.
        """

        if current <= self.MAX_CURRENT and current >= 0.0:
            try:
                self.write(f'SOUR:CURR {current}')
                print(f"Current is set to {current} V")
            except pyvisa.VisaIOError as e:
                print(f"[ERROR!] Error setting the current target output: {e}")
        else:
            print(f"[WARNING] Target current must be between 0 and {self.MAX_CURRENT} Amps."
                                f"\n\tThe traget current left unchanged.")

    
    def set_voltage(self, voltage):
        """
        Set the target voltage output of the instrument.
        """
        if voltage <= self.MAX_VOLTAGE and voltage >= 0.0:
            try:
                self.write(f'SOUR:VOLT {voltage}')
                print(f"[INFO] Voltage is set to {voltage} V")
            except pyvisa.VisaIOError as e:
                print(f"[ERROR!] Error setting the voltage target output: {e}")
        else:
            print(f"[WARNING] Target voltage must be between 0 and {self.MAX_VOLTAGE} Volts."
                                f"\n\tThe traget voltage left unchanged.")

    def enable_output(self, output_state=False):
        """
        Set the output state of the instrument ON or OFF.

        :param output_state: Boolean flag. Sets the output ON if 'True' or OFF if 'False'.
        """
        self.output_state = output_state # This is here to define out state (need some work on it)
        try:
            if self.output_state:
                self.write(f'OUTP:STAT 1')
                self.output_state = output_state
                print(f"[INFO] Output is ON")
            else:
                self.write(f'OUTP:STAT 0')
                self.output_state = not(output_state)
                print(f"[INFO] Output is OFF")
        except pyvisa.VisaIOError as e:
            print(f"[ERROR!] Error toggle the output: {e}")