Unipolar Operation

Unipolar Firmware

Please make sure you are running the unipolar version of the firmware on your power supply when using these commands. To upload the unipolar firmware, follow the instructions in the firmware flashing guide.

To verify that you are running the correct firmware, you can run the following command in the ARDI console:

psu.ask('hardware')

Which should return something like:

'PS2-08-A (UNIPOLAR)'
# or
'A1x8 (UNIPOLAR)'

Connecting Actuators

When operating in unipolar mode, the negative side of loads must ALWAYS be connected to the high voltage return terminal (11), and NEVER to a common ground connection.

It should be noted that the high voltage return terminal (11) is NOT equivalent to ground. There is a 10 kOhm surge resistor between the HV return pin and ground, to limit the current in the event of a short or arcing.

In unipolar operation, the high voltage return terminal may swing as high as 350V relative to ground, depending on the load and operating conditions.

Automatic Calibration

Upon switching HV on, the power supply calibrates to the connected load and and selects control parameters accordingly. Incorrect control parameters may damage actuators or the power supply itself.

NEVER CONNECT LOADS WHILE HV IS ON.

To change connected loads, always turn off HV, disconnect the load, and then turn HV back on. The power supply will re-calibrate to the new load and select appropriate control parameters for driving it.

Please note that during calibration, all channels will output up to 1kV.

Unipolar Waveforms

zero

chX.zero()

Zero the output of the channel. This is equivalent to specifying a setpoint voltage of 0V.

Example:

import ardi
psu = ardi.autoconnect()
ch1 = psu.channels['ch1']
ch1.zero()

voltage

chX.voltage(amp)

Output a constant amp volts on channel chX. This value should be positive.

Example:

import ardi
psu = ardi.autoconnect()
ch1 = psu.channels['ch1']
ch1.voltage(5000) # set ch1 to 5kV

waveform

chX.waveform(xs, dt=1000)

Program channel chX to output a waveform defined by xs, an iterable list of integer voltage values. The waveform is played at a fixed sample rate dt, which is an optional argument that defaults to 1000 microseconds per sample. All waveforms are played repeatedly in a loop. Unipolar waveforms should be defined using integers ranging from 0 to the rail voltage.

Please note that at the moment, only 5000 points can be stored in the waveform memory. If the waveform is longer than 5000 points, it will be truncated. This number is expected to increase with future firmware updates.

Example:

import ardi
import numpy as np
from numpy import pi
# goal: superimpose two 2.5kV sinusoids with different frequencies
# to make a more complex 5kV waveform
dt = 1000 # sample rate, 1000 microseconds/sample is a good default
f1 = 1 # Hz
f2 = 5 # Hz
# create a time vector (in seconds) long enough to hold a full period
ts = np.arange(0, 1, (f2*dt)/1e6)
# sample the waveform
xs = [1250*( 2 + np.sin(2*pi*t*f1) + np.sin(2*pi*t*f2) ) for t in ts]
# connect to and program the device
psu = ardi.autoconnect()
ch1 = psu.channels['ch1'] # unipolar
ch1.waveform(xs, dt)

Which will output the following waveform:

sin

chX.sin(freq, amp, phase=0)

Output a sinusoid with a frequency of freq Hz and an amplitude of amp V on channel chX. Phase is optional, defaults to zero, and takes values in degrees. Unipolar channels only output positive voltages. For example, a unipolar sinusoid with an amplitude of 1000V will oscillate between 0 and 1000V.

Example:

import ardi
psu = ardi.autoconnect()
ch1 = psu.channels['ch1'] # unipolar
ch1.sin(1, 5000) # 1 Hz, 5kV

square

chX.square(freq, amp, duty=0.5, phase=0, slew_limit=None)

Output a square wave with frequency freq Hz, amplitude amp V, and duty cycle duty on channel chX. The optional duty cycle argument defaults to 0.5, and takes values between 0 and 1. 0 corresponds to a 0% duty cycle, and 1 corresponds to a 100% duty cycle. Unipolar channels only output positive voltages, so the square wave will oscillate between 0 and amp V. The slew_limit argument is an optional argument that defaults to None. If specified, it will limit the slew rate of the square wave to the specified value in V/µs.

Example:

import ardi
psu = ardi.autoconnect()
ch1 = psu.channels['ch1'] # unipolar
ch1.square(1, 5000, 0.2) # 1 Hz, 5kV, 20% duty cycle

chirp

chX.chirp(f0, f1, T, amp, bounce=True)

Output a chirp signal, or in other words, a sinusoid with a variable frequency sweeping between f0 and f1 Hz over a period of T seconds. The amplitude of the chirp is amp V. Unipolar channels only output positive voltages. In other words, a unipolar chirp with an amplitude of 1000V will oscillate between 0 and 1000V.

Bounce is an optional argument that defaults to True. When bounce is True, the chirp will sweep back and forth between f0 and f1 Hz. When bounce is False, the chirp will sweep from f0 to f1 Hz and then immediately jump back to f0 Hz. If bounce is True, T must be less than 2.5 seconds. Otherwise, T must be less than 5 seconds.

Example:

import ardi
psu = ardi.autoconnect()
ch1 = psu.channels['ch1'] # unipolar
ch2 = psu.channels['ch2'] # unipolar
ch1.chirp(1, 50, 2, 5000) # 1->50, 50->1, 1->50... Hz, 5kV
ch2.chirp(1, 50, 2, 5000, bounce=False) # 1->50, 1->50,... Hz, 5kV 

The second chirp will output the following waveform: