Back to Home
August 2026Hampton, Virginia

3-Axis Hall Probe Field Mapper

A motorised, encoder-synchronised magnetic field mapper for the energised STAR_Lite coils. Sixteen 3D Hall sensors on a square tube, three Thorlabs long-travel stages and two D-TACQ digitisers, tied together by a Python application that sweeps whole volumes while it measures. Built in Hampton, Virginia, at the end of August 2026.

Python
PyQt
Thorlabs Kinesis
D-TACQ ACQ1001
SENIS SENM3Dx
Quadrature Encoders
simsopt
Stellarator Coils
pytest
octobee_hall_probe on GitHub
Timelapse: the probe mapping inside the energised STAR_Lite coils
0
field channels (16 sensors × 3 axes)
0 kSPS
per channel, zero lost samples
0.0 nm
per encoder count
0 mm³
reachable cube, three stages
Why

A stellarator lives or dies by its coils

STAR_Lite's field is shaped entirely by its windings: four modular coils and two more, optimised in simsopt. Whether the coils that were built make the field that was designed is a question only a measurement can answer, and it has to be answered in three dimensions, not at a few points.

So the goal was a probe that could ride a gantry through the space between the energised coils and read the full field vector continuously, with every sample pinned to the position where it was taken.

The gantry parked next to the coils, the machine view on screen.
Hardware

Sixteen sensors on a square tube

The head is a one-inch square tube carrying sixteen SENIS SENM3Dx eval boards, four per face, each chip at the tip of a 92 mm arm. Every chip measures Bx, By and Bz plus its own virtual-ground reference, which turned out to be the key diagnostic: noise on a field channel and its reference means the cable; noise on the field channel alone means the chip.

Two D-TACQ ACQ1001 carriers digitise all 64 channels at 200 kSPS over gigabit Ethernet. Only one of them has quadrature-encoder logic in its FPGA, which is where the three stage encoders go.

Sensors S1–S88 × SENM3Dx, 24 chSensors S9–S168 × SENM3Dx, 24 ch3 × Encoders3600 PPR, on the motorsacq1001_694ACQ423, 200 kSPSacq1001_695ACQ423 + 3 × QENposition latched per sampleoctobee-guilive · calibrate · sweep3 × LTS300Cx · y · z, 300 mm each1 GbE streamUSB / Kinesis
Nine days

From a box of parts to a field map

Aug 19

Two boxes, not one

Imported the bench tooling and found why only 32 channels ever showed up: there are two digitisers. Harmonised all 16 chips to gain 3000 (±20 mT), cut Connect from 85 s to 10 s and the live repaint from 39 s to 22 ms.

Aug 20

Motors

Three Thorlabs LTS300C stages on the bus, axis map recorded, the reverse-mounted z axis handled once in stages.json so no map is ever silently mirrored.

Aug 21

Encoders and bad chips

The z encoder counted 14,400 counts/mm and agreed with the stage to 0.3 µm over 20 mm. Swapping two eval kits proved the noisy channels travel with the chip, not the cable.

Aug 24

The magnet tells the truth

The guided magnet run measured where every sensor actually sits. Twelve of sixteen were where the drawing said; one whole face ran backwards along the tube. Latching emergency stop added the same day.

Aug 25

Restructure

Split into an installable package with tabs, a test suite and CI, and added the Machine tab: the simsopt coil set in 3D with live clearance to the windings.

Aug 26 – 27

Into the coils

Volumes swept instead of rastered, with position latched in the frame. The gantry moved to the energised STAR_Lite coils and mapped through the night.

Building the gantry.
Commissioning, sensors lit.
Ready for the coils.
Calibration

Let the magnet measure the probe

Holding a magnet up to each sensor by hand gives a different distance every time, and a dipole falls off as 1/r³: a 10% distance error is a 30% amplitude error. Correcting for it needs the geometry, which is exactly what is not yet known.

With motors the geometry cancels instead. The head drives along its own axis past a fixed magnet, so the four sensors of a face pass at the same closest approach. A quarter turn, and the next face gets its go. Four poses later every peak is directly comparable, and the run also revealed that one face had been mounted backwards.

Pose 1 of 4 · head turned 0°sweeping along y past a fixed magnet
flangeS9S10S11S12|B| (mT)head y (mm)051015

Every sensor on a face passes the magnet at the same closest approach, so the peaks differ only by gain: trim = median(peak) / peak. Peak values shown are from the first real guided run.

Mapping

Sweep, don't raster

Move, stop, settle, average is the right way to measure one point. For a volume it is an impossible experiment. So the mapper sweeps one axis at constant velocity while the stream logs continuously and steps the other two between lines, cutting every line back to the space the whole probe body actually fits in between the coils.

Settled rastermove · stop · settle · average

300 mm cube on a 10 mm grid: 29,791 points × 7.5 s ≈ 62 hours.

Continuous sweepconstant velocity, logged every sample

The same 29,791 samples come off a 300 mm line in 30 s. Lines always run in +y, the dashed return keeps leadscrew backlash out of the map.

Synchronism

Encoders buy you when, not where

The stage controllers report position over USB from a cache refreshed every 100 ms, on the PC's clock, while the field arrives on the digitiser's clock. At sweep speed that mismatch smears every sample by about a millimetre, randomly.

The rotary encoders count the same leadscrew, so they are no more accurate. What they give is timing: their count is latched into the very ADC frame it belongs to. Measured: 14,400 counts/mm, 0.3 µm disagreement over a 20 mm move, no dropped counts up to 12 mm/s.

ADC samples (field)USB position poll — 0–100 ms stale, random ageEncoder count — latched inside every frame≈ 1 mm of smear at sweep speed → zero latency and zero jitter by construction
Resolution

How sensitive is it really?

At gain 3000 the sensors are at their most sensitive setting. Resolution is then set by noise, which is white: average 100× longer and it drops 10×. The clean sensors track the datasheet almost exactly, from 62 µT at full bandwidth down to 0.7 µT at 10 Hz.

Below about 1 Hz the curve flattens at the chips' offset drift, roughly 1 µT per axis: about 2% of Earth's field, enough to see the probe turn.

drift floor ≈ 0.5–1 µT0.11101000.11101001k10k100kaveraging bandwidth (Hz)noise (µT rms)measured, S1datasheet 0.2 µT/√Hz
In the lab

Energising the coils

The last nights of August were spent at the coils: positioning the probe against the simsopt model, checking clearance against 60 mm conductor packs, watching the winding temperature, and letting the gantry sweep.

A steel chain leaning into the energised coil.
Thermal check on the windings.
The head sweeping with all sensors live.
Key Features
  • •16 SENIS 3D Hall sensors, 48 field channels, 200 kSPS per channel
  • •Three Thorlabs LTS300C stages spanning a 300 mm cube
  • •Quadrature encoders latched in the same ADC frame as the field
  • •Swept volume maps instead of stop-and-settle rasters
  • •Guided-magnet calibration that cancels the probe geometry
  • •3D machine view of the simsopt coil set with live clearance
  • •Latching emergency stop and explicit position trust
Challenges
  • •Two unsynchronised digitisers with different frame layouts
  • •Telling a bad Hall chip from a bad cable without unplugging anything
  • •USB position readouts that were 0–100 ms stale while moving
  • •A reverse-mounted z axis that would silently mirror every map
  • •Keeping a 159 mm probe out of 60 mm coil windings
Learnings
  • •Synchronism, not accuracy, is what encoders buy you on a leadscrew
  • •A settled raster of a volume is an impossible experiment; a sweep is not
  • •Measure the geometry with the instrument rather than trusting the drawing
  • •Short throughput tests understate a stream that ramps for 30 s
Gallery

More from the bench