Hipot and Dielectric Withstand Testing with TofuPilot
Hipot (high-potential) testing verifies that a product's electrical insulation can withstand voltage stress without breakdown. It's required by UL, IEC, and most safety standards for any product connected to mains power. TofuPilot logs every hipot result for production traceability and compliance.
What Hipot Testing Verifies
Hipot testing applies a high voltage between isolated circuits (typically line-to-ground or primary-to-secondary) and measures the leakage current. If current stays below the threshold and no breakdown occurs, the insulation is adequate.
| Parameter | Typical value | Standard |
|---|---|---|
| Test voltage (AC) | 1000-3000 Vrms | IEC 60950, IEC 62368 |
| Test voltage (DC) | 1414-4243 Vdc | IEC 60601 (medical) |
| Duration | 1-60 seconds | Varies by standard |
| Leakage current limit | 0.5-10 mA | Varies by product class |
| Ramp time | 0.5-3 seconds | Prevents voltage spikes |
Automating Hipot Tests
Connecting to a Hipot Tester
Most programmable hipot testers (Chroma, Associated Research, GW Instek) support SCPI commands over GPIB, RS-232, or LAN.
import pyvisa
from tofupilot import TofuPilotClient
rm = pyvisa.ResourceManager()
hipot = rm.open_resource("GPIB::5::INSTR")
client = TofuPilotClient()
def run_hipot_test(serial, test_voltage_v=1500, duration_s=60, leakage_limit_ma=5.0):
# Configure hipot tester
hipot.write(f"VOLT {test_voltage_v}")
hipot.write(f"TIME {duration_s}")
hipot.write(f"CURR:LIM {leakage_limit_ma}")
hipot.write("RAMP 2") # 2 second ramp
# Run test
hipot.write("TEST")
hipot.query("*OPC?") # Wait for completion
# Read results
result = hipot.query("MEAS:RES?") # "PASS" or "FAIL"
leakage = float(hipot.query("MEAS:CURR?")) * 1000 # Convert to mA
passed = result.strip() == "PASS"
client.create_run(
procedure_id="HIPOT-SAFETY-TEST",
unit_under_test={"serial_number": serial},
run_passed=passed,
steps=[{
"name": "Dielectric Withstand",
"step_type": "measurement",
"status": passed,
"measurements": [
{"name": "test_voltage_v", "value": test_voltage_v, "unit": "V"},
{"name": "duration_s", "value": duration_s, "unit": "s"},
{"name": "leakage_current_ma", "value": leakage, "unit": "mA", "limit_high": leakage_limit_ma},
{"name": "breakdown", "value": 0 if passed else 1, "unit": "bool", "limit_high": 0},
],
}],
)
hipot.write("VOLT 0") # Discharge
return passedMulti-Point Hipot Testing
Some products require hipot tests between multiple isolation boundaries.
# Test multiple isolation boundaries
isolation_tests = [
{"name": "Line-to-Ground", "voltage": 1500, "limit_ma": 5.0},
{"name": "Line-to-Secondary", "voltage": 3000, "limit_ma": 5.0},
{"name": "Secondary-to-Ground", "voltage": 500, "limit_ma": 1.0},
]
steps = []
for test in isolation_tests:
# Configure and run each test
leakage = run_hipot_measurement(test["voltage"])
passed = leakage < test["limit_ma"]
steps.append({
"name": test["name"],
"step_type": "measurement",
"status": passed,
"measurements": [
{"name": f"voltage_{test['name'].lower().replace('-', '_')}", "value": test["voltage"], "unit": "V"},
{"name": f"leakage_{test['name'].lower().replace('-', '_')}", "value": leakage, "unit": "mA", "limit_high": test["limit_ma"]},
],
})
all_pass = all(s["status"] for s in steps)
client.create_run(
procedure_id="HIPOT-MULTI-POINT",
unit_under_test={"serial_number": serial},
run_passed=all_pass,
steps=steps,
)Leakage Current Trending
Even for passing units, track leakage current over production. A healthy process shows consistent leakage values. Changes indicate:
| Trend | Possible cause |
|---|---|
| Gradual increase | Contamination buildup on PCB, flux residue |
| Step increase | New board revision, different conformal coating |
| High variance | Inconsistent manufacturing (solder splash, debris) |
| Bimodal distribution | Two different PCB suppliers or manufacturing lines |
TofuPilot's measurement histogram for leakage current shows these patterns across your production.
Compliance Records
Safety agencies require per-unit hipot test records. TofuPilot stores:
- Serial number of the tested unit
- Test voltage applied
- Duration of the test
- Measured leakage current
- Pass/fail result
- Timestamp
- Station/tester identification
When an auditor asks for hipot records for a specific serial number or date range, pull them from TofuPilot in seconds.
Safety Considerations
Hipot testing involves lethal voltages. Always:
- Use proper safety interlocks on the test fixture
- Ensure the DUT is fully discharged after the test
- Never bypass safety mechanisms on the hipot tester
- Log test equipment calibration dates
- Train operators on hipot safety procedures
TofuPilot is the data management layer. The safety of the test setup is your responsibility.
Ground Continuity Testing
Ground continuity is often tested alongside hipot. It verifies that the safety ground connection has low enough resistance to carry fault current.
# Ground continuity test (typically 25A for 2 seconds)
ground_resistance = measure_ground_resistance(current_a=25, duration_s=2)
client.create_run(
procedure_id="GROUND-CONTINUITY",
unit_under_test={"serial_number": serial},
run_passed=ground_resistance < 0.1,
steps=[{
"name": "Ground Bond",
"step_type": "measurement",
"status": ground_resistance < 0.1,
"measurements": [
{"name": "ground_resistance_ohm", "value": ground_resistance, "unit": "ohm", "limit_high": 0.1},
{"name": "test_current_a", "value": 25, "unit": "A"},
],
}],
)Most safety test workflows run ground continuity first, then hipot. If the ground bond is bad, there's no point running the hipot test. TofuPilot links both results to the same serial number for a complete safety test record.