aioscilloscope / Rigol DL3031

AI firmware for the DL3031 DC electronic load

Our Rigol DL3031 runs our own AI firmware: one bare-metal Rust image on the load's i.MX283, with no operating system under it. It sinks current in CC, CV, CR and CP, runs transients, lists, the battery, OCP and OPP tests, a factory test and CC+CV, records waveforms, stores setups and waveforms on a USB stick, has built-in help, and takes commands from the front panel, USB and the LAN. While it is brought up it runs under conservative software caps, and each step is tested against a bench supply.

DownloadOpens after a legal review; the date will be announced hereFree · DL3000Update.GEL · about 1.3 MB · one file on a USB stick · how to install it, and go back
Our DL3031's own screen under the AI firmware, read back over the LAN: CC at 0.250 A from the bench supply's 12 V, the input on, reading 11.9817 V, 0.2506 A, 3.003 W and 47.807 Ω. The readings and the settings are in bold, as on Rigol's own screen.

CH1What it does today

FunctionOn our DL3031
Static modesConstant current, voltage, resistance and power, each with both of its ranges (CC 6 A / 60 A, CV 15 V / 150 V, CR 15 Ω / 15 kΩ), set from the keypad and knob or over SCPI; the ON/OFF key turns the input on and off.
ProtectionOver-voltage, over-current, over-power, over-temperature and reverse-connection trips, and a V_Limit and C_Limit for each mode. A trip turns the input off, shows a prompt with the reading that tripped, and sets the SCPI status registers.
TransientContinuous, pulsed and toggled, from the TRAN key or a bus trigger; CC range, slew, Von and the Von latch.
ListUp to 512 steps of 50 µs to 3600 s each, in CC, CV, CR or CP, run by the load's own FPGA; each step's last reading is kept. Run on the unit in CC so far.
TestsBattery discharge (capacity, energy, time; stop on voltage, capacity or time), OCP and OPP ramps with a pass or fail verdict.
OptionThe factory test: pass or fail on the current (CC) or the voltage (CV) against a Max and Min window, judged once a second; a fail leaves the input on. CC+CV: the load sinks the set current until the input voltage rises above the set voltage, then holds that voltage, as a charger test.
WaveformsA Roll trend from 8 s to 80 h, a fast capture of up to 250 kSPS, and Print, Record and Play Back on a USB stick.
Store and RecallSetups and waveform CSV files on a USB stick in the front port: save, read and delete. The internal memory (Disk C) is listed and read; on our unit it holds the stock firmware's own four files. Saving and deleting on Disk C are built but switched off.
HelpBuilt in: press Help, then any key, and the screen shows that key's topic.
Short circuitFrom the SHORT key (HOLD, TOGGLE or Disable, as set in Settings) or SCPI, held to the 3 A cap. CC, CR and CV come back to their own mode after the short; settings are refused while the input is shorted; a short started from a computer ends if the computer goes quiet for 10 s; a short is refused where 3 A would exceed 60 W (at 25 V, for example).
Von in CRThe CR page has its own Von and Von latch: the input waits until the voltage reaches Von. It is also set over SCPI with :RESistance:VON.
Power-on stateSettings > Power-on chooses Default or Last, and the firmware reads the state the stock firmware saved. Saving the state is built but switched off. Whatever is stored, the input always starts off.
IdentificationA custom identification string set with :SYSTem:IDN:SET: *IDN? answers it until the next power-off. Saving it is built but switched off.
Reset*RST turns the input off and puts the settings back to their power-on values. Many VISA programs start with it.
Remote controlUSBTMC, SCPI on TCP port 5555, VXI-11 (VISA's TCPIP::<ip>::INSTR), mDNS, the LXI identification and a web interface on port 80. GPIB through Rigol's USB-GPIB converter, with the GPIB address (0 to 30) set over SCPI: built, not yet tried. All of it is simply part of the firmware: there are no paid options.
Front panelEvery key, the knob and the panel LEDs. A status bar shows the function, STATIC / Continuous / Pulse / Toggle / LIST and LOAD while the input is on, with the beeper, LAN, remote and USB icons; each function has its own soft-key row with the live value under each label; while a value is typed, the soft keys are its units (A or mA, Ω or kΩ, Hz or kHz). Con, Pul and Tog open their own Config Guide with a diagram drawn from the values; the List page has a second soft-key page with the trigger source, Save, Read and Record; the arrows move a cursor over the digits, and the knob or Up / Down change the digit under it. The mode keys open their main screen from any page, and Utility has the System, Interface, System Information, Reset and Options tabs. The beeper clicks on each key and sounds with prompts and test results; the screen brightness goes from 10 to 100 %. Text is anti-aliased, with a real Ω. The screen can be read as a BMP over SCPI.

None of the functions in Rigol's documentation for the load is missing now: each is done, done within the caps below, or built and waiting for a bench test (see Not done yet).

The caps. The first release limits the load to 3 A, 60 W and 60 V in software and turns the input off above 50 °C, inside the hardware's 150 V, 60 A and 350 W: what our bench supply can drive and so prove. They come up one step at a time, each step tested first.

New compared with Rigol's firmware

Beyond Rigol's firmware

None of these is in Rigol's own DL3000 firmware. Each one has been run on our DL3031, and they come with the next firmware file.

FunctionOn our DL3031
StatisticsCount, average, minimum, maximum, peak-to-peak and standard deviation of voltage, current, power and resistance, on a Statistics page and over SCPI.
Histogram10 to 400 bins over an automatic or a fixed range, on a page under the Option key and over SCPI.
Limit testAny reading checked against upper and lower limits while the load runs: PASS or FAIL on the panel, failure counts and an optional tone. It never turns the input off.
Data loggerVoltage, current, power and resistance every 50 ms to 24 h, to a CSV file on a USB stick and to memory a computer reads over SCPI.
Date and timeSet over SCPI or from a network time server; it stamps the logger's readings and the event log. The load has no battery-backed clock, so it is set again after each power-on.
Event logEvery protection trip, watchdog trip, self-test failure and power-on, with when it happened. Kept until the load is switched off.
FilesList, copy, move, delete, upload and download files on the internal memory and the USB stick over SCPI, including setup files in the same formats the stock firmware uses. The calibration and identity files can be read but never written.
Web interfaceA front panel in the browser (the live screen, every key and the knob), a Files page that downloads any file, and a password on every page that can change something, kept only as a salted digest.
Error queueOne query, :SYSTem:ERRor:ALL?, reads every queued error at once.

CH2Measured on the bench

The release caps, 3 A and 60 W, on 13 October: in CC from 12 V, 1.0, 1.5, 2.0, 2.5 and 3.0 A read 1.0003, 1.4997, 2.0001, 2.5006 and 2.9998 A (the supply 0.9979 to 2.9983 A); in CR, 6 Ω and 4 Ω from 12 V drew 1.9896 and 2.9807 A; in CP from 21 V, 60 W held 59.99 W (2.8672 A, the supply 2.8667 A) for two minutes while the two temperature sensors went from 28.9 to 31.4 °C. 3.01 A, 3.9 Ω and 61 W were refused.

These runs were made on our DL3031 against a Rigol DP2031 bench supply at 12 V, with the supply's own current limit as a second guard (0.5 A, and 0.2 A for CV). The two instruments' readings are compared at every step. Neither is a calibrated reference, so these show that each mode does what it is set to, not the load's accuracy.

ModeSetDL3031 readDP2031 read
CC0.10 / 0.25 / 0.45 A0.1005 / 0.2505 / 0.4509 A0.097–0.099 / 0.245–0.250 / 0.447–0.449 A
CR40 / 60 / 30 Ω0.3009 / 0.2009 / 0.4006 A (12 V / R: 0.300 / 0.200 / 0.400)0.296–0.301 / 0.197–0.202 / 0.396–0.401 A
CP3 / 5 / 1 W3.00 / 5.00 / 1.03 W (0.2505 / 0.4173 / 0.0862 A at 11.98 V)0.244–0.250 / 0.414–0.421 / 0.083–0.086 A
CV10 / 8 / 5 V9.991 / 7.990 / 4.992 V at 0.202 A0.1998 A, at its current limit

Videos

These are screen captures from the load's own framebuffer over the LAN, at about 1.6 frames a second, shown at real time. The panel was driven through its keys by AI (Claude) over the LAN, and the bench supply was set up over SCPI before each take. The readings are real. Nothing is drawn on a PC.

CC levels typed on the keypad, 0.10, 0.25, 0.45 and 0.20 A, from the supply's 12 V.
Roll of the input voltage while the supply steps 12, 3, 9, 6 and 12 V with the load sinking 0.2 A.
The TRAN key starts a continuous 1 kHz transient between 0.1 and 0.4 A, then the fast capture shows it.
The battery test, the supply standing in for a 12 V battery: 0.25 A until a 30 s time stop, then the completion prompt.
With 0.25 A flowing, the main screen and the Roll page (one key is refused while the input is on); then, with the input off, Utility's System tab, the Config page and Protection.

Screens

The load's own 480 × 272 screen, read over the LAN and doubled without smoothing; real current from the bench supply. Click a screen to enlarge it.

CH3Waveforms

The waveform page plots current, voltage, resistance or power. In Roll the window runs from 8 s to 80 h, and the firmware keeps every reading at several resolutions, so a new window shows its whole history at once. Print saves the screen as a BMP and the trace as CSV on a USB stick in the front port, Record logs a run to CSV, and Play Back reads a file back onto the page. The trace's 400 points and the screen are also readable over SCPI, and Store and Recall lists, reads and deletes the files on the stick.

With the continuous transient selected, the fast capture takes 400 samples of current or voltage at 4 µs to about 1 ms per sample (250 kSPS down to 0.98 kSPS, windows of 1.6 to 409.6 ms) and measures ripple, edges and recovery time on them. On our unit it captured a 1 kHz transient at 8 µs per sample, 257 captures out of 260. On the supply's 12 V the trace moved between two codes 3.7 mV apart: the supply's ripple is below one step of the capture on its 150 V range.

Roll: the load current on a 96 s window through a run of CC levels between 0 and about 0.4 A; on the right, the latest readings (11.9835 V, 0.1504 A, 79.69 Ω, 1.802 W).
Fast capture of a continuous 1 kHz transient between 0.1 A and 0.4 A: 400 samples on a 1.6 ms window, with the peak-to-peak (0.3671 A) and RMS (0.1379 A) of the capture.

CH4Remote control

The same SCPI commands work over USB (USBTMC), a raw socket on TCP port 5555 and VXI-11. pyvisa opened the load as TCPIP::<ip>::INSTR with both its own backend and a system VISA library, and read *IDN?. The load announces itself over mDNS and answers the LXI identification.

Its web interface on port 80 has the instrument, network status, network settings and password pages, and a read-only page with the live voltage, current, power and resistance. Every setting made there goes through the same checks as a SCPI command. A host can also press any front-panel key with :SYSTem:KEY, and read the screen over the LAN in about 0.8 s with the screenshot query (a 391,736-byte BMP).

How it stays safe

Installing it, and going back

The first public release opens after a legal review, with the date announced here: one small file (about 1.3 MB) for a USB stick. Rigol's boot loader stays on the unit as it is and installs it the way it installs a Rigol update:

  1. Copy the file, DL3000Update.GEL, to the top folder of a FAT32 USB stick, keeping its name as it is.
  2. With the load switched off, plug the stick into the front USB port, then switch the load on and press Help while the logo shows.
  3. The boot loader installs it. The screen stays dark for about two minutes: don't switch the load off. It then starts the AI firmware.

Going back is the same three steps with Rigol's own firmware file for your model, which Rigol publishes on its DL3000 product page under Software & Firmware; we don't host it. Once the AI firmware is on, later versions can also be sent from a computer over USB or the LAN: it writes the new file over the one on the stick in the load, checks it, and restarts into the boot loader. So keep Rigol's file on a second stick.

The AI firmware is ours from the first instruction; Rigol's boot loader on the unit installs it. So far it has been tested on our DL3031 only.

The hardware

The DL3031 is Rigol's single-channel DC electronic load. Its controller is a small ARM system, and everything analog sits on a measurement board with its own FPGA, reached over one SPI link.

PartDL3031
Rating150 V, 60 A, 350 W
ProcessorNXP i.MX283: one ARM926EJ-S core (ARMv5TE), no FPU
Memory64 MB DDR2
Storage1 Gbit NAND
Display480 × 272
Measurement and controlA measurement-board FPGA with an AD7175-2 ADC, on the SoC's SSP0 (SPI) port, spoken to in frames with a CRC-8
Stock firmwareFreescale MQX RTOS with lwIP networking and UFFS on the NAND

The AI firmware replaces all of it with a single no_std Rust image that runs one polled loop. It shares its screen look and some of its drawing and SCPI code with the NovaOS instruments. Every driver in it is ours: the LCD controller, the front panel's 3 Mbaud link (keys, knob and LEDs), the measurement board, a read-only NAND reader for the calibration, USB device and host, and Ethernet with the smoltcp TCP/IP stack.

The measurement board's FPGA

Everything the load measures and regulates passes through an FPGA on the measurement board. It runs the ADC that reads voltage and current, one mains cycle per reading, and the 400-sample fast capture. It sets the current and voltage setpoints and the protection thresholds, reports the protection trips, times the transients and the lists, and switches the relays, the Vmon and Imon outputs and the fan.

The part is most likely a Xilinx Spartan-6 XC6SLX9. We have not read the chip's ID code on our own board yet.

The AI firmware talks to the FPGA over its SPI link, in the frames the board expects, and never changes it. It loads nothing into the FPGA and writes nothing to wherever the FPGA's configuration is stored.

Our own FPGA design

We are studying our own FPGA design for this board, which keeps the same link to the AI firmware. These are possibilities, each limited by the board's own parts:

It cannot change the power stage and its limits, how fast the analog current and voltage loops respond, or the one ADC that voltage and current share. Any such design would first be loaded over JTAG into the FPGA's volatile memory only, so switching the load off and on brings back the original. Nothing would be written to the board until the design is proven. None of this is scheduled.

Not done yet

Notes from the bring-up