Why a 50 Ω Generator Can Read Twice as High on Your Scope

Set a function generator to 0.500 volts peak-to-peak (Vpp), the distance from the bottom of a waveform to its top. Your oscilloscope might show nearly 1.00 Vpp. To find out why, change the generator's load setting and the physical load separately. Four readings tell you whether the discrepancy follows the display assumption, the load connected to the cable, or neither.

This experiment uses the Tektronix AFG1022, the Rigol DS1054Z and a Pomona 4119-50 feed-through termination. A termination is a resistor across the end of a cable; in this fixture it changes how much current the generator delivers. The resulting voltages below are calculations. Record your own measurements before drawing any conclusion about your instruments.

Connect one source to one input

Use channel 1 (CH1) on each instrument and a short 50 Ω Bayonet Neill–Concelman (BNC) coaxial cable. A coaxial cable carries the signal on its center conductor and the reference on a surrounding shield. Connect the generator directly to the scope input in the first condition. For the second, switch the generator output off and insert the Pomona 4119-50 on the scope end. Its feed-through path still carries the center signal into the scope; the added 50 Ω resistor connects that center to the shield. The scope itself remains on its normal 1 MΩ input in both conditions.

The AFG1022 ideal sine source feeds a typical 50 ohm series resistance and the BNC center. The Rigol scope connects one megohm and 15 picofarads in parallel from center to shield. The removable Pomona 4119-50 adds a 50 ohm shunt at that same input.
The two physical loads use the same center and shield. Insert the shunt at the scope end with the generator output off. Full-size Portable Network Graphics (PNG) image · Editable Scalable Vector Graphics (SVG) drawing.

Keep the mains earth connections intact and connect no other equipment to the signal node. Do not use a loose wire in place of the BNC shield, disconnect protective earth, or attach this setup to a powered circuit. The low-voltage sine is the only signal. The specified AFG1022 output is referenced to chassis; it is not a floating source.

Separate what the display assumes from what the cable sees

Output impedance is the electrical opposition seen looking back into a source. At 1 kilohertz (kHz) in this fixture, use a simple model: an ideal sine source followed by a series resistance RS. Tektronix lists 50 Ω as typical. The scope input is 1 megohm (MΩ) in parallel with about 15 picofarads (pF). At 1 kHz, the capacitive path alone has about 10.6 MΩ of opposition; with a short cable and a source near 50 Ω, use the resistive approximation to explain the large changes. Do not extend this model to a fast edge or a long cable.

The AFG output setup menu has a High Z mode, meaning the display assumes a very high impedance, and a 50 Ω setting, meaning the display states the voltage expected across a 50 Ω load. The selection changes what amplitude the instrument reports for a load. The datasheet specifies the physical output impedance separately. Always re-enter the same displayed amplitude after choosing the setting: the lab makes no assumption about what a menu change alone will do to an existing output.

Vload = Vdisplay × (1 + RS/Rdeclared) ÷ (1 + RS/Ractual)

In High Z, take the declared resistance to infinity, so the first parenthesis is 1. With the terminator fitted, the load is 50 Ω in parallel with 1 MΩ, approximately 49.9975 Ω. In 50 Ω display mode and with a nearly open input, the two parentheses are about 2 and 1, which explains the near doubling. At 0.500 Vpp across 50 Ω the ideal sine dissipates about 0.625 milliwatts in the shunt. This is far below the 2 W part rating; the experiment does not call for testing that rating.

Measure all four conditions

  1. Set the AFG1022 CH1 to a 1.000 kHz sine and 0 V offset. Set the scope CH1 to direct-current (DC) coupling and a 1× probe factor for the direct cable. Start around 200 millivolts per division (mV/div) and 200 microseconds per division (µs/div) so several periods are visible without clipping. Select the peak-to-peak reading on the same channel.
  2. With the output off, pick the first physical load, select the corresponding row's display mode in Output Setup, then enter 0.500 Vpp again. Record the actual display value.
  3. Enable the output. Check the sine is centered and entirely visible, then write three settled Vpp readings for this condition. Record any change in vertical scale or averaging and use the same settings across the four cases when practical. Switch the output off before changing the cable or the termination.
  4. Repeat for all rows. If possible, measure the disconnected terminator center to shell with a digital multimeter and an appropriate BNC adapter before the experiment. Record the value independently; do not use resistance mode on a powered circuit. Keep 50 Ω as nominal if you do not have a reliable reading.
Calculated values for a 50 Ω source and nominal loads. These are not bench data.
Display modePhysical loadNominal Vpp prediction
High ZScope alone0.500 V
High ZScope plus 50 Ω0.250 V
50 ΩScope alone1.000 V
50 ΩScope plus 50 Ω0.500 V

If the output is flat, check that the channel output is on and the scope channel is not set to ground coupling. If the physical terminator barely affects either pair, check the actual terminator marking, continuity and whether it is really across the measured channel. A uniform 10× discrepancy points toward the scope probe factor or the reported units. An unstable or clipped trace is not a useful amplitude reading. Fix the setup and repeat that row.

Estimate the effective source resistance

For one display mode, let q be the scope-alone median divided by the terminated median. Let RA be the scope resistance and RB the scope in parallel with the shunt. Taking the ratio cancels the unknown ideal sine amplitude. Solving the divider equation gives:

RS = (q − 1) ÷ (1/RB − q/RA)

The model requires a positive denominator and a scope-alone reading larger than the terminated one. If a pair cannot resolve a positive estimate, the program reports it as unknown. The estimates from the two pairs are a consistency check: scope amplitude uncertainty, resistor tolerance, instrument loading and repeatability all affect the result. This is not the manufacturer's performance verification procedure or a calibrated resistance measurement.

Run the complete worksheet analyzer

Copy the blank comma-separated values (CSV) worksheet and fill the three empty measurements in each row, in volts peak-to-peak. Run python3 afg1022_load.py observations.csv. If you measured the shunt, add --terminator-ohm 49.8, replacing that example value with yours. The program prints each median, the spread of the three readings, the nominal prediction and the effective source estimate. Blank inputs, repeated conditions, inconsistent display amplitudes and out-of-scope values are rejected.

Download the exact Python program · Download the host tests. The tests use constructed data; no instruments or owner readings were used.

"""Analyze four sine-wave readings from the AFG1022 load display lab."""

import argparse
import csv
import json
import math
import sys
from statistics import median


DISPLAY = {"high_z": math.inf, "50_ohm": 50.0}
STATES = tuple((setting, load) for setting in DISPLAY for load in ("scope", "terminated"))
FIELDS = ["display_load", "physical_load", "display_vpp", "vpp_1", "vpp_2", "vpp_3"]


def positive(value, label):
    try:
        number = float(value)
    except (ValueError, TypeError) as exc:
        raise ValueError(f"{label}: enter a positive finite number") from exc
    if not math.isfinite(number) or number <= 0:
        raise ValueError(f"{label}: enter a positive finite number")
    return number


def parallel(a, b):
    return 1.0 / (1.0 / a + 1.0 / b)


def predict(display_vpp, display_load, actual_load, source_ohm=50.0):
    return display_vpp * (1 + source_ohm / display_load) / (1 + source_ohm / actual_load)


def estimate_source(high_vpp, terminated_vpp, high_load, terminated_load):
    ratio = high_vpp / terminated_vpp
    denom = 1.0 / terminated_load - ratio / high_load
    if ratio <= 1.0 or denom <= 0.0:
        raise ValueError("readings do not resolve a positive series resistance")
    return (ratio - 1.0) / denom


def analyze(handle, scope_ohm=1_000_000.0, terminator_ohm=50.0):
    scope_ohm = positive(scope_ohm, "scope input ohms")
    terminator_ohm = positive(terminator_ohm, "terminator ohms")
    if not 900_000 <= scope_ohm <= 1_100_000 or not 45 <= terminator_ohm <= 55:
        raise ValueError("use the specified 1 MΩ scope and 50 Ω terminator")
    loads = {"scope": scope_ohm, "terminated": parallel(scope_ohm, terminator_ohm)}
    reader = csv.DictReader(handle)
    if reader.fieldnames != FIELDS:
        raise ValueError("CSV header does not match the blank worksheet")
    rows = {}
    for line, row in enumerate(reader, 2):
        if None in row:
            raise ValueError(f"line {line}: too many columns")
        state = row["display_load"], row["physical_load"]
        if state not in STATES or state in rows:
            raise ValueError(f"line {line}: unknown or repeated condition {state}")
        displayed = positive(row["display_vpp"], f"line {line} display")
        if not 0.25 <= displayed <= 0.75:
            raise ValueError(f"line {line}: display amplitude outside the lab range")
        samples = [positive(row[k], f"line {line} {k}") for k in FIELDS[3:]]
        if max(samples) > 2.0:
            raise ValueError(f"line {line}: check units, offset and output before continuing")
        predicted = predict(displayed, DISPLAY[state[0]], loads[state[1]])
        rows[state] = {
            "display_load": state[0], "physical_load": state[1],
            "display_vpp": displayed, "actual_load_ohm": loads[state[1]],
            "median_vpp": median(samples), "span_vpp": max(samples) - min(samples),
            "nominal_vpp": predicted, "delta_from_nominal_vpp": median(samples) - predicted,
        }
    if set(rows) != set(STATES):
        raise ValueError("record all four distinct conditions")
    estimates = {}
    for setting in DISPLAY:
        high, term = (rows[(setting, condition)] for condition in ("scope", "terminated"))
        if not math.isclose(high["display_vpp"], term["display_vpp"], rel_tol=0, abs_tol=1e-9):
            raise ValueError(f"{setting}: keep the displayed amplitude equal within the load pair")
        try:
            estimates[setting] = {
                "ohm": estimate_source(high["median_vpp"], term["median_vpp"],
                                       loads["scope"], loads["terminated"])
            }
        except ValueError as exc:
            estimates[setting] = {"ohm": None, "note": str(exc)}
    if not math.isclose(rows[("high_z", "scope")]["display_vpp"],
                        rows[("50_ohm", "scope")]["display_vpp"], rel_tol=0, abs_tol=1e-9):
        raise ValueError("enter the same displayed amplitude in both generator modes")
    return {
        "scope": "resistive 1 kHz model, not a calibration or a device conformance test",
        "rows": [rows[state] for state in STATES],
        "effective_source_estimates": estimates,
    }


def main(argv=None):
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("worksheet")
    parser.add_argument("--scope-ohm", type=float, default=1_000_000)
    parser.add_argument("--terminator-ohm", type=float, default=50)
    args = parser.parse_args(argv)
    try:
        with open(args.worksheet, encoding="utf-8-sig", newline="") as handle:
            result = analyze(handle, args.scope_ohm, args.terminator_ohm)
    except (OSError, ValueError, csv.Error) as exc:
        print(f"Cannot analyze: {exc}", file=sys.stderr)
        return 2
    print(json.dumps(result, indent=2, allow_nan=False))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

Challenge

You see 0.500 Vpp with 50 Ω on the generator display and the feed-through fitted. Can that agreement alone prove the generator's source resistance is 50 Ω?

Check your reasoning

No. This one reading only says the displayed and observed amplitudes agree under that condition. You need a second physical load with the same display setting, then the ratio and the measured load resistances, to estimate the effective source resistance.

Further reading and primary sources

For a different question about the same type of cable, see Coax Echoes: Measure the Round Trip on Two Cable Lengths. That setup measures a delayed edge. The present experiment waits for a low-frequency sine and compares the resulting amplitude.