ARTICLE 90 · POWER EXPERIMENT
A Resettable Fuse Is a Thermal Device, Not a Fast Current Clamp
Why a “100 mA fuse” can pass more than 100 mA
A small resettable fuse does not measure current and instantly open at the number printed in a parts list. A polymer positive-temperature-coefficient (PPTC) device contains a polymer-based conductive structure whose resistance rises strongly as it heats. Current produces heat; the surrounding air and connected leads remove heat. Its electrical behavior therefore depends on its temperature and what happened before this reading.
This experiment uses one exact Bourns MF-R010 radial-leaded part to compare a light load, one bounded temporary overload and a later light-load recovery check. The useful result is a record of supply voltage, load voltage, elapsed time and cooling history. There is no promised trip time, thermal model or claim that the fuse will protect every semiconductor. The load is a power resistor, not a microcontroller that might be damaged before a thermal device responds.
The design and the supplied analysis program have been checked locally. No physical build, temperature measurement or trip has been performed by the author. Blank observations are provided so a real outcome—including “no qualifying transition observed”—can be recorded without replacing it with a convincing invented curve. Review resistor power and ratings and the electronics course before wiring.
Read the exact part and the conditions together
Voltage is expressed in volts (V), current in amperes (A), resistance in ohms (Ω) and power in watts (W). A milliampere (mA) is one thousandth of an ampere. The current manufacturer sheet is MF-R Series, revision AR, September 2026. MF-R010 without a packaging suffix means bulk packaging without a lead-form suffix. The old “-99” suffix is not needed for this choice. Do not substitute a similarly marked part, a different hold-current value, a miniature surface-mount family or an unidentified yellow disc. Record the actual marking, supplier traceability and ambient temperature. The family is presently documented by Bourns; that is not a promise about a distributor’s stock.
| MF-R010 quantity | Manufacturer condition | What it means here |
|---|---|---|
| Hold current 0.10 A; trip current 0.20 A | 23°C ambient | Conditional thermal ratings, not an instantaneous 0.10 A clamp |
| Initial resistance 2.50–4.50 Ω | 23°C, still air | Useful initial-drop calculation; leads and contacts add resistance |
| R1 maximum 7.50 Ω | One hour after a trip, at 23°C | A different history from the initial-resistance specification |
| Maximum trip time 4.0 s | 0.5 A test, maximum rated voltage, 23°C, still air | Not a four-second guarantee at our lower, changing current and 3.3 V |
| Maximum voltage 60 V; maximum current 40 A | Specified maximum ratings | Damage/fault-selection boundaries, never the operating targets of this experiment |
At 40°C the table gives 0.08/0.16 A hold/trip; at 85°C it gives 0.04/0.08 A. These values show why nearby warm parts and enclosures matter. The device’s −40 to +85°C operating range does not turn a hot test into an equivalent 23°C test. Use ordinary indoor ambient air, approximately 20–26°C, for this lesson; record it rather than applying a made-up correction. The manufacturer’s time/current curves describe typical behavior under their conditions. They are not a prediction for this fixture.
Bourns also restricts the intended protection use to temporary adverse conditions rather than repetitive or prolonged faults. This lesson calls for one brief overload, not an automatic trip/reset oscillator. Do not pot the disc, squeeze it in a clamp, cover it with adhesive or place a hot resistor beside it: expansion and heat exchange are part of its operation.
A deliberately modest test fixture
Use a regulated, isolated bench supply set to 3.30 V with a 0.30 A current limit. Verify the settings using the supply’s documented procedure before connecting the experiment. Constant voltage (CV) means the supply is regulating voltage; constant current (CC) means it has reached its current limit and lowered its output voltage. The supply’s limit bounds this experiment; it is not evidence that the PPTC has tripped. A supply whose current limit cannot be verified is unsuitable for the overload step.
The normal load is Vishay AC01000001000JA100: AC01, 100 Ω, ±5%, axial wirewound, rated 1 W at 40°C. The temporary load is AC05000001009JAC00: AC05, 10 Ω, ±5%, rated 5 W at 40°C. These exact orderings are decoded by current Vishay document 28730, revision 05-Dec-2024. They are ordinary AC-series parts, not assumed non-inductive AC-NI parts. Inductance is immaterial to the slow resistive observation here; neither part is a precision current shunt.
Use secure insulated low-voltage connections, two battery-operated digital multimeters with voltage inputs of at least 10 megaohms (MΩ), or ten million ohms, a stopwatch or timestamped video of both displays, a room thermometer and a nonflammable support. A multimeter is an instrument that measures voltage or resistance; its COM terminal is the black common-reference socket. Each red lead stays in the voltage/resistance socket, never the current socket. Use the meter’s direct-current voltage range; direct current (DC) has fixed polarity in this fixture.
Mount the power resistor with its body clear of the support and wiring, following its manufacturer’s mounting/derating guidance. Keep it at least 50 mm away from the PPTC as an experimental layout choice, not a guaranteed thermal isolation distance. Vishay requires adequate clearance and reduces permissible dissipation above 40°C. The chosen power margin does not make the body touch-safe. Keep hands clear while powered; disconnect and allow both parts to cool before touching or changing the load. Do not use mains, a directly shorted battery, a motor or an unknown load.
Measure two nodes against the same return
With the supply output disabled, connect supply positive to node A, F1 lead a to A, F1 lead b to node B, and the selected resistor from B to supply negative. The two PPTC leads are nonpolar; “a” and “b” are our schematic identifiers, not manufacturer pin numbers. No internal pin map is invented. The MF-R010 outline is style 1, with nominal 5.1 mm lead spacing; the maximum body dimensions in the sheet are 7.4 mm wide, 12.7 mm high and 3.1 mm thick.

Meter A red goes to A; meter B red goes to B. Both black COM leads go to GND, meaning ground: the common return connected to supply negative. The drawing shows each complete path and each branch junction. Neither meter is placed in series. If using a grounded oscilloscope instead, both ground clips must still be on this return; putting an earth-connected ground clip on A and another on B can bypass the fuse. This lesson does not require that substitution.
Install only one load at a time. Start with 100 Ω. Changing to 10 Ω is done with the output off, not by bridging the 100 Ω resistor with another value. Check the load’s unpowered resistance and record the measured value for the analysis program. Meter resistance includes contact and lead errors; a two-wire reading of a few ohms is not precision characterization. Never use resistance mode on a powered circuit.
Calculate the cold envelope, not a thermal trajectory
For an initially cool fuse, a regulated 3.3 V source and an ideal resistive load, Ohm’s law gives:
I = Vs / (Rload + Rfuse) Vload = I × Rload Pfuse = I² × Rfuse Pload = I² × Rload
With 100 Ω and the 2.5–4.5 Ω initial range, calculated current is approximately 32.20–31.58 mA and the fuse drop is 80.5–142.1 mV. This is below the 23°C hold rating, but it is still conditional on temperature and mounting. Including the 100 Ω resistor’s ±5% tolerance, and allowing an actual source as high as 3.45 V for analysis, the upper current is 3.45/(95+2.5) ≈35.38 mA. A meter with inadequate millivolt resolution can obscure the small series drop.
With nominal 10 Ω, the initial 3.3 V calculation is about 264–228 mA. It is neither 0.5 A nor a constant-current trip test: as the PPTC heats and changes resistance, current also changes. Even if the PPTC became a zero-ohm link, the 10 Ω ±5% load at 3.45 V would dissipate at most 3.45²/9.5 ≈1.253 W. The 5 W load provides margin at the stated ambient/mounting conditions. The supply may enter CC in an abnormal low-resistance condition; stop rather than raising its setting.
A less obvious limit comes from the PPTC’s own power. At a fixed supply and load, Pfuse = Vs²×Rfuse/(Rload+Rfuse)², which reaches its maximum at Rfuse = Rload. At nominal 3.3 V and 10 Ω that maximum is only 0.272 W. The sheet’s 0.38 W typical tripped dissipation is not a minimum-power guarantee, but the comparison warns against assuming this low-voltage fixture will sustain a high-resistance state. It may settle, change gradually or show no qualifying transition. Do not increase voltage, current limit or exposure duration to force a desired result.

The left graph varies an assumed resistance algebraically; it has no time axis. The right graph is a constructed set of observations used to test the classifier. Neither graph is a measured MF-R010 response, a predicted heating curve or a copy of the manufacturer’s trip curve.
One bounded overload and a history record
- Inspect the connections with power off, verify both meter sockets/ranges, measure the unpowered load and note room temperature. Record the fuse marking, unused/previously-tripped history and elapsed cooling time. An unknown history must remain unknown; do not label it “factory initial.”
- Fit 100 Ω, enable 3.30 V and observe for about ten seconds. Read both node voltages and supply CV/CC indication. Disable output. Unexpected voltage, a warm contact or CC is a stop condition requiring wiring diagnosis, not proof of PPTC operation.
- Allow the fixture to return to room conditions. With output off, fit 10 Ω, keep the supply settings unchanged and start elapsed time when output is enabled. Capture both displays and the supply mode. A video permits later transcription at roughly one-second spacing without moving probes. Record the actual observation times; do not invent a zero-time voltage pair.
- Switch output off at the first clearly sustained load-voltage reduction, or by 30 seconds maximum if that does not happen. Stop earlier for CC, unexpected heating, unstable connections, smell or visible damage. The 30-second bound is an operator-controlled experimental limit, not an automatic action in the Python program. Never leave the circuit unattended.
- Leave the output off and record the cooling interval. After at least an hour at room conditions and once both parts have cooled, install 100 Ω with output still off, then make one short recovery check. Record it separately. The later resistance/drop may differ from the unused value. A one-hour wait alone does not prove the manufacturer’s exact recovery conditions or that every possible fault has cleared.
For paired readings, record the separation between the two displayed observations. Our analysis accepts at most 0.25 s of transcription skew, meaning the time separation of the observations; this does not make the meters’ internal conversion windows simultaneous. Note their display update rate and any evident settling. The derived current Vload/Rload assumes a quasi-static resistive load. It includes neither precise fast-trip timing nor an independent current measurement. Do not infer device temperature from electrical resistance.
Save the first genuine trial, even if it has no event. Do not run a succession of overloads just to obtain a preferred trace. A failed, damaged or permanently altered sample is retired from the experiment, not described as resettable by assertion.
Analyze recorded observations without inventing a trip
The optional program uses Python 3.12 and its standard library on a host computer. Comma-separated values (CSV) is a text table; JavaScript Object Notation (JSON) is the structured report format. No computer connection to the supply or meters is required. The program does not log automatically, regulate anything or switch off power.
Download the blank CSV worksheet. Each run has a unique run_id, phase baseline/overload/recovery, elapsed t_s from output enable, source_v at A, load_v at B, pair_skew_s, measured load_ohm, ambient_c, preceding cooldown_s, observed supply_mode CV/CC/UNKNOWN and notes. Use a consistent metadata value within a run; start a different ID when changing load or history. Use seconds, volts, ohms and degrees Celsius. An unknown supply indication is UNKNOWN. If the cooling interval is unknown, establish and record a new measured interval before this controlled trial rather than entering a fabricated value.
For an accepted snapshot, current is Vload/Rload, apparent series resistance is (Vsource−Vload)/I, and series dissipation is (Vsource−Vload)×I. Apparent series resistance includes leads and contacts. Below 1 mA the report leaves resistance null because the division becomes especially sensitive to meter errors. A load reading above its source is rejected rather than silently clamped to a plausible resistance.
The reporting convention is a voltage ratio at or below 0.20 in accepted overload observations spanning at least one second, with no adjacent gap greater than two seconds. CC/UNKNOWN, excessive skew, out-of-window source/ambient or inconsistent voltage order resets the candidate pair. A qualifying result says observed low-ratio pair; cause needs review. It does not prove the PPTC caused the change: a bad series connection can imitate it. Missing samples prove nothing about the unseen interval. There is no interpolation and no exact trip-time estimate.
python3 pptc-trip-thermal-history.py observations.csv > report.json
The complete program is below and available as a standalone Python file. Malformed/nonfinite data, changing run metadata or nonincreasing times refuse the whole report with exit status 2; valid rows with measurement-quality problems retain their reasons. An empty worksheet is refused. Shell redirection may create an empty report file on failure, so check exit status before treating it as evidence.
Complete observation analyzer
"""Analyze manually transcribed MF-R010 voltage observations, never control power.
Python 3.12; standard library only. No built-in demonstration measurements.
An observed low-ratio pair is a reporting convention, not proof of a trip or
continuous behavior between samples. The operator must switch power off by 30 s.
"""
import argparse
import csv
import json
import math
import sys
FIELDS = (
"run_id", "phase", "t_s", "source_v", "load_v", "pair_skew_s",
"load_ohm", "ambient_c", "cooldown_s", "supply_mode", "notes",
)
def number(value, name):
try:
result = float(value)
except (ValueError, TypeError):
raise ValueError("not a number: " + name) from None
if not math.isfinite(result):
raise ValueError("non-finite number: " + name)
return result
def electrical(source_v, load_v, load_ohm):
"""Resistive, quasi-static snapshot; meter loading is neglected."""
vs, vl, rl = (number(source_v, "source_v"), number(load_v, "load_v"),
number(load_ohm, "load_ohm"))
if not (0 < vs <= 3.45 and 0 <= vl <= vs and 9.5 <= rl <= 105):
raise ValueError("voltage/resistance outside analysis envelope")
current = vl / rl
drop = vs - vl
return {
"current_a": current, "load_power_w": vl * current,
"series_drop_v": drop, "series_power_w": drop * current,
"apparent_series_ohm": drop / current if current >= 0.001 else None,
"voltage_ratio": vl / vs,
}
def cold_budget(load_ohm, fuse_ohm, supply_v=3.3):
"""Algebra only: not a temperature or time-to-trip prediction."""
rl, rf, vs = (number(load_ohm, "load"), number(fuse_ohm, "fuse"),
number(supply_v, "supply"))
if rl <= 0 or rf < 0 or not (0 < vs <= 3.45):
raise ValueError("invalid cold budget")
total = rl + rf
if not math.isfinite(total) or total <= 0:
raise ValueError("cold budget resistance sum is not finite-positive")
current = vs / total
result = {"current_a": current, "load_power_w": current * current * rl,
"fuse_power_w": current * current * rf}
if not all(math.isfinite(value) for value in result.values()):
raise ValueError("cold budget result is not finite")
return result
def analyze(rows):
"""Validate the whole input before returning any report."""
runs = []
seen = set()
current = None
previous_t = None
low_start = None
for index, raw in enumerate(rows, 2):
if set(raw) != set(FIELDS) or None in raw.values():
raise ValueError("row %d: missing/extra CSV fields" % index)
ident = raw["run_id"].strip()
phase = raw["phase"].strip()
if not ident or phase not in ("baseline", "overload", "recovery"):
raise ValueError("row %d: run_id/phase invalid" % index)
t, vs, vl, skew, rl, ambient, cooldown = (
number(raw[k], k) for k in
("t_s", "source_v", "load_v", "pair_skew_s", "load_ohm",
"ambient_c", "cooldown_s"))
mode = raw["supply_mode"].strip().upper()
if not (0 <= t <= 30 and 0 <= skew <= 30 and 0 <= cooldown <= 86400
and -40 <= ambient <= 85 and 0 <= vs <= 3.45
and 0 <= vl <= 3.45 and mode in ("CV", "CC", "UNKNOWN")):
raise ValueError("row %d: invalid time/voltage/mode/temperature" % index)
expected = (9.5, 10.5) if phase == "overload" else (95, 105)
if not expected[0] <= rl <= expected[1]:
raise ValueError("row %d: wrong load for this phase" % index)
identity = (phase, rl, ambient, cooldown)
if current is None or ident != current["run_id"]:
if ident in seen:
raise ValueError("a run must be contiguous, not revisited")
seen.add(ident)
current = {"run_id": ident, "phase": phase, "load_ohm": rl,
"ambient_c": ambient, "cooldown_s": cooldown,
"samples": [], "first_low_pair_observed_at_s": None,
"interpretation": "no qualified low-ratio pair recorded"}
runs.append(current)
current["_identity"] = identity
previous_t = None
low_start = None
elif current["_identity"] != identity:
raise ValueError("run metadata changed; start a new run_id")
if previous_t is not None and t <= previous_t:
raise ValueError("elapsed times must increase strictly within each run")
reasons = []
if mode != "CV":
reasons.append("supply_not_confirmed_CV")
if not 3.15 <= vs <= 3.45:
reasons.append("source_voltage_outside_window")
if vl > vs:
reasons.append("load_above_source")
if skew > 0.25:
reasons.append("reading_pair_skew")
if not 20 <= ambient <= 26:
reasons.append("ambient_outside_trial_window")
calc = None
if vs > 0 and vl <= vs:
calc = electrical(vs, vl, rl)
if calc["current_a"] > 0.30:
reasons.append("inferred_current_above_trial_limit")
valid = not reasons
gap = previous_t is not None and t - previous_t > 2.0
low = valid and phase == "overload" and calc["voltage_ratio"] <= 0.20
if not low or gap:
low_start = None
if low:
if low_start is None:
low_start = t
if t - low_start >= 1.0 and current["first_low_pair_observed_at_s"] is None:
current["first_low_pair_observed_at_s"] = t
current["interpretation"] = "observed low-ratio pair; cause needs review"
current["samples"].append({
"t_s": t, "accepted_for_pair": valid, "rejection_reasons": reasons,
"gap_from_previous": gap, "calculated": calc,
"pair_skew_s": skew, "supply_mode": mode, "notes": raw["notes"],
})
previous_t = t
for run in runs:
del run["_identity"]
run["last_observation_s"] = run["samples"][-1]["t_s"]
run["observed_to_30_s"] = run["last_observation_s"] == 30
return {"scope": "manual observations; no power control or thermal prediction",
"hardware_tested_by_author": False, "runs": runs}
def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("csv_path")
args = parser.parse_args(argv)
try:
with open(args.csv_path, newline="", encoding="utf-8-sig") as stream:
reader = csv.DictReader(stream)
if reader.fieldnames != list(FIELDS):
raise ValueError("CSV header/order must exactly match the worksheet")
report = analyze(reader)
if not report["runs"]:
raise ValueError("worksheet is empty; no observations to analyze")
encoded = json.dumps(report, indent=2, allow_nan=False)
except (OSError, ValueError, csv.Error) as error:
print("Refused: " + str(error), file=sys.stderr)
return 2
print(encoded)
return 0
if __name__ == "__main__":
raise SystemExit(main())
What has actually been checked
The delivered analyzer passes 29 actual host test groups, including voltage/power identities, resistor tolerances, maximum series-power location, extreme numerical overflow refusal, interrupted observation sequences, CC/source-collapse rejection, skew, run boundaries, time order, malformed data and the real command-line CSV path. Constructed adversarial inputs exercise the supplied functions and report path; they are not fuse measurements. Separate package checks verify complete code inline, working local links, empty worksheets and readable source assets. Independent electrical and actual desktop/mobile browser review remain separate gates.
There is no firmware here to compile, no target-board execution and no physical test claimed. Resistance is temperature-dependent, power-resistor heating can move nearby ambient conditions, and meter timing/error limits the inference. No software test establishes a safe protection design for a different load, battery chemistry or fault energy. The manufacturer's ratings and application qualification remain necessary.
Challenge: the load voltage fell, but the supply did too
Two readings show Vsource = 1.0 V, Vload = 0.1 V and CC on the supply. The ratio is below 0.20. Does this demonstrate a PPTC trip? And would a 30-second record with no qualifying pair prove the device is defective?
Show the reasoning
No. The supply is current-limiting and its voltage is outside the accepted window, so those samples cannot support this classifier’s event. Stop and diagnose without increasing the limit. No qualifying pair also does not prove a defective part: the low-voltage fixture may not provide the thermal conditions needed for a sustained transition, a brief change may be missed, or the initial history/ambient may differ. Preserve the observations and compare the complete conditions with the manufacturer’s data rather than declaring an instantaneous current threshold.
Primary references and next steps
- Bourns MF-R Series, revision AR, September 2026: exact electrical row, conditions, mechanical outline, derating, typical curves, ordering and application notice.
- Bourns MF-R product family: current manufacturer entry. No separate part errata was linked in the reviewed entry; this is a bounded source check, not proof none exists.
- Vishay document 28730, revision 05-Dec-2024: AC01/AC05 ordering, power/ambient limits, mounting and derating.
- Python 3.12 CSV documentation: table parsing used by the host analyzer.
For a related voltage-budget experiment, see MCP1700 supply dropout. Both lessons separate a calculated budget from a measurement. Here the next useful improvement is better timestamped voltage observation and documented ambient/history—not a higher-energy fault.