Integrated Circuits · Local preparation

TPS22919: Switching a Sensor OFF Does Not Remove Every Power Path

Local preparation candidate. Original functional and model diagrams and full code are included. See the dated validation/review records for acceptance scope. No publication or hardware result is claimed.

An OFF command can disconnect the intended supply and still leave a load partly powered through another wire. Build a small resistor-and-capacitor fixture around the Texas Instruments (TI) TPS22919DCKR load switch, then add one explicit alternate path. Compare output discharge with the voltage that the alternate path sustains. A real sensor is deliberately absent: first understand the power paths without risking an unknown input structure.

A load switch connects or disconnects a supply; it does not regulate the output voltage. Quick Output Discharge (QOD) is a separate path that drains the output capacitor when the switch is off. Here the integrated circuit (IC) is in the six-lead SC-70 surface-mount package, TI package code DCK. Use a passive adapter that exposes its individual pins. A module with unknown extra resistors or indicator lights is a different circuit.

This is a proposed low-voltage experiment with a host-tested analytical calculator. No assembly, physical waveform, measured leakage, firmware build or target execution is claimed. The calculator produces constructed examples. Keep the input supply live during the OFF comparisons; reverse-current blocking and removal of the input supply are outside this experiment.

1. What each part teaches

The original RP2040 Raspberry Pi Pico supplies the common nominal 3.3 V rail from its Universal Serial Bus (USB) connection. No general-purpose input/output (GPIO) pin is connected, and no Pico program is required. S1 is a manual single-pole, single-throw (SPST) contact that commands ON. Its external 10 kΩ pull-down gives a defined LOW when the contact opens. S2 separately connects an always-powered path through a resistor and a diode. Turning S1 off does not turn S2 off.

R_LOAD represents a modest load. C_OUT represents stored charge at its supply. R_QOD limits the external discharge branch; J1 selects that branch only while power is disconnected. D1 is an ordinary diode, conducting toward VOUT when its anode is sufficiently above its cathode. Its black band identifies the cathode. This explicit component illustrates a possible signal-protection-like path; it is not a claimed schematic of every sensor's internal protection.

Use volts (V) for potential difference, amperes (A) and milliamperes (mA) for current, ohms (Ω) and kilohms (kΩ) for resistance, farads (F) and microfarads (µF) for capacitance, milliseconds (ms) for time, and joules (J) or microjoules (µJ) for energy. A digital multimeter (DMM) reads steady node voltages; an oscilloscope is needed to resolve these short discharge curves.

2. Exact circuit and power ownership

Pico physical pin 36 powers TPS22919DCKR IN pin 1 and both manual contacts; physical pin 38 joins GND pin 2 and every passive return. S1 commands ON pin 3 with a 10 kΩ pull-down. Pin 6 supplies a 10 kΩ load and 10 µF capacitor. Pin 5 connects through 1 kΩ and J1 to VOUT. The alternate path uses S2, 10 kΩ and a 1N4148 diode with its cathode at VOUT. Pin 4 is open.
Original functional schematic, with logical pin positions rather than adapter geometry. The ON-wire arch crosses the input-capacitor branch without joining it. Both contacts and J1 are drawn open. Open the full-size circuit or download the editable Scalable Vector Graphics (SVG) original.
Terminal or componentConnection and purpose
Pico physical 36 / physical 383V3_OUT to VIN; GND to the single common return. USB is the only power input.
U1 pin 1 IN / pin 2 GNDVIN and common return; C_IN = 1 µF directly between these pins.
U1 pin 3 ONS1 from VIN to ON; R_ON = 10 kΩ from ON to GND.
U1 pin 4 NCNo-connect: leave floating. Do not use it as a ground tie.
U1 pin 6 VOUTOutput node VO; R_LOAD = 10 kΩ and C_OUT = 10 µF each return independently to GND.
U1 pin 5 QODR_QOD = 1 kΩ followed by J1 to VOUT. J1 open disables this branch, while the 10 kΩ load still discharges the capacitor.
S2 alternate branchVIN → S2 → R_SIG = 10 kΩ → VA → D1 anode; D1 cathode → VO.

Use ±1% resistors rated at least 0.125 W. Use nonpolar X7R ceramic capacitors rated at least 10 V; X7R describes a ceramic dielectric class, not a promise of exact capacitance under voltage. Measure effective capacitance if comparing timing. D1 is Vishay 1N4148-TAP in the axial DO-35 package; TAP specifies taped ammopack delivery, not a different diode voltage. Place C_IN close to pins 1 and 2, and keep the output discharge loop short. The drawing separates parts for reading, not to prescribe long physical wires.

Before inserting U1, identify the adapter's orientation against the manufacturer's top view and check every pad-to-header route with continuity. An adapter's header order is not standardized. The six functions above refer to the chip pins, not guessed breadboard positions. Check for shorts between adjacent pads, and inspect D1's band. Probe VIN, VA, VO and VQOD at the actual component terminals.

TI's recommended input range is 1.6–5.5 V; ON HIGH begins at 1 V and LOW ends at 0.35 V. The pin-voltage absolute range of −0.3 to 6 V is a stress limit, not an operating target. This fixture uses one nominal 3.3 V domain. Do not introduce 5 V signals, a second powered source, output shorts or a real sensor. Keep VOUT within the live VIN rail. The 1.5 A headline is not a breadboard, adapter or USB power rating.

3. Follow current instead of trusting the switch position

With S1 closed and S2 open, current goes from Pico 3V3_OUT through U1 to R_LOAD. The capacitor charges as well, so initial current can exceed the later resistor current. A controlled output rise spreads that charge over time. The relation I_C = C × dV/dt explains why a larger capacitor matters, but it does not establish this assembly's actual rise time. Do not apply a typical timing number from a different load directly to the 10 µF fixture.

With S1 open and S2 open, the load drains the capacitor. Installing J1 adds the QOD discharge branch. R_QOD is in series with the internal discharge path; both branches finally return to the common ground. An open J1 does not leave this output floating because R_LOAD remains present.

Now close S2 while S1 stays open. Once the output has fallen far enough, current can flow through R_SIG and D1 into VO, then return through R_LOAD and, with J1 installed, through QOD. That loop bypasses the supply switch. A lower resulting voltage can still bias a real circuit unpredictably; this article defines no universal “unpowered” threshold for a sensor. Disconnecting, tri-stating or otherwise isolating each real interface requires that interface's documentation and separate qualification.

At the assumed 3.3 V rail, the steady 10 kΩ load draws approximately 0.33 mA while ON. The side branch cannot exceed approximately 3.3 V / 9.9 kΩ = 0.333 mA with a 1% resistor, even before accounting for D1. The initial external discharge branch is similarly bounded by approximately 3.3 V / 990 Ω = 3.33 mA if its other series resistance is nonnegative. These are calculations at an assumed rail, not guaranteed supply tolerances or a newly invented QOD sink-current specification.

4. A constructed model with a visible boundary

For the no-side-feed case, combine the load and discharge branches in parallel. The resistance-capacitance (RC) time constant describes an ideal exponential. Use TI's 24 Ω typical internal QOD resistance only as a model assumption; it is not a guaranteed 3.3 V value or a tolerance range. The capacitor's actual effective value, wiring, probes and semiconductor behavior change the observed curve.

J1 open:    R_OFF = 10,000 Ω
J1 closed:  R_OFF = 10,000 Ω || (1,000 Ω + 24 Ω) ≈ 928.88 Ω
τ = R_OFF × C_OUT
No side-feed: VOUT(t) = VOUT(0) × exp(−t/τ)
t90→10 = ln(9) × τ
For C_OUT = 10 µF:
J1 open: τ = 100 ms; t90→10 ≈ 219.72 ms
J1 closed: τ ≈ 9.289 ms; t90→10 ≈ 20.41 ms
Initial stored energy = ½ × 10 µF × (3.3 V)² = 54.45 µJ

For the alternate path, the calculator assumes a constant diode drop of 0.6 V solely to expose the mechanism. It is not a specified 1N4148 voltage at these small currents. The diode initially blocks because the charged output is near VIN. The model first follows the no-feed decay until VO reaches E = VIN − VF. Only then does it connect the idealized feed branch. Treating that branch as active from time zero would incorrectly permit reverse current through the model diode.

After the model diode begins conducting:
G_SINK = 1/R_LOAD + [1/(R_QOD + R_INTERNAL) if J1 is closed]
V_EQ = (E/R_SIG) / (G_SINK + 1/R_SIG)
τ_FEED = C_OUT / (G_SINK + 1/R_SIG)
VOUT(t) approaches V_EQ, not necessarily zero.
With E = 3.3 − 0.6 = 2.7 V:
J1 open: V_EQ = 1.35 V
J1 closed: V_EQ ≈ 0.230 V
Four constructed OFF curves start at 3.3 V. Without side-feed, a 10 kΩ load discharges slowly and the additional QOD branch discharges faster. With the modeled side-feed diode, the output approaches 1.35 V with J1 open or approximately 0.230 V with J1 closed. All curves keep VIN live.
Constructed curves from the delivered calculator, not measured switch waveforms. Fixed diode drop and internal QOD resistance are assumptions; the real device and effective capacitance must be characterized. Open the full-size graph or download the editable original.

A stronger discharge path can suppress this small alternate supply without proving that every other path is harmless. The model therefore reports a no-side-feed 90-to-10 time only when the side-feed is disabled. In the open-J1 side-feed example the plateau exceeds 10% of 3.3 V, so that ordinary decay-time calculation cannot describe a fall to 0.33 V.

5. Complete host calculator and signed reading arithmetic

Save tps22919-off-backpower.py and run python3 tps22919-off-backpower.py with Python 3. It prints four explicitly constructed summaries and performs no hardware access. The entire program follows. Its range checks constrain this fixture; in particular, internal_qod from 0 to 1000 Ω is an accepted model-input interval, not TI's specified spread. The default 24 Ω is illustrative.

"""Host-only TPS22919 fixture calculator; no hardware I/O or measurements.

OFF model: live VIN, fixed diode drop, ideal resistor/capacitor, optional
QOD resistance. The 24-ohm internal value is an assumption, not a bound.
Measured-node arithmetic is separate and retains signed residuals.
"""
import json
import math


def number(value, name, low, high):
    if type(value) not in (int, float):
        raise ValueError(name + ": a finite number is required")
    try:
        value = float(value)
    except (OverflowError, ValueError):
        raise ValueError(name + ": outside the fixture range")
    if not math.isfinite(value) or not low <= value <= high:
        raise ValueError(name + ": outside the fixture range")
    return value


def flag(value, name):
    if type(value) is not bool:
        raise ValueError(name + ": an explicit bool is required")
    return value


def parameters(vin=3.3, capacitance=10e-6, r_load=10000.0,
               r_signal=10000.0, r_qod=1000.0, internal_qod=24.0,
               diode_drop=0.6, qod_connected=False, sidefeed=False):
    """Restricted model inputs, not guaranteed component tolerances."""
    p = dict(vin=number(vin, "vin", 3.0, 3.6),
             capacitance=number(capacitance, "capacitance", 1e-7, 1e-4),
             r_load=number(r_load, "r_load", 9900, 10100),
             r_signal=number(r_signal, "r_signal", 9900, 10100),
             r_qod=number(r_qod, "r_qod", 990, 1010),
             internal_qod=number(internal_qod, "internal_qod", 0, 1000),
             diode_drop=number(diode_drop, "diode_drop", 0.1, 1.0),
             qod_connected=flag(qod_connected, "qod_connected"),
             sidefeed=flag(sidefeed, "sidefeed"))
    conductance = 1.0 / p["r_load"]
    if p["qod_connected"]:
        conductance += 1.0 / (p["r_qod"] + p["internal_qod"])
    p["g_sink"] = conductance
    return p


def off_voltage(t_s, initial=3.3, **kwargs):
    """Constructed OFF transient. VIN stays live throughout this model."""
    p = parameters(**kwargs)
    t_s = number(t_s, "t_s", 0, 10)
    initial = number(initial, "initial", 0, p["vin"])
    tau = p["capacitance"] / p["g_sink"]
    if not p["sidefeed"]:
        return initial * math.exp(-t_s / tau)
    source = p["vin"] - p["diode_drop"]
    # Above source, the ideal constant-drop diode does not conduct.
    crossing = tau * math.log(initial / source) if initial > source else 0.0
    if t_s <= crossing:
        return initial * math.exp(-t_s / tau)
    start = source if crossing else initial
    total_g = p["g_sink"] + 1.0 / p["r_signal"]
    equilibrium = source / p["r_signal"] / total_g
    return equilibrium + (start - equilibrium) * math.exp(
        -(t_s - crossing) * total_g / p["capacitance"])


def model_summary(**kwargs):
    """90-to-10 time is ONLY the no-sidefeed RC result."""
    p = parameters(**kwargs)
    resistance = 1.0 / p["g_sink"]
    source = p["vin"] - p["diode_drop"]
    plateau = (source / p["r_signal"] /
               (p["g_sink"] + 1.0 / p["r_signal"])) if p["sidefeed"] else 0.0
    return dict(label="CONSTRUCTED MODEL, NOT MEASUREMENTS",
                off_resistance_ohms=resistance,
                no_sidefeed_tau_s=resistance * p["capacitance"],
                no_sidefeed_90_to_10_s=(None if p["sidefeed"] else
                    math.log(9) * resistance * p["capacitance"]),
                model_plateau_v=plateau,
                initial_capacitor_energy_j=0.5 * p["capacitance"] * p["vin"]**2)


def measured_nodes(vin, anode_v, output_v, *, feed_closed,
                   qod_connected, qod_v=None, r_signal=10000.0,
                   r_load=10000.0, r_qod=1000.0):
    """Arithmetic for operator readings with S1 open and S2 closed.

    Contact positions are operator assertions, not automatic verification.
    Residual includes capacitor/probe/other currents; it is not IC leakage.
    No 24-ohm assumption is used here. Negative differences stay visible.
    """
    if not flag(feed_closed, "feed_closed"):
        raise ValueError("This calculation requires the S2 feed contact closed")
    qod_connected = flag(qod_connected, "qod_connected")
    vin = number(vin, "vin", 3.0, 3.6)
    anode_v = number(anode_v, "anode_v", 0, vin)
    output_v = number(output_v, "output_v", 0, vin)
    rs = number(r_signal, "r_signal", 9900, 10100)
    rl = number(r_load, "r_load", 9900, 10100)
    rq = number(r_qod, "r_qod", 990, 1010)
    if qod_connected:
        qod_v = number(qod_v, "qod_v", 0, vin)
        qod_a = (output_v - qod_v) / rq
    else:
        if qod_v is not None:
            raise ValueError("Do not provide a disconnected QOD reading")
        qod_a = 0.0
    feed_a = (vin - anode_v) / rs
    load_a = output_v / rl
    return dict(feed_a=feed_a, load_a=load_a, external_qod_a=qod_a,
                diode_v=anode_v - output_v,
                unassigned_residual_a=feed_a - load_a - qod_a,
                scope="Operator readings; residual is not a leakage measurement")


def main(emit=print):
    result = {}
    for connected in (False, True):
        for feed in (False, True):
            name = "qod_" + str(connected) + "_feed_" + str(feed)
            result[name] = model_summary(qod_connected=connected, sidefeed=feed)
    emit(json.dumps(result, indent=2, sort_keys=True))
    return result


if __name__ == "__main__":
    main()

To calculate currents from operator-entered node readings, open python3 -i tps22919-off-backpower.py, then call the function below. These values are a constructed arithmetic example, not bench data:

measured_nodes(3.3, 1.95, 1.35,
               feed_closed=True, qod_connected=False)
# feed_a ≈ 0.000135; load_a = 0.000135; diode_v ≈ 0.6

With S1 open and S2 closed, feed current is (VIN − VA)/R_SIG; load current is VO/R_LOAD. With J1 closed, measure pin 5 as well: the external QOD resistor current is (VO − VQOD)/R_QOD. This calculation does not substitute 24 Ω for a measurement. It preserves negative differences as evidence of an inconsistent setup, transient, reversed reading or a path outside the assumptions.

Kirchhoff's current law (KCL) balances currents at a node, including capacitor and probe currents. Sequential manual DMM readings are not simultaneous, particularly during discharge. The function's unassigned residual is not an IC leakage measurement. TI's 2 nA typical shutdown number describes current entering VIN under its stated test condition; it does not guarantee the OFF current entering VOUT. Record instrument loading and actual measurement times instead of naming every residual “leakage.”

6. Bench procedure: establish the four cases

  1. Disconnect USB, open S1 and S2, and remove J1. Check resistor values, capacitor polarity/type, U1 adapter mapping and all returns. Leave NC pin 4 open. Do not move J1 while energized.
  2. Connect USB only. Measure VIN at pin 1 relative to pin 2, then ON pin 3. ON must be below 0.35 V with S1 open. Stop for unexpected supply, heating or a short; do not proceed by changing the model to fit it.
  3. Close S1 with S2 open. Verify ON at least 1 V, record VO, and allow the output to settle. If output behavior is unexpected, inspect the assembly before adding the alternate path.
  4. Open S1. Record ON and the final VO. For a decay waveform, connect the oscilloscope's ground to this circuit's common GND and probe VO with an appropriate high-impedance probe. Measure 90% and 10% relative to the observed starting voltage; record probe capacitance/loading. A slow DMM cannot establish a 20 ms fall time.
  5. Power off, verify discharge, install J1, and repeat the no-feed case. Compare measured curves with the model only after accounting for effective C_OUT and the assumed internal resistance.
  6. With S1 open, close S2 and let the output settle. Record VIN, VA and VO, plus VQOD with J1 installed. Use voltage differences across the known resistors for current arithmetic. The DMM's black common (COM) lead is not always at GND when directly measuring a resistor drop: identify both resistor terminals first.
  7. Power off before opening J1 and repeating the side-feed case. Check that S1 is still open, and measure ON rather than inferring it from a handle. After collecting a case, open S2 and observe whether VO changes. That reversible comparison isolates the intentionally added path.
  8. Finish with both contacts open, disconnect USB, and verify the output has discharged before changing wiring. Do not power VIN and the side branch from different sources or attempt a VIN-removed reverse-current test with this setup.

Use the blank observation worksheet; it contains headings only. Record contact positions, actual rail and resistor values, instrument settings and whether a reading was steady or transient. The companion bench log is empty because no physical experiment has been performed. A failed qualification remains a failed case; do not label the output OFF merely because the command was LOW.

7. Faults and limits worth preserving

If S1 is open but ON is high, suspect a wiring error or leakage into the command node. If the no-feed output stays high, inspect S2, capacitor discharge, adapter routes and other attached equipment. If installing J1 makes little difference, check its continuity and R_QOD before assuming a device fault. If VO exceeds VIN, stop: that is outside the bounded model, not something to hide by clipping a number.

The calculator rejects nonfinite numbers, wrong contact-flag types and out-of-fixture values. It does not read contacts, identify a board or verify wiring. The host regression tests exercise its actual functions, including diode blocking, continuity, KCL, signed readings and rejected inputs. They are software checks, not a switch characterization. No firmware binary is needed for this passive experiment.

The current TPS22919 product documents were checked and the served datasheet is SLVSEN5B, revision B. No separate errata document was identified in that bounded documentation check; that is not a universal claim that none can exist. Similar TPS names, pin-compatible adapters and an internal protection feature do not establish interchangeable behavior. Before adapting this exercise to a real sensor, review every powered interface, power-sequencing condition and specified injection-current limit for that exact sensor.

8. Challenge

With the idealized 0.6 V diode, J1 open and both R_SIG and R_LOAD at 10 kΩ, why can OFF settle near 1.35 V? Would fitting a larger output capacitor remove that final voltage?

Show the answer

The diode-fed source is 2.7 V in this model. Equal feed and load resistors divide it in half. The capacitor changes the approach to equilibrium, not the steady resistor balance, so increasing capacitance cannot remove the alternate supply. A real measured value differs because the diode drop, meter load and other parameters are not fixed constants.

9. Primary sources and related lessons

Continue with the electronics course and its voltage-divider lesson. The present exercise applies that resistor balance to an alternate power path; a command, a measured voltage and a guaranteed unpowered state remain different things.