Set a Toshiba TLP291’s input current to about 1 mA. On its output side, use a 5 V supply and first fit 27 kΩ, then 1 kΩ. Measure the collector voltage in both runs. The resistor changes how much output current is required to pull the collector near ground. Reading current and voltage together shows where the actual specimen settles.
An optocoupler transfers a signal by light inside its package. Its input is an infrared light-emitting diode (LED), and its output is a phototransistor, a transistor that conducts in response to light. In this circuit the transistor’s collector receives current through a resistor, and its emitter returns that current to ground. The collector-emitter voltage, written VCE, is the voltage across those two terminals. This fixture joins the supply returns for a common low-voltage reference.
This is a proposed direct-current (DC) bench experiment. The voltages in the worked example are constructed. The blank worksheet is for your own observations.
Use Toshiba TLP291(GB-TP,SE, the GB selection in the four-lead small-outline package, SO4. The manufacturer’s Rev. 3.0 data sheet, dated September 30, 2026, gives this exact order string on page 13. The product order table also lists it. Toshiba sorts parts by current transfer ratio (CTR), which expresses collector current divided by LED current as a percentage under a stated test condition. GB is the rank used in this lab.
Match the pin-1 mark to the orientation drawing on pages 1 and 14. Toshiba’s functional symbol labels pin 1 anode, pin 2 cathode, pin 3 emitter, and pin 4 collector. The anode and cathode are the positive and return terminals of the forward-driven LED. Use a plain SO4 adapter whose land pattern fits Toshiba package 11-3C1. Follow each solder pad to its header with the part unpowered. The case uses P291 as the device-family abbreviation and shows a separate rank mark. Keep the purchase or reel label that confirms the exact GB orderable.
| SO4 pin | Connection |
|---|---|
| 1, anode | S1 positive through the measured 3.9 kΩ input resistor R1. |
| 2, cathode | Common 0 V and S1 negative. |
| 3, emitter | Common 0 V and S2 negative. This is the black probe point for VCE. |
| 4, collector | S2 positive through the chosen load RL. This is the red probe point for VCE. |
The collector resistor is a pull-up. It brings the collector toward the output supply when the transistor conducts very little. As the transistor conducts, the same resistor sets how much current flows for a given collector voltage. At the 5.05 V top of the worksheet supply range, a 980 Ω load permits at most about 5.15 mA and dissipates up to about 26 mW. These are arithmetic bounds for the fixture. The chosen ¼ W resistor has ample margin. At the input, 5.50 V through 3.8 kΩ allows at most about 1.45 mA even with zero voltage across the diode. Leave both current limits active and change load resistors with both outputs off.
off_27k. Keep the LED current near zero and record the actual supply and collector voltages.on_27k. Recheck the input drop after moving the probes if the supply drifted.off_1k and on_1k. Retune and record the actual LED current so both on runs are close to 1.00 mA. Check both supply limits and let the readings settle.The input resistor drop gives the LED current with no current meter inserted in series. For the output, keep the reference at the emitter. Compute load current from the voltage drop between the measured S2 positive terminal and the collector. The result includes the small current drawn by the meter when it is across the collector and emitter. Fluke gives a nominal 10 MΩ voltage input. A 5 V collector can therefore draw about 0.5 µA through the meter. With 27 kΩ and an off transistor that alone can produce about 13.5 mV across the load in a simple model. Treat the off rows as circuit controls. They cannot separate the instrument current from the device’s dark current.
Apply Ohm’s law to the measured input resistor drop, VR1, to get IF = VR1 ÷ R1. Calculate the collector-load current as IL = (VS2 − VCE) ÷ RL. Express the measured load-to-LED ratio as 100 × IL ÷ IF percent for the on cases. The load line is that straight-line relation between collector voltage and load current for a fixed supply and resistor. The actual collector voltage also depends on how much current the illuminated transistor conducts.
For a 5.00 V supply and an illustrative collector voltage of 0.30 V, the 27 kΩ load asks for about 0.174 mA. The 1 kΩ load asks for 4.70 mA at the same collector voltage. Increasing the requested current can leave the collector higher, even though the LED bias stays close to 1 mA. Read the actual voltage for each load. A high-gain specimen can behave differently from the constructed example.
| Toshiba Rev. 3.0 at 25 °C | Test conditions | GB limit |
|---|---|---|
| Current transfer ratio | LED current 5 mA, VCE 5 V | 100–600% |
| Saturated current transfer ratio | LED current 1 mA, VCE 0.4 V | 30% minimum for the listed ranks including GB |
| Collector-emitter saturation voltage | Collector current 0.2 mA, LED current 1 mA | 0.3 V maximum for the listed ranks including GB |
Saturation here describes operation at a low collector-emitter voltage when the output circuit asks the transistor to carry a given current. Toshiba’s 0.3 V limit uses a controlled 0.2 mA collector current. At 5.00 V and 0.30 V, the 27 kΩ load asks for slightly less than that reference current. The 1 kΩ load asks for much more. Our resistor circuit lets VCE settle freely, the input is only approximately 1 mA, and the bench temperature may differ from 25 °C. Use the three data-sheet rows as comparisons and retain the conditions on each result. In particular, the 5 mA and 5 V CTR range cannot predict a load-limited ratio at this bench point.
| Load | VCE | Load current | Load-to-LED ratio |
|---|---|---|---|
| 27.0 kΩ | 0.200 V | 0.1778 mA | 17.78% |
| 1.000 kΩ | 3.400 V | 1.600 mA | 160.0% |
In those constructed readings the 27 kΩ run has a lower ratio and a lower collector voltage. It needs less current to reach the low-voltage region. The 1 kΩ run passes more current and still leaves most of the 5 V across the transistor. For a real sheet, report both values for each load and the actual measured LED bias. On the 6.000 V range the meter’s 1 mV resolution and DC accuracy both affect a small difference between two readings. At 5 V, Fluke’s ±(0.05% of reading + one count) specification is about ±3.5 mV under its manual conditions. A tiny inferred off current can be comparable to the combined uncertainty of the two voltages.
Fill a copy of the blank worksheet. The columns are case, measured led_resistor_ohm, measured led_resistor_v across R1, measured load_ohm, measured output_supply_v, and measured vce_v. Enter numeric values without unit symbols. Include all four cases exactly once per sheet. Keep the meter and approximate ambient temperature with your notes.
Save the complete program as tlp291_load.py. Use Python 3.9 or later and run python3 tlp291_load.py observations.csv. Try constructed-examples.csv to reproduce the arithmetic. Output is comma-separated values (CSV). The program reports load current at the measured point, the load-line current at the 0.30 V reference, and the observed voltage band. It leaves the ratio blank for off rows. The voltage band is a worksheet description of the measured voltage.
The input screen expects a 4.95–5.05 V output supply, the intended resistor ranges, on current from 0.98 to 1.02 mA, and off current from zero to 0.010 mA. A reading outside the measured rail, invalid number, missing case or wrong load stops the calculation. Correct the worksheet or check the fixture before rerunning.
"""Calculate TLP291 LED and collector-load currents from steady voltages."""
import argparse
import csv
import math
from pathlib import Path
import sys
INPUT = (
"case", "led_resistor_ohm", "led_resistor_v", "load_ohm",
"output_supply_v", "vce_v",
)
CASES = ("off_27k", "on_27k", "off_1k", "on_1k")
OUTPUT = (
"case", "led_current_ma", "load_current_ma", "vce_v",
"effective_load_to_led_pct", "load_current_at_0p3v_ma", "vce_band",
)
def number(row, key):
raw = row[key]
if raw is None or not raw.strip():
raise ValueError(f"{key} is required")
try:
value = float(raw)
except ValueError:
raise ValueError(f"{key} must be a number") from None
if not math.isfinite(value):
raise ValueError(f"{key} must be finite")
return value
def analyze(row):
case = row["case"]
if case not in CASES:
raise ValueError("unknown case")
r_led, v_led_resistor, load, supply, vce = (
number(row, key) for key in INPUT[1:]
)
if not 3800 <= r_led <= 4000:
raise ValueError("led_resistor_ohm is outside the 3.9 kΩ fixture band")
low, high = (26500, 27500) if case.endswith("27k") else (980, 1020)
if not low <= load <= high:
raise ValueError(f"load_ohm does not match {case}")
if not 4.95 <= supply <= 5.05:
raise ValueError("output_supply_v is outside 4.95–5.05 V")
if not 0 <= vce <= supply:
raise ValueError("vce_v must be within the measured output rail")
led_ma = 1000 * v_led_resistor / r_led
load_ma = 1000 * (supply - vce) / load
at_reference_ma = 1000 * (supply - 0.300) / load
ratio = ""
band = "off_reference"
if case.startswith("on_"):
if not 0.98 <= led_ma <= 1.02:
raise ValueError("ON rows require 0.98–1.02 mA LED current")
ratio = f"{100 * load_ma / led_ma:.3f}"
band = "at_or_below_0p3_v" if vce <= 0.300 else "above_0p3_v"
elif not 0 <= led_ma <= 0.010:
raise ValueError("OFF rows require 0–0.010 mA LED current")
return (case, f"{led_ma:.6f}", f"{load_ma:.6f}", f"{vce:.3f}",
ratio, f"{at_reference_ma:.6f}", band)
def read_results(stream):
reader = csv.DictReader(stream, strict=True)
if reader.fieldnames != list(INPUT):
raise ValueError("CSV header must be " + ",".join(INPUT))
results = {}
for row in reader:
try:
if None in row:
raise ValueError("too many columns")
result = analyze(row)
case = result[0]
if case in results:
raise ValueError(f"duplicate case {case}")
results[case] = result
except ValueError as exc:
raise ValueError(f"row {reader.line_num}: {exc}") from exc
missing = [case for case in CASES if case not in results]
if missing:
raise ValueError("missing case: " + ", ".join(missing))
return [results[case] for case in CASES]
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("sheet", help="worksheet CSV path or - for standard input")
args = parser.parse_args()
try:
if args.sheet == "-":
results = read_results(sys.stdin)
else:
with Path(args.sheet).open(encoding="utf-8-sig", newline="") as stream:
results = read_results(stream)
except (OSError, UnicodeError, csv.Error, ValueError) as exc:
parser.exit(2, f"{exc}\n")
writer = csv.writer(sys.stdout, lineterminator="\n")
writer.writerow(OUTPUT)
writer.writerows(results)
if __name__ == "__main__":
main()
A separate experiment uses a VO617A with changing input pulses. Its reader studies pulse edges and timing. UNO Optocoupled Pulses
At 5.00 V, what load resistance would demand 0.20 mA at a collector voltage of 0.30 V? If you choose 27 kΩ, what is the difference in requested current at that reference voltage?
(5.00 − 0.30) V ÷ 0.00020 A gives 23.5 kΩ. With 27 kΩ the load requests about 0.174 mA, or about 0.026 mA less. This calculation locates two points on two resistor load lines. The real collector voltage still needs a measurement.
Download the experiment files (ZIP). Includes the complete Python program, host tests, blank and constructed worksheets, original schematic and full-size image.