Project · April 2026 · working

VLF Metal Detector: induction-balance sensing with real-time DFT phase detection

A very-low-frequency induction-balance metal detector built on an ATmega328P. A single-bin DFT reads the phase of the received-coil signal in real time to tell ferrous from non-ferrous metal, driven by an H-bridge transmitter and a concentric bucking-coil head.

DSPC / firmwareATmega328PKiCadAnalog electronicsCoursework
The finished metal detector held outdoors — yellow 3D-printed control housing with visible electronics, wooden shaft, and concentric coil head on frosty grass
The finished detector out in the field — 3D-printed control housing with the electronics on show, and the concentric bucking-coil search head.

What it is

A working VLF (very-low-frequency) induction-balance metal detector, built for DTU’s 34621 Electromagnetic Sensors & Digital Signal Processing course. A transmitter coil is driven at 2 kHz; a receiver coil picks up the field re-radiated by nearby metal; and the firmware runs a single-bin DFT on the sampled receiver signal to recover its amplitude and phase. The phase is what matters — it’s how the detector distinguishes ferrous from non-ferrous metal, not just “there’s something there.” Output goes to an OLED HUD and a variable-tone buzzer.

This was a group project — the four of us built it together, across the DSP firmware, the coil/driver electronics, and the board.

How it works

3D CAD render of the assembled metal detector — control housing with PCB, shaft, and concentric coil head
The mechanical design in CAD — the control housing, the shaft, and the concentric bucking-coil head that keeps the transmitter from swamping the receiver.

induction

MCU · 2 kHz sq

H-bridge

TX coil

metal

RX coil

RX amp

10-bit ADC

single-bin DFT

IIR filter

OLED + buzzer

The signal chain: the MCU drives the TX coil through an H-bridge; the target re-radiates the field into the RX coil, which is amplified, sampled, and reduced to a phase by a single-bin DFT before filtering and the OLED/buzzer.

The hard parts

The whole detector lives or dies on two things, and neither is in the textbook:

Timing diagram showing ADC samples locked to the 2 kHz TX toggle for coherent 4x oversampling
Coherent sampling: the ADC samples (blue) are locked to the 2 kHz TX toggles (red) via the timer compare value, so every DFT window lands on whole carrier cycles.

Results

A functioning detector that responds to metal and separates ferrous from non-ferrous targets by phase, with a live OLED readout and proximity tone. The clearest evidence is on the bench — the received-coil signal barely moves over an empty coil, then shifts distinctly when metal enters the field:

Oscilloscope capture of the receiver signal with no metal present
RX signal — no metal.
Oscilloscope capture of the receiver signal with metal present, showing a clear change
RX signal — metal present.
One of the project's custom KiCad PCBs
One of the custom KiCad boards for the detector's analog front end.

Because a detector is only useful if it runs in the field, we designed the power path for endurance rather than raw drive. The MCU sleeps between DFT windows instead of busy-waiting, and the coil is driven by an efficient MOSFET H-bridge (IRF5305 / IRL530) rather than a lossy linear stage — so most of the battery’s energy goes into the transmit field, not into heat. A bench discharge test confirmed it: ~164 minutes (2 h 44 m) of continuous operation on a single charge, the pack sagging only from 8.88 V to 7.76 V and never nearing the 6.0 V cut-off.

Battery discharge test plot showing pack voltage falling gently from 8.88 V to 7.76 V over 164 minutes, well above the 6.0 V threshold
Battery discharge test — 164 min of runtime with the pack sagging just 1.1 V (6.8 mV/min) and staying comfortably above the 6.0 V cut-off. MCU sleep between DFT windows plus an efficient H-bridge coil driver are what buy the endurance.

Full write-up in the project report (repo), with the KiCad hardware, LTspice/QSPICE validation, and MATLAB/Python analysis alongside the firmware.

Interactive project dashboard

We kept a live dashboard for the project on GitHub Pages — a filterable Gantt timeline, milestone tracker, the responsibility split across the four of us, the tech stack, and a full image gallery of the 3D models, boards, and scope captures:

The team's live project dashboard (open full ↗) — scroll inside for the Gantt timeline, milestones, responsibility matrix, and gallery.

Tools & skills demonstrated

Real-time embedded DSP on an 8-bit MCU (single-bin DFT, coherent sampling, IIR filtering), induction-balance sensor design, power electronics (H-bridge coil driver), KiCad hardware, and SPICE validation — the electromagnetic-sensing and signal-processing core of course 34621, on real hardware.


← All projects

Available for Jan 2027 Praktik