---
title: DC-DC Converter Validation Test Automation
description: "Automate DC-DC converter validation: efficiency maps on a power analyzer, line and load regulation, ripple, load transients, Bode loop margins and derating."
url: https://galoislabs.ai/blog/dc-dc-converter-validation
author: Alex Hernandez
author_url: https://galoislabs.ai/blog/authors/alex-hernandez
published: "2026-07-25"
topic: Design to test
publisher: Galois Labs
---

# DC-DC converter validation: automate efficiency, ripple, transient, loop and thermal tests

![A step-down converter stage drawn in side section on its board, a probe tip on the output and one ripple trace above.](https://galoislabs.ai/blog/figures/board-2.light.webp)

*FIG. 1 — CONVERTER STAGE IN SECTION*

DC-DC converter validation test automation means scripting the sweeps that characterize a regulator design across its envelope: efficiency and regulation over an input-voltage and load grid, output ripple, load transients, loop gain and phase margin, and thermal derating. One harness sets source and load, waits for a stable state, reads every instrument, and records each point's conditions.

This is design validation, not a board check. A [power rail validation plan](https://galoislabs.ai/blog/power-rail-validation-plan) asks whether each rail on a finished board meets its consumers' limits. Converter validation asks whether the regulator design holds across its full input, load and temperature range, and it measures the control loop directly. The methods follow application notes from TI, Richtek and Flex.

## What does DC-DC converter validation cover?

Six measurements, each swept over more than one axis:

| Test                     | What it proves                                                          | Instruments                                                                                            | Swept over                                    | Method or limit source          |
| ------------------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | --------------------------------------------- | ------------------------------- |
| Efficiency and loss      | The design meets its power and thermal budget across the envelope       | Power analyzer or DMMs, programmable DC source, electronic load                                        | Input voltage × load, at a logged temperature | System power and thermal budget |
| Line and load regulation | DC accuracy holds across input and load                                 | DMM at the sense point, on the same grid                                                               | Input voltage × load                          | TI SLVA079                      |
| Output ripple            | Ripple matches the design calculation and the consumer's tolerance      | Oscilloscope, probe in tip-and-barrel                                                                  | Input voltage × load, each operating mode     | Richtek DT004, TI SLVA630A      |
| Load transient           | Deviation and recovery stay in spec at the specified step and slew rate | Electronic load or transient board, oscilloscope, current probe                                        | Step size × starting load × input voltage     | TI SSZTCV2                      |
| Loop response            | Crossover frequency, phase margin and gain margin                       | Network or frequency response analyzer (or generator plus scope), injection transformer, 20 Ω resistor | Input voltage × load                          | TI AN-1889                      |
| Thermal derating         | Maximum output against ambient temperature and airflow                  | Thermocouples, scanning DAQ, chamber or wind tunnel, anemometer                                        | Load × airflow × ambient                      | Flex DN019                      |

Run them roughly in that order. Efficiency and regulation share one grid sweep, ripple and transients reuse its points, the loop test needs a modified board, and derating takes longest.

## How do you measure DC-DC converter efficiency across line and load?

Efficiency is output power over input power, and an efficiency map measures it at every combination of input voltage and load. Take input points at minimum, nominal and maximum plus wherever the system spends its time. For a converter on a vehicle's 12 V or 24 V supply, the supply voltage code assigned under [ISO 16750-2](https://galoislabs.ai/blog/iso-16750-2-electrical-testing) sets the minimum and maximum. Space load points densely at the light end, where fixed losses dominate and efficiency falls fastest.

**Power analyzer or DMMs.** A multi-element power analyzer measures input and output on separate elements over the same update interval. DMMs read one quantity at a time, which is fine while the operating point is steady. At low load, most power supplies enter discontinuous conduction, as [TI's AN-1889](https://www.ti.com/lit/an/snva364a/snva364a.pdf) notes. Controllers that also skip pulses draw input current in bursts, so short reading windows scatter.

**Loss is harder than efficiency.** Loss is the difference of two nearly equal numbers. At 100 W in and 95% efficiency, a 0.1% error on each power reading (0.1 W in, 0.095 W out) can add up to a 4% error on the 5 W loss. If the deliverable is a thermal loss budget, record the analyzer ranges with every point.

**Temperature is part of the operating point.** Losses change as parts warm. Wait for input power to stop drifting instead of sleeping a fixed time, sweep light to heavy, and log the hottest part's temperature with every point. Connect voltage inputs at the board terminals so cable drop is not counted as converter loss.

```python title="efficiency_grid.py"
from typing import Protocol


class Source(Protocol):
    def set_voltage(self, volts: float) -> None: ...

class Load(Protocol):
    def set_current(self, amps: float) -> None: ...

class Analyzer(Protocol):
    def read_fresh(self) -> dict[str, float]: ...  # one completed update: {"P1": W in, "P2": W out}

class Meter(Protocol):
    def dc_volts(self) -> float: ...                # Vout at the converter's feedback sense point

class Thermo(Protocol):
    def read_c(self) -> dict[str, float]: ...       # {"ambient": 24.1, "fet": 61.3, ...}


def settle(pa: Analyzer, tol: float = 0.002, max_updates: int = 120) -> None:
    """Read until input power moves less than tol (a fraction) between two updates."""
    prev = pa.read_fresh()
    for _ in range(max_updates):
        cur = pa.read_fresh()
        if abs(cur["P1"] - prev["P1"]) <= tol * abs(prev["P1"]):
            return
        prev = cur
    raise TimeoutError(f"input power still drifting at {prev['P1']:.4g} W")


def efficiency_grid(src: Source, load: Load, pa: Analyzer, dmm: Meter, tc: Thermo,
                    vin_points: list[float], iout_points: list[float],
                    updates: int = 4) -> list[dict]:
    rows = []
    try:
        for vin in vin_points:
            src.set_voltage(vin)
            for iout in sorted(iout_points):        # light to heavy at each input voltage
                load.set_current(iout)
                settle(pa)
                reads = [pa.read_fresh() for _ in range(updates)]
                p_in = sum(r["P1"] for r in reads) / updates
                p_out = sum(r["P2"] for r in reads) / updates
                rows.append({"vin": vin, "iout": iout, "vout": dmm.dc_volts(),
                             "p_in": p_in, "p_out": p_out, "eta": p_out / p_in,
                             "loss_w": p_in - p_out, "updates": updates, **tc.read_c()})
    finally:
        load.set_current(0.0)
    return rows
```

Each `Protocol` is a thin SCPI wrapper. The [Yokogawa WT power analyzer guide](https://galoislabs.ai/blog/yokogawa-power-analyzer-automation) covers reading completed updates and on-instrument efficiency, [electronic load automation](https://galoislabs.ai/blog/electronic-load-automation) covers the load, and [SCPI instrument automation with Python](https://galoislabs.ai/blog/scpi-automation-python) covers the session patterns underneath.

## How do you get line and load regulation from the same sweep?

Line and load regulation are the steady-state output changes for a change in input voltage and in load current; the [power rail validation plan](https://galoislabs.ai/blog/power-rail-validation-plan) defines both from TI's [SLVA079](https://www.ti.com/lit/pdf/slva079) and sets board-level pass criteria. The efficiency grid already visits every input and load combination, so one DMM reading per point yields both: line regulation down each load column, load regulation along each input row.

- **Measure at the feedback sense point,** the voltage the converter regulates. Plane drop to the consumers belongs to the rail plan.
- **Use a DMM for Vout.** Regulation limits are often fractions of a percent. Check the analyzer's DC voltage accuracy against the limit before using its reading instead.
- **Connect regulation to the loop.** SLVA079 notes that increasing open-loop gain improves both figures, so poor regulation tends to reappear as low gain at the bottom of the Bode plot.

```python title="regulation.py"
def regulation_pct(rows: list[dict], nominal_v: float) -> tuple[dict, dict]:
    """Line regulation at each load and load regulation at each input, as spread in % of nominal."""
    def spread(volts: list[float]) -> float:
        return (max(volts) - min(volts)) / nominal_v * 100

    loads = sorted({r["iout"] for r in rows})
    lines = sorted({r["vin"] for r in rows})
    line_reg = {i: spread([r["vout"] for r in rows if r["iout"] == i]) for i in loads}
    load_reg = {v: spread([r["vout"] for r in rows if r["vin"] == v]) for v in lines}
    return line_reg, load_reg
```

For a multi-output converter, add each output's load as a grid axis and read every output at every point; cross-regulation falls out of the same table.

## How do you measure output ripple on a switching converter?

Ripple readings depend heavily on the probe setup. Richtek's [Output Ripple Measurement Methods for DC-DC Converters](https://www.richtek.com/Design%20Support/~/media/DT_PDF/Ripple_measurement_tips.pdf) (DT004) explains why: a long ground lead and the probe tip can form a loop antenna that collects noise from its surroundings and adds it to the ripple on screen. Its three tips:

- **Minimize the loop** with the tip-and-barrel method.
- **Measure across the output capacitor pads.** The closer to the capacitor, the less noise is collected.
- **Choose the bandwidth for the load:** full bandwidth for noise-sensitive loads such as high-resolution ADCs or audio, 20 MHz otherwise, with background noise checked at full bandwidth either way.

Then compare with the design. TI's [Output Ripple Voltage for Buck Switching Regulator](https://www.ti.com/lit/pdf/slva630a) (SLVA630A) derives buck ripple from inductor ripple current and the output capacitor's capacitance and ESR. Low-ESR ceramics give a quadratic waveform dominated by capacitance; a high-ESR electrolytic gives ripple dominated by ESR. A mismatch with the calculation points to a wrong capacitor, or to ceramic capacitance lost to DC bias: [Murata notes](https://www.murata.com/en-global/support/faqs/capacitor/ceramiccapacitor/char/0005) that the higher the DC voltage on a high dielectric constant part such as X5R or X7R, the lower its effective capacitance.

At each grid point, report peak-to-peak ripple in the stated bandwidth and the amplitude at the switching frequency. Narrow edge spikes inflate the first far more than the second, so a change in the ripple itself stays visible. Conducted and radiated emissions, the noise that leaves the board, are separate measurements, covered in [EMC pre-compliance testing](https://galoislabs.ai/blog/emc-pre-compliance-testing).

```python title="ripple.py"
import numpy as np


def ripple_metrics(t_s, v, f_sw_hz: float) -> dict[str, float]:
    """Peak-to-peak ripple and the peak amplitude of the switching-frequency component."""
    t = np.asarray(t_s, float)
    v = np.asarray(v, float) - np.mean(v)
    window = np.hanning(v.size)
    spectrum = 2 * np.abs(np.fft.rfft(v * window)) / window.sum()  # sine peak amplitude
    freqs = np.fft.rfftfreq(v.size, d=np.mean(np.diff(t)))
    near = np.abs(freqs - f_sw_hz) <= 2 * freqs[1]                   # +/- 2 bins
    return {"vpp": float(np.ptp(v)), "v_fsw_pk": float(spectrum[near].max()),
            "cycles": float((t[-1] - t[0]) * f_sw_hz)}


def buck_ripple_expected(vin: float, vout: float, f_sw: float,
                         l_h: float, c_f: float, esr_ohm: float) -> float:
    """Ideal-buck peak-to-peak output ripple in every ESR regime, TI SLVA630A section 8 (eq. 26)."""
    d = vout / vin                                  # ideal duty cycle
    ip2p = (vin - vout) * d / (l_h * f_sw)          # inductor ripple current, A p-p
    t_on, t_off = d / f_sw, (1 - d) / f_sw
    rc = esr_ohm * c_f
    t_min = max(0.0, t_on / 2 - rc)                 # where the minimum falls in the on time
    t_max = max(0.0, t_off / 2 - rc)                # where the maximum falls in the off time
    return (ip2p * esr_ohm * (1 - (t_max / t_off + t_min / t_on))
            + ip2p / (2 * c_f) * (t_max + t_min - (t_max**2 / t_off + t_min**2 / t_on)))
```

Pass `c_f` as the effective capacitance at the operating DC bias, not the BOM's nominal value.

## How do you test DC-DC converter load transient response?

A load transient test reproduces a specification: step size, slew rate, allowed deviation and recovery time. The [power rail validation plan](https://galoislabs.ai/blog/power-rail-validation-plan) lists what one contains, from TI's [Load transient testing with high slew rates](https://www.ti.com/lit/pdf/ssztcv2) (SSZTCV2), and compares step hardware from electronic loads to FET slammers. Converter validation runs that specification across the envelope instead of at one operating point.

Automating the test adds three habits:

- **Measure the step you applied** with a current probe in the same capture, and compute the 10 to 90% slew rate from it.
- **Trigger on the load edge,** from the load's trigger output or the current channel.
- **Sweep the specification's axes:** step size, starting load and input voltage, both edges each time.

```python title="transient.py"
import numpy as np


def current_edge(t_s, i_a) -> tuple[float, float]:
    """50% crossing time and 10-90% slew rate (A/s) of one load step on a current-probe channel."""
    t, i = np.asarray(t_s, float), np.asarray(i_a, float)
    n = max(1, i.size // 20)
    start, end = np.median(i[:n]), np.median(i[-n:])
    frac = (i - start) / (end - start)             # 0 before the edge, 1 after, either direction
    if not np.any(frac >= 0.9):
        raise ValueError("no complete edge in this capture")
    t10, t50, t90 = (t[np.argmax(frac >= f)] for f in (0.1, 0.5, 0.9))
    return t50, 0.8 * (end - start) / (t90 - t10)


def step_response(t_s, v, t_edge: float, band_v: float) -> dict[str, float]:
    """Peak deviation from the pre-step level, and recovery time into +/- band_v of the final level."""
    t, v = np.asarray(t_s, float), np.asarray(v, float)
    after = t >= t_edge
    v0 = v[~after].mean()
    v_after, t_after = v[after], t[after]
    v1 = v_after[-max(1, v_after.size // 10):].mean()
    dev = v_after - v0
    outside = np.flatnonzero(np.abs(v_after - v1) > band_v)
    if outside.size == 0:
        recovery = 0.0
    elif outside[-1] == v_after.size - 1:
        recovery = float("nan")                    # still outside the band when the capture ends
    else:
        recovery = t_after[outside[-1] + 1] - t_edge
    return {"v_before": float(v0), "v_after": float(v1),
            "peak_dev_v": float(dev[np.argmax(np.abs(dev))]), "recovery_s": float(recovery)}
```

Transient-mode SCPI differs by vendor; [electronic load automation](https://galoislabs.ai/blog/electronic-load-automation) covers B&K Precision, Rigol and Keysight. A recovery that rings several times before settling usually means low phase margin: a reason to measure the loop, not a substitute for it.

## How do you measure loop gain and phase margin with a Bode plot?

[TI's AN-1889, How to Measure the Loop Transfer Function of Power Supplies](https://www.ti.com/lit/an/snva364a/snva364a.pdf), gives the bench recipe:

1. **Break the loop** at the low-impedance output node above the high-side feedback resistor: cut the feedback trace and reconnect it through a 20 Ω resistor. Any RC phase-lead network across the top feedback resistor stays across it.
2. **Inject through a transformer:** a sine of typically 30 to 100 mV across the resistor, with no DC connection to the generator. Start small; the signal must stay small-signal and, where a device has overvoltage thresholds reflected at the feedback pin, must not trip them.
3. **Measure both sides of the resistor.** Where the two amplitudes are equal, loop gain is 0 dB, and the phase difference between them is the phase margin.
4. **Judge the margin.** AN-1889 calls for a minimum of 45 to 50 degrees, depending on how conservative the design is.
5. **Repeat across line and load.** Discontinuous conduction at low load changes the loop, and so does input voltage on voltage-mode converters without feedforward.

A network or frequency response analyzer sweeps automatically; AN-1889 shows a sine generator and two-channel oscilloscope can find crossover and phase margin. Either way, export frequency, gain and phase, and compute margins in code so every grid corner is judged the same way:

```python title="loop_margins.py"
import numpy as np


def loop_margins(freq_hz, gain_db, phase_deg) -> dict:
    """Crossover, phase margin and gain margin from one loop-gain sweep.

    phase_deg is the phase of the returned signal relative to the injected one: the
    convention in which the phase at the 0 dB crossover is the phase margin (TI AN-1889).
    """
    f = np.asarray(freq_hz, float)
    g = np.asarray(gain_db, float)
    p = np.degrees(np.unwrap(np.radians(np.asarray(phase_deg, float))))
    down = np.flatnonzero((g[:-1] > 0) & (g[1:] <= 0))   # gain falling through 0 dB
    if down.size == 0:
        raise ValueError("gain never falls through 0 dB in this sweep")
    i = down[0]
    w = g[i] / (g[i] - g[i + 1])                         # interpolation weight
    fc = f[i] * (f[i + 1] / f[i]) ** w                   # log-frequency interpolation
    pc = p[i] + w * (p[i + 1] - p[i])
    shift = 360 * np.round(pc / 360)                     # crossover phase into (-180, 180]
    p, pc = p - shift, pc - shift
    result = {"crossover_hz": float(fc), "phase_margin_deg": float(pc),
              "extra_crossovers": int(down.size - 1), "gain_margin_db": None}
    falls = np.flatnonzero((p[:-1] > 0) & (p[1:] <= 0) & (np.arange(p.size - 1) >= i))
    if falls.size:                                       # phase reaches 0: the instability point
        j = falls[0]
        w = p[j] / (p[j] - p[j + 1])
        result["gain_margin_db"] = float(-(g[j] + w * (g[j + 1] - g[j])))
    return result
```

Check your analyzer's convention: if it removes the feedback inversion, the instability point is −180°, so add 180° before calling the function. `extra_crossovers` flags a gain curve that crosses 0 dB more than once, and `None` for gain margin means the sweep ended too early. Take the gain margin limit from your design rules.

> **The loop test modifies the board**
>
> AN-1889 notes that loop measurements succeed only on a design that does not oscillate or sit in a hysteretic overvoltage mode. Record which board carries the cut trace and 20 Ω resistor, and keep it out of other runs unless the resistor is part of the design.

## How do you build a thermal derating curve?

A derating curve shows a converter's maximum output against ambient temperature, usually one curve per airflow velocity. Flex's [Thermal Characterization of Flex Power Modules](https://flex.com/resources/fpm-designnote019-thermal-characterization) (Design Note 019) documents its method and warns that there is no industry-wide standardization of format or data generation, so write yours down.

Flex's method, in outline:

- **A defined wind tunnel:** a 254 mm square test board beside a parallel second board, airflow from 0.2 m/s (natural convection) to 3 m/s, read by a hot-wire anemometer.
- **Thermocouples** for ambient just ahead of the converter and on locations the engineers select.
- **A grid of stabilized points:** four loads, such as 25, 50, 75 and 100%, at seven airflows, 28 combinations. Stabilizing can take several minutes, and a point stops if any location exceeds its limit.
- **Extrapolate the rise.** For the PKB4619, limited to 110 °C board temperature, 25 A at 2 m/s gave a 45.5 °C rise, so the limit is reached at about 64 °C ambient.

Flex notes the testing "can become quite time consuming," which makes it the best candidate for running unattended:

```python title="derating.py"
import numpy as np


def stable(t_s, temps_c, window_s: float = 600.0, max_change_c: float = 0.5) -> bool:
    """True once every thermocouple has stayed within max_change_c over the last window_s.

    The window and threshold are examples; use your lab's written stabilization criterion.
    """
    t, temps = np.asarray(t_s, float), np.asarray(temps_c, float)  # temps: (samples, channels)
    if t[-1] - t[0] < window_s:
        return False
    recent = temps[t >= t[-1] - window_s]
    return bool(np.all(np.ptp(recent, axis=0) <= max_change_c))


def max_ambient(rise_c: dict[str, float], limit_c: dict[str, float]) -> tuple[str, float]:
    """Highest ambient for one load and airflow point, and the location that sets it.

    Flex DN019 method: each location's limit minus its measured rise above ambient.
    """
    location = min(rise_c, key=lambda k: limit_c[k] - rise_c[k])
    return location, limit_c[location] - rise_c[location]
```

Take each location's limit from its own datasheet. The extrapolation assumes the rise does not change with ambient; losses usually grow as parts heat, so confirm points near the limit in a chamber.

## What should each validation point record?

A number without its conditions cannot be reproduced or defended in review. Every point should carry:

| Field               | Example                                                   | Why it matters                                              |
| ------------------- | --------------------------------------------------------- | ----------------------------------------------------------- |
| Operating point     | Input voltage, load current, airflow                      | The axes of the map                                         |
| Temperatures        | Ambient and each thermocouple                             | Losses and margins move with temperature                    |
| Instrument identity | Full `*IDN?` string for each instrument                   | Ties the result to one unit and firmware                    |
| Instrument settings | Ranges, update interval, bandwidth limit, probe           | The same circuit reads differently under different settings |
| Sample size         | Updates averaged, captures per edge                       | States how much data stands behind the number               |
| Board identity      | Serial number, revision, rework such as the loop resistor | Separates a modified board from a stock one                 |
| Limit and source    | 45° minimum phase margin per AN-1889                      | Lets a reviewer trace every verdict                         |

[Hardware test traceability](https://galoislabs.ai/blog/hardware-test-traceability) covers linking these from requirement to result; the [DVT test report template](https://galoislabs.ai/blog/dvt-test-report-template) shows where they land.

## How do you run DC-DC converter validation in Galois with Évariste?

Évariste, the agent in the Galois platform, can run the same efficiency and regulation grid from a plain-English objective; you review and approve the sequence before it reaches the bench. Open it from the app sidebar (Ctrl+Shift+E) beside the project; [AI test automation for hardware benches](https://galoislabs.ai/blog/ai-test-automation-hardware) explains how it builds sequences.

**Instruments.** Ask "List connected instruments" to confirm the WT5000, Chroma 63600, DMM, DAQ6510 and DC source are connected. Check that the WT5000 profile's numeric read returns P-1 and P-2 in one response, which the four-read rule depends on; for a source or DMM outside the library, upload its manual and review the profile Évariste generates.

**Objective.** State the grid, the reads and the limit with its source, for example:

> Create an efficiency and regulation sequence for the 5 V buck. Inputs 9, 12 and 16 V from the DC source. At each input, step the Chroma 63600 light to heavy: 0.1, 0.25, 0.5, 1, 2 and 3 A. WT5000 element 1 on the input, element 2 on the output; after the settle wait at each point, read P1 and P2 four times, one update apart. Vout from the DMM at the feedback sense point, limit 4.95 to 5.05 V (5 V ±1%, the design's output accuracy requirement). Record ambient and FET temperature from the DAQ6510. Return the load to 0 A at the end.

**Draft.** Évariste writes the grid out point by point as a draft. Power and temperature readings become `measure` steps, which record without judging; only Vout, with its stated limit, can fail. The first point of the 12 V row:

```yaml title="buck_5v_grid.yaml (excerpt)"
name: "5 V buck efficiency and regulation grid"
steps:
  # setup steps first: supply output on, eload to CC with input on,
  # analyzer items P-1 and P-2 on fixed ranges, DAQ channels to thermocouple
  - name: "Input 12 V"
    type: action
    config:
      instrument_id: "psu"
      command_name: "source_voltage"
      parameters: { value: "12.0" }

  - name: "Load 0.1 A"
    type: action
    config:
      instrument_id: "eload"
      command_name: "cc_current_level"
      parameters: { value: "0.1" }

  - name: "Settle at 12 V, 0.1 A"
    type: wait
    config: { duration_ms: 30000 }

  - name: "P1, P2 at 12 V, 0.1 A (read 1 of 4)"
    type: measure
    config:
      instrument_id: "analyzer"
      command_name: "numeric_value"
      unit: "W"

  # reads 2 to 4 follow, each after a wait of one update interval;
  # every read's raw response carries both P-1 and P-2

  # limit source: design output accuracy requirement, 5 V +/-1%
  - name: "Vout at 12 V, 0.1 A (5 V ±1%)"
    type: numeric_limit
    config:
      instrument_id: "dmm"
      command_name: "measure_voltage_dc"
      parameters: { range: "10", resolution: "0.0001" }
      low_limit: 4.95
      high_limit: 5.05
      unit: "V"
      comparison: "GELE"

  # then channel_close and measure_temperature on the daq for each thermocouple;
  # the closing step sets the eload to 0 A
```

**Review and approval.** Check the grid, the limit and its source, the light-to-heavy order, the four reads per point and the closing 0 A step. Size the settle wait at the heaviest point: set that point by hand and watch input power in Monitor until it moves less than 0.2 percent between updates, the `settle()` criterion. [How to review an AI-generated test plan](https://galoislabs.ai/blog/review-ai-generated-test-plan) covers the rest. Every edit, in conversation or the sequence builder, is a new version with a diff and needs re-approval. Évariste asks you to confirm dangerous commands it sends directly, such as enabling the source output.

**Run and results.** Start the run; galois-edge executes it while Monitor shows the channels live. Every step records its measured value, limits, pass or fail, raw command and response, instrument, operator, DUT serial and timestamps; keep board revision and rework in a project note, where Évariste can cite it. Ask for efficiency and loss at each point from the mean of its four reads, as `efficiency_grid()` computes them, and to flag any point where input power moved more than 0.2 percent between reads. Ask which Vout points failed or passed near the limit, for the spread down each load column and along each input row, as `regulation_pct()` computes it, or to compare runs at two ambients. Check its figures against the recorded reads before they go into a report.

**Report.** Ask it to "Generate a test report from the last run", edit it in the report editor, and share it to Slack. Ripple starts the same way, from "Measure output ripple at full load".

You no longer write or maintain the `Protocol` wrappers, the sweep and settle loops, the `try`/`finally` cleanup, logging, row storage or a report script. The grid and limits from the datasheet and power budget, sizing the settle wait, review and approval, probe placement, wiring at the board terminals and the safety of the setup stay with you.

| Step            | Code path (this guide)                              | Galois with Évariste                                                               |
| --------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------- |
| Connect         | Thin SCPI wrapper per `Protocol`                    | "List connected instruments"; library or generated profile                         |
| Define the grid | `vin_points`, `iout_points`                         | Inputs, loads, reads and limit in plain English                                    |
| Settle          | `settle()`: input power within 0.2%                 | Wait sized in Monitor; drift flagged across the four reads                         |
| Measure         | `read_fresh()` four times, `dc_volts()`, `read_c()` | `measure` steps; numeric limit on Vout                                             |
| Clean up        | `finally: load.set_current(0.0)`                    | Closing step sets the load to 0 A                                                  |
| Record          | Your own row storage                                | Per-step value, limits, raw response, DUT serial                                   |
| Interpret       | `p_out / p_in`, `regulation_pct()`                  | Efficiency and loss from mean reads; near-limit steps; Vout spread; run comparison |
| Report          | Your script or DVT template                         | Generated report; report editor; Slack                                             |

## How do you automate DC-DC converter validation?

Every script above is the same loop: set conditions, wait, measure, store. On one bench, a folder of Python is enough. Across benches and builds, the questions become which instrument ran which point, who changed a limit, and which board revision a curve belongs to.

Galois is agent-driven test engineering for hardware teams: agents generate tests and instrument drivers, run them on real benches through the open-source galois-edge daemon, and turn the results into reports and a shared engineering record.

The Apache-2.0 daemon [discovers instruments](https://docs.galoislabs.ai/guides/connecting-instruments/) over GPIB, USB, LAN, serial, Modbus and CAN. Galois ships 573 instrument profiles across 135 manufacturers in its [instrument library](https://galoislabs.ai/instruments), including the Yokogawa WT5000 and ZES Zimmer LMG670 power analyzers, Chroma 63600 and Keysight EL34143A loads, Keysight InfiniiVision 3000 X-Series and Tektronix 4, 5 and 6 Series oscilloscopes, and Keysight DAQ970A and Keithley DAQ6510 data acquisition systems. Unprofiled instruments still accept raw SCPI, and Évariste generates profiles from programming manuals. The [typed `galois` SDK](https://docs.galoislabs.ai/guides/python-sdk/) returns waveforms as NumPy arrays, ready for `ripple_metrics()` and `step_response()`. The [Évariste walkthrough above](https://galoislabs.ai/blog/dc-dc-converter-validation#how-do-you-run-dc-dc-converter-validation-in-galois-with-évariste) runs this guide's grid on the same daemon.

[Galois sequences](https://galoislabs.ai/product) make the sweeps reviewable YAML. Numeric limit steps judge spec points, such as output voltage at each regulation corner, and every step stores the command sent, raw response, measured value, limits and instrument; the run carries operator and DUT serial.

[EVT, DVT and PVT testing](https://galoislabs.ai/blog/evt-dvt-pvt-testing) covers where this fits across builds, and the [Galois and PyVISA comparison](https://galoislabs.ai/compare/pyvisa) sets out what Galois adds on top of PyVISA. To try the daemon on your bench, start with the [quickstart](https://docs.galoislabs.ai/getting-started/quickstart/).

## Frequently asked questions

### Can I run DC-DC converter validation in Galois without writing Python?

Yes. Ask Évariste, the agent in the Galois platform, to list connected instruments and confirm the WT5000, Chroma 63600, DMM, DAQ6510 and DC source are there, then describe the efficiency and regulation grid to it in plain English: input voltages, load steps, four power reads per point and the Vout limit with its source. It writes the grid as a draft sequence that an engineer reviews and approves before anything runs. The galois-edge daemon runs the approved sequence on the bench, and every step records its value, limits, pass or fail and raw command and response. Évariste computes efficiency and loss from the mean of each point's four reads, which you check against the recorded reads, and generates the test report.

### What phase margin should a DC-DC converter have?

TI's AN-1889 calls for a minimum of 45 to 50 degrees, depending on how conservative the design is, and adds that more is better. Measure it at several line and load conditions: at light load most converters enter discontinuous conduction, which changes the loop, and voltage-mode loops without input voltage feedforward change with input voltage.

### Do I need a power analyzer to measure DC-DC converter efficiency?

Not always. DMMs on input and output voltage and current, with a long integration time, work when the operating point is steady. A multi-element power analyzer measures input and output over the same update interval and computes efficiency per update, which matters when current arrives in bursts at light load and when an efficiency map has dozens of points.

### How do you measure output ripple on a DC-DC converter?

Probe across the output capacitor pads with the tip-and-barrel method, so no long ground lead forms a loop that picks up noise. Richtek's ripple measurement note recommends a 20 MHz bandwidth limit for noise-insensitive loads and full bandwidth for loads such as high-resolution ADCs or audio, with background noise checked at full bandwidth either way.

### How is a thermal derating curve measured?

Run the converter at fixed load points and airflow velocities with thermocouples on its hottest locations, wait for temperatures to stabilize, and record each location's rise above ambient. The maximum ambient for that point is the location's temperature limit minus its rise. Flex's Design Note 019 uses a wind tunnel, airflow from 0.2 to 3 m/s and load points such as 25, 50, 75 and 100 percent.
