전자회로 입문 — 센서 입력 검증 · 프로브 부하·보상·측정 체인 · 실습
프로브를 보정하면 원래 회로가 보일까
목표
보상한 화면이 정확하다는 사실과 원래 회로를 거의 바꾸지 않았다는 사실을 분리해 검증합니다. 실제 ngspice 파일을 읽고 프로브 선택 근거를 재현하는 Python CLI를 작성합니다.
왜 중요한가
앞의 필터 응답 단원과 Python 함수·파일·복소수·list·dict·예외를 알고 시작하세요. 실습 예상은 120분입니다. 기본 60분 종료 전에 +시간으로 연장할 수 있으며 최대 180분입니다. 세션이 끝나면 파일이 사라지니 필요한 코드·보고서를 별도로 보관하세요. 이 실습은 이상적인 1V 회로 시뮬레이션만 사용하며 실제 장비·고전압·접지 연결을 다루지 않습니다.
환경과 재료
산출물은 /root/probe-loading/analyze.py입니다. Python3와 ngspice42는 이미지에 있으며 외부 다운로드나 추가 권한이 필요 없습니다. /opt/lab/fixtures/probe_loading을 sys.path에 추가하면 simulator를 import할 수 있습니다. 제공 capture(cfg,새폴더)는 회로를 실제 실행하고 그 폴더의 Path를 반환합니다. 부모 폴더는 이미 있어야 하며 기존 출력 폴더는 덮지 않습니다. input.cir·config.json·solver.log·ac.tsv·step.tsv를 남기고 실패한 새 증거도 지우지 않습니다.
회로 구조와 값은 앞 이론의 이상 모델입니다. 같은 이상 입력에서 별개의 Rs를 거쳐 참조 ref와 측정 대상 tip을 구동합니다. 두 노드 각각의 DUT는 100kΩ∥20pF입니다. 프로브는 tip 쪽에만 붙습니다. unloaded는 추가 부하 없이 meter=tip, one-x는 1MΩ∥100pF, active는 1MΩ∥1pF와 이상 meter=tip입니다. ten-x는 tip→meter에 9MΩ∥comp_pf, meter→접지에 1MΩ∥90pF가 있습니다. 표시값은 ten-x에서 meter×10, 나머지는 meter입니다.
AC 입력은 ac_v 진폭·17도 위상입니다. 계단은 0~1µs에 0V, 이후 5ns 동안 1V로 상승하고 50µs까지 유지됩니다. ac_v는 AC 해석에만 적용됩니다. active의 무한 대역폭·이상 출력은 교육용 모델이지 상용 제품 사양이 아닙니다.
설정 계약
config는 정확히 아래 5키를 가진 dict만 받습니다. 수치는 int·float만 허용하고 bool·문자열·NaN·무한대·float 변환 범위 초과는 ValueError입니다. 수치는 float, kind는 str, 보상이 없는 경우 comp_pf는 None으로 반환합니다. 입력을 수정하지 않습니다.
| 키 | 허용 값 |
| --- | --- |
| kind | unloaded, one-x, ten-x, active |
| rs_ohm | 10000 또는 50000 |
| comp_pf | ten-x이면 5,10,20; 나머지는 None만 |
| dt_s | 1.25e-9 또는 6.25e-10 |
| ac_v | 0.5,1,2 |
AC 입력과 응답 계약
read_ac는 일반 파일·최대 1MiB를 받습니다. 헤더는 공백으로 구분한 frequency v(in) v(in) v(ref) v(ref) v(tip) v(tip) v(meter) v(meter)입니다. 각 쌍은 실수부·허수부 순서입니다. 빈 줄을 무시하고 정확히 241행의 유한 float 9개를 읽습니다. 전압 성분 절댓값은 1e6 이하, 입력·ref·tip의 복소 크기는 1e-12 이상이어야 합니다. meter는 0이어도 됩니다. 주파수는 양수·엄격히 증가하고 각 i=0..240에서 10*10**(i/40)과 상대 1e-10 또는 절대 1e-9 이내로 같아야 합니다. 10Hz~10MHz의 내부 격자도 전부 확인하세요. 내용 오류는 ValueError, OS 파일 오류는 전달해도 됩니다. 반환은 9개 float tuple의 list입니다.
response는 설정을 검증하고 위 계약대로 검증된 rows를 받습니다. 행을 바꾸지 않고 같은 순서의 dict 목록을 반환합니다. R=Vref/Vin, T=Vtip/Vin, D=배율*Vmeter/Vin이라 할 때 각 필드는 다음과 같습니다.
- frequency_hz: 원 주파수.
- reference, tip, display: R,T,D의 [실수부,허수부] 목록.
- chain_error: abs(D/T−1). 단순 크기 차이가 아닌 복소 오차입니다.
- loading_error: abs(T/R−1).
- loading_gain: abs(T/R).
- loading_phase_deg: degrees(cmath.phase(T/R)). 주 위상입니다.
모델과 계단 관측 계약
transfer는 config로 설정을 검사하고 0≤freq≤1e9의 유한 수치를 받습니다. bool·문자열·범위 밖은 ValueError입니다. 이 주파수 범위는 이상 수식의 계산 영역이며 프로브의 실제 1GHz 대역폭을 뜻하지 않습니다. 시뮬레이션 파일의 격자는 위 10Hz~10MHz로 별도 제한합니다. 출력 반올림으로 10MHz 끝점이 아주 조금 커져도 유효한 AC 파일을 모델 함수가 거절하지 않게 두 계약을 구분하세요.
반환은 reference·tip·meter를 키로 하는 complex dict입니다. s=2jπf, Ydut=1/100000+s*20e-12, R=1/(1+Rs*Ydut)입니다. unloaded는 세 값 모두 R입니다. one-x·active는 Yprobe=1/1e6+s*Cprobe이며 Cprobe는 각각 100e-12,1e-12입니다. T=1/(1+Rs*(Ydut+Yprobe)), M=T입니다. ten-x는 Za=1/(1/9e6+s*comp_pf*1e-12), Zb=1/(1/1e6+s*90e-12), T=1/(1+Rs*(Ydut+1/(Za+Zb))), M=T*Zb/(Za+Zb)입니다. meter에는 표시 배율을 아직 적용하지 않습니다.
제공 load_step(path)는 일반 파일·최대 16MiB, time v(in) v(ref) v(tip) v(meter) 헤더의 5열 tuple 목록을 반환합니다. 2~200000행, 모두 유한 수치, 전압 성분 절댓값≤1e6, 시간은 0이상·엄격히 증가, 첫 시간≤1ns, 마지막은 50µs에서 1e-12초 이내입니다. 내용 오류는 ValueError입니다. 이 로더는 다시 구현할 필요가 없습니다.
observe는 설정을 검사하고 load_step을 사용해 t=1.005e-6+i*1e-8(i=0..1999)에서 ref·tip·meter를 선형 보간합니다. 정확히 같은 시각의 행은 그대로 읽고 외삽은 ValueError입니다. 반환은 reference_v·tip_v·display_v(각 2000전압 목록), grid_step_s=1e-8, observation_end_s=1.005e-6+1999*1e-8, chain_error_v=max|display−tip|, loading_error_v=max|tip−reference|, display_error_v=max|display−reference|입니다. display에만 표시 배율을 적용합니다. 이는 유한 관측 격자에서의 비교이지 연속 시간 전체 최댓값 증명이 아닙니다.
판정과 보고 계약
assess는 설정을 검증하고 정상 response 목록과 observe 보고를 받습니다. 중간 보고의 구조 검증을 반복할 필요는 없습니다. 다음 요구는 이 실습에서 선언한 설계 계약이며 산업 표준 합격선이 아닙니다.
- max_model_error: AC 241점 각각의 reference·tip·display와 transfer의 reference·tip·배율*meter 사이 복소 차이 크기의 최댓값. 단위는 이득입니다.
- model_consistent: 위 오차≤1e-8.
- chain_ok: 100kHz인 sweep[160]의 chain_error≤.01.
- loading_ok: 같은 점의 loading_error≤.02.
- step_ok: display_error_v≤.03V.
- eligible: kind가 unloaded가 아님.
- all_pass: model_consistent·chain_ok·loading_ok·step_ok·eligible가 모두 True.
analyze(value,folder)는 config, read_ac(folder/ac.tsv), response, observe(folder/step.tsv), assess를 연결합니다. 반환은 schema=1, config, sweep, step, assessment입니다. 원 설정과 파일은 보존하고 오류는 전달합니다.
조건 비교와 CLI 계약
campaign(values,runner)는 정확한 list 2~6개의 설정을 모두 먼저 검증합니다. 모든 입력 dt_s는 기본 1.25e-9여야 하며 하나라도 틀리면 runner 호출 전에 ValueError입니다. 각 조건마다 runner(기본 설정 사본)→analyze, dt_s만 6.25e-10으로 바꾼 새 설정으로 runner→analyze를 차례로 수행합니다. 한 조건을 끝낸 뒤 다음 조건으로 넘어갑니다. 원 입력은 바꾸지 않고 runner 오류는 전달합니다.
반환은 schema=1, runs, candidate_indices, scope='ideal-probe-chain-and-loaded-circuit'입니다. runs는 입력 순서대로 coarse·fine(각 analyze 보고), difference_v(세 전압 목록의 같은 시각끼리 차이 중 최댓값), converged(difference_v≤1e-5V)를 담습니다. 표시값뿐 아니라 reference_v·tip_v도 비교합니다. candidate_indices는 수렴하고 coarse·fine의 assessment.all_pass가 모두 True인 조건의 0기반 인덱스 목록입니다. 빈 후보는 정상 결과이며 실행 오류와 다릅니다.
main(argv)는 설정 목록 JSON 파일과 아직 없는 출력 폴더 경로를 받습니다. 인자 수·모든 설정·기본 dt를 확인한 뒤 새 폴더를 만듭니다. 부모는 이미 있어야 하며 기존 폴더는 거절합니다. runner 호출 순서대로 run-00,run-01,...에서 제공 capture를 실행합니다. 결과를 stdout에 유효한 JSON 한 줄로 출력하고 0을 반환합니다. 인자·설정·파일·실행 Exception에는 {"error":"analysis_failed"} 한 줄과 2를 반환하고 traceback은 출력하지 않습니다. 실패해도 이미 만든 새 증거를 지우지 않습니다. import 때는 CLI가 실행되지 않으며 직접 실행할 때만 main 반환값으로 종료합니다.
제공 /opt/lab/fixtures/probe_loading/cases.json의 여섯 조건을 다음처럼 새 이름으로 실행합니다. 보고서 리다이렉트도 기존 파일을 덮지 않는 경로로 고르세요.
python3 /root/probe-loading/analyze.py /opt/lab/fixtures/probe_loading/cases.json /root/probe-loading/trial-01 > /root/probe-loading/report-01.json단계
1. 실행 전에 프로브 조건을 검증한다: config(value)를 구현합니다. 아래 설정 계약을 검사하고 수치를 float로 바꾼 새 dict를 반환하세요. 원 입력은 보존하고 잘못된 값은 ValueError로 거절합니다.
2. 입력과 세 노드의 복소 전압을 읽는다: read_ac(path)를 추가합니다. 아래 9열·241행·주파수 격자 계약을 검사하고 float tuple 목록을 반환하세요.
3. 화면 오차와 부하 오차를 나눈다: response(value,rows)를 추가합니다. 입력으로 정규화한 reference·tip·display 및 복소 비율 오차·크기·위상을 아래 형식으로 반환하세요.
4. 프로브가 붙은 회로를 계산한다: transfer(value,freq)를 추가합니다. 이론의 부하 포함 모델에서 reference·tip·meter 전달함수를 complex 값으로 반환하세요.
5. 같은 시각에서 세 파형을 비교한다: observe(value,path)를 추가합니다. 제공 load_step으로 파형을 읽고 지정된 2000시각의 세 전압과 최대 차이를 계산하세요.
6. 모델 일치와 설계 적합성을 구분한다: assess(value,sweep,step)를 추가합니다. 전체 복소 모델 검증, 100kHz의 체인·부하 요구, 계단 요구, 후보 자격을 별도로 판정하세요.
7. 원 파일에서 분석 보고를 연결한다: analyze(value,folder)를 추가합니다. 설정·AC·계단 분석과 판정을 연결해 중간 결과까지 보존한 보고서를 반환하세요.
8. 두 정밀도와 실제 실행을 대조한다: campaign(values,runner), main(argv), CLI 진입점을 추가합니다. 설정을 모두 먼저 검증한 뒤 기본·세밀 계산의 세 노드 수렴과 양쪽 적합성을 만족하는 후보를 선택하세요.
참고
채점은 독립 수식·합성 파일을 쓰는 함수 검사와 실제 ngspice·별도 CLI 검사를 구분합니다. 학생 코드와 폴더를 바꾸지 않습니다. 기본 조건의 후보 인덱스를 하드코딩하면 다른 소스 저항·진폭·보상 조건에서 실패합니다. 이 모델로 실제 프로브의 안전 등급·접지·잡음·대역폭·온도 신뢰성을 인증할 수 없습니다.
단계 8개
- 실행 전에 프로브 조건을 검증한다
- 입력과 세 노드의 복소 전압을 읽는다
- 화면 오차와 부하 오차를 나눈다
- 프로브가 붙은 회로를 계산한다
- 같은 시각에서 세 파형을 비교한다
- 모델 일치와 설계 적합성을 구분한다
- 원 파일에서 분석 보고를 연결한다
- 두 정밀도와 실제 실행을 대조한다