시뮬레이션으로 측정 확인
한 줄 요약 — 회로를 실제로 풀어 손계산과 일치하는지 확인합니다. 워크벤치에서 예제를 고르면 브라우저가 바로 풀고,
expect에 적어 둔 값과 맞대어 보여 줍니다. 어느 한쪽만 맞으면 둘 중 하나가 틀린 것입니다.
어디서 도는가
워크벤치에서 브라우저가 직접 풉니다. 설치할 것이 없고 폰에서도 됩니다.
푸는 방법은 수정 노드 해석(modified nodal analysis) 입니다 — 2-02 노드 해석이 가르치는 그 방법 그대로입니다. 노드마다 KCL을 세우고 노드 전압을 미지수로 놓습니다. 전압원처럼 전류를 식으로 쓸 수 없는 것은 그 전류 자체를 미지수로 하나 더 추가합니다. 그것이 “수정”의 뜻입니다.
B대역폭 또는 자속밀도bandwidth or flux densityC정전용량capacitanceFD듀티비duty cyclee잡음 전압 밀도noise voltage densityV/√HzG컨덕턴스conductanceSi전류 (순시값)instantaneous currentAj허수 단위imaginary unitr저항 (소신호)small-signal resistanceΩt시간timesv전압 (순시값)instantaneous voltageV- : 노드 전압 — 우리가 알고 싶은 것
- : 전압원에 흐르는 전류 — 추가한 미지수
- : 컨덕턴스 행렬 — 저항·커패시터·인덕터가 여기 들어갑니다
부품 하나하나가 이 행렬의 몇 자리에 값을 더하는 것뿐입니다.
★ 손계산과 맞대어 보기 — 이것이 핵심입니다
시뮬레이션 결과를 그냥 믿지 않습니다. 예제마다 expect 블록에 손으로 푼 값이 적혀 있고, 워크벤치가 그것과 대조해 보여 줍니다.
expect:
- {measure: v, node: OUT, value: 1.667, tol: 1%}손계산과 맞대어 보기 2/2
✓ OUT 의 전압 — 기대 1.667 V ± 16.67 mV · 실제 1.6667 V
✓ R1 의 전력 — 기대 ≤ 250 mW · 실제 1.1111 mW| 출처 | 무엇을 검증하나 |
|---|---|
| 손계산 | 내가 회로를 제대로 이해했는가 |
| 시뮬레이션 | 회로가 정말 그렇게 동작하는가 |
| 둘이 일치하면 | 양쪽 다 맞습니다 |
| 어긋나면 | 둘 중 하나가 틀렸습니다 — 어느 쪽인지 찾는 것이 공부입니다 |
💡 이것은 말뿐이 아닙니다. 이 시뮬레이터를 처음 돌렸을 때 예제 여섯 개가 어긋났고, 파 보니 다섯 개는 예제 쪽이 틀렸습니다 — 전극 모델의 배선, 계측 증폭기의 부호, 보드선도에서 기울기를 이득으로 적은 것. 아무도 돌려 본 적이 없어서 몇 달째 틀린 채로 있었습니다.
해석 종류
| 해석 | 용도 | 지금 되는가 |
|---|---|---|
op | DC 동작점(operating point) | ✅ 노드 전압, 부품별 전류·전력 |
dc | DC 소인 | ✅ 곡선 |
tran | 과도응답(transient response) | ✅ 파형 |
ac | 주파수 응답 | ✅ 보드선도(Bode plot)보드선도 Bode plot주파수에 따른 이득과 위상을 로그 축에 그린 그림으로, 직선 몇 개로 회로의 거동을 읽습니다.자세히 보기 → — 크기와 위상 |
noise | 잡음 해석 | ❌ 아직 — 13-02의 손계산을 쓰세요 |
★ 무엇이 담기고 무엇이 안 담기는가
이것을 모르면 시뮬레이션을 믿어서는 안 되는 자리에서 믿게 됩니다.
풀 수 있는 부품
전부입니다.
저항 · 커패시터(ESR·ESL 포함) · 인덕터 · 결합 계수 · 전압원(vdc vac vsin vpulse) · 전류원(idc iac ipulse) · OP앰프 · 다이오드 · 제너 · LED · BJT · MOSFET · 아날로그 스위치
비선형 소자는 어떻게 푸는가
다이오드는 이라 한 번에 안 풀립니다 — 를 모르면 를 모르고 를 모르면 를 모릅니다. 그래서 답을 하나 찍어 놓고 고쳐 나갑니다 (Newton-Raphson).
매 반복마다 그 점에서 곡선을 접선으로 바꿉니다.
d거리 또는 두께distance or thicknessmg컨덕턴스 (소신호)small-signal conductanceSI전류currentAI_00번 전류current 0AV전압voltageVV_00번 전압voltage 0V그러면 반복 한 번은 저항과 전류원만 있는 선형 회로를 푸는 것과 같아집니다. 이것이 6-08 소신호 모델이 말하는 “동작점 주변에서 직선으로 근사한다” 와 정확히 같은 이야기입니다 — 다른 점은 그 직선을 매번 다시 긋는다는 것뿐입니다.
교류 해석도 마찬가지입니다. 먼저 동작점을 구하고, 그 점에서의 기울기(, )로 소신호 회로를 세워 풉니다.
⚠️ 이 반복은 자주 발산합니다. 지수 함수라 한 걸음이 조금만 커도 다음 전압이 엉뚱한 곳으로 날아갑니다. 걸음 제한·gmin 스테핑·소스 스테핑으로 막고, 그래도 안 되면 “수렴하지 않았습니다” 라고 말합니다. 조용히 이상한 숫자를 내느니 못 풀었다고 하는 편이 낫습니다.
OP앰프 — 이상적이지 않습니다
1극점 모델입니다. 이상적으로 두면 7장·13장이 보여 줄 것이 없어지기 때문입니다.
A이득gainA_ol이득 (ol)gain (ol)GBW이득 대역폭 곱gain-bandwidth productHz담깁니다:
- 개루프 이득이 주파수에 따라 줄어드는 것 → 루프 이득(loop gain)루프 이득 loop gain신호가 귀환 루프를 한 바퀴 돌아 제자리로 왔을 때의 배율로, 왜곡·임피던스·오차가 모두 이 값으로 나눠집니다.자세히 보기 → 가 실제로 줄어드는 것이 보입니다 (7-08)
- 이 정말 그 자리에 나옵니다 (13-04)
- 출력 저항 → 용량성 부하(capacitive load)용량성 부하 capacitive loadOP앰프 출력에 붙은 커패시터가 출력 저항과 만나 극점을 만들어, 위상 여유를 갉아먹고 발진시킵니다.자세히 보기 →가 만드는 링잉 (7-07)
안 담깁니다:
입력 옵셋 · 바이어스 전류(input bias current)입력 바이어스 전류 input bias currentOP앰프 입력이 스스로 빨아들이는 작은 전류로, 고임피던스 신호원에서는 이것이 곧 오프셋 전압이 됩니다.자세히 보기 → · 잡음 · CMRR동상신호 제거비 CMRR두 입력에 똑같이 들어온 간섭을 얼마나 지워 내는지를 나타내며, 차동 측정의 값어치가 여기서 나옵니다.자세히 보기 → · 슬루레이트(slew rate) · PSRR
⚠️ 12장의 잡음 이야기를 이 시뮬레이션으로 확인했다고 생각하면 안 됩니다. 잡음은 손계산으로 하고, 실물에서 재세요 (14-04).
품번은 코퍼스에 적힌 값을 씁니다 — OPA140 GBW 11 MHz, TL071 3 MHz. 모델표에 없는 품번은 일반값으로 풀고 “데이터시트 확인 필요” 라고 표시합니다.
계산 예제 — RC 저역통과를 손으로 풀고 확인하기
10 kΩ, 100 nF 저역통과의 차단주파수(cutoff frequency)차단 주파수 cutoff frequency필터의 출력이 입력보다 −3 dB(약 0.707배)로 떨어지는 주파수입니다.자세히 보기 →를 먼저 손으로 구합니다.
C정전용량capacitanceFf_c차단 주파수cutoff frequencyHzR저항resistanceΩ차단에서 크기는 , 즉 dB 이고 위상은 입니다. 한 십년 위에서는 dB 가 더 떨어집니다.
이것을 그대로 expect 에 적습니다.
analyses:
- {type: ac, sweep: dec, points: 50, fstart: 1, fstop: 100k}
expect:
- {measure: gain_db, node: OUT, at: 159.15, analysis: ac, value: -3.01, tol: 0.2}
- {measure: phase_deg, node: OUT, at: 159.15, analysis: ac, value: -45, tol: 2}
- {measure: gain_db, node: OUT, at: 1591.5, analysis: ac, value: -20.04, tol: 0.5}세 줄이 전부 통과하면 식을 제대로 세웠고 회로도 제대로 그렸다는 뜻입니다. 하나라도 어긋나면 그 자리에서 알 수 있습니다.
ngspice·EasyEDA 와의 관계
EasyEDA의 시뮬레이션 엔진은 ngspice 입니다. 그런데 워크벤치에서 도는 것은 ngspice 가 아니라 이 저장소가 만든 해석기입니다. 그러면 값이 다를까요?
선형 회로에서는 같습니다. MNA 는 SPICE 도 쓰는 방법이고, 저항·커패시터·인덕터·전압원은 푸는 식이 하나뿐입니다. 예제 121개의 expect 가 전부 맞는 것이 그 증거입니다.
다를 수 있는 곳:
| 곳 | 왜 |
|---|---|
| OP앰프 | 여기는 1극점, ngspice 는 제조사 매크로모델 (2극점 이상, 슬루·옵셋 포함) |
| 트랜지스터 모델 | 여기는 제곱법칙·에버스-몰의 간단한 꼴, ngspice 는 BSIM·거멜푼 |
| 과도 해석의 잔오차 | 여기는 고정 간격 사다리꼴, ngspice 는 가변 간격 |
| 잡음 해석 | 여기는 아직 없습니다 |
💡 정확한 값이 필요하면 EasyEDA 에서
Ctrl+R로 한 번 더 돌리세요. 여기서 보는 것은 “값이 상식적인가”를 빠르게 확인하는 용도입니다.
★ 실무 주의사항
1. M은 밀리입니다
SPICE에서 1M = 0.001 입니다 (0-03). circuit.yaml 은 1M 을 메가로 읽습니다. 헷갈리지 않게 큰 값은 1MEG 으로 쓰세요.
2. 전류원의 극성
p 가 전류가 나오는 쪽입니다 (화살표가 그쪽을 향하는 그림). 포토다이오드를 합산 노드에 물릴 때 이것을 반대로 잡으면 출력 부호가 통째로 뒤집힙니다.
3. 저항 전류는 노드 전압에서 계산합니다
I전류currentAP전력powerWR저항resistanceΩV_11번 전압voltage 1VV_22번 전압voltage 2V전압원 전류는 행렬이 직접 풀어 주고, 나머지는 이렇게 구합니다.
4. 접지가 없으면 못 풉니다
전압은 언제나 어딘가에 대한 값입니다. 기준이 없으면 행렬이 풀리지 않고, 워크벤치가 “접지(GND)가 없습니다” 라고 말합니다.
5. 기생 성분을 넣으세요
기생 없는 시뮬레이션은 무한 대역폭을 보여 줍니다 (11-07).
# 반드시 넣을 것
- 고임피던스 노드의 대지 용량
- 케이블·배선 용량
- 커패시터 ESR/ESL
- 실제 소스 임피던스⚖️ 트레이드오프
| 선택 | ✅ | ⚠️ |
|---|---|---|
| 브라우저 (여기) | 설치 없음, 즉시, 폰에서도 | 잡음 해석이 없음, OP앰프는 1극점 |
| ngspice / EasyEDA | 비선형, 제조사 모델 | 설치 필요, PC 에서만 |
| 이상 모델 | 빠름, 개념 확인 | 실물과 다름 |
| 기생 포함 모델 | 실용적 정확도 | 파라미터 확보 필요 |
| 해석해 교차검증 | 신뢰성 | 단순 회로만 가능 |
| 몬테카를로 | 부품 편차 반영 | 시간 |
⚠️ 시뮬레이션의 한계
| 못 하는 것 | 대응 |
|---|---|
| 레이아웃 의존 기생 | 경험값 + 여유, 실측 |
| 방사·유도 결합(coupling) | 3D 전자기 해석 또는 실측 |
| 발진 정확 예측 | 실물 측정 필수 |
| 접촉 불량, 조립 오차 | — |
| 열 분포 | 열 해석 |
| 부품 개체 편차 | 몬테카를로 |
⚠️ OP앰프 모델은 출력 임피던스(output impedance)와 고주파 특성이 부정확한 경우가 많습니다. 이것은 여기서도 ngspice 에서도 마찬가지입니다. 안정성 판단은 실물에서 하세요 (14-07).
🔌 워크플로
| # | 단계 | 여기서 걸러지는 것 |
|---|---|---|
| 1 | circuit.yaml 작성 | — |
| 2 | 워크벤치에 붙여 넣기 | 구조 오류 — 핀 오타, 접지 없음, 못 푸는 부품 |
| 3 | 회로도를 눈으로 확인 | 내가 그리려던 회로가 맞는가 |
| 4 | 손으로 먼저 계산 | 내가 이해했는가 |
| 5 | expect 에 그 값을 적기 | 검증값을 파일에 고정 |
| 6 | 결과와 대조 | 어긋나면 둘 중 하나가 틀린 것 |
| 7 | EasyEDA 에서 Ctrl+R | 비선형까지 포함해 교차 확인 |
| 8 | 실물 제작 후 실측 | 최종 검증 — 모델이 놓친 것 (18-04) |
각 단계가 다음 단계의 기대값을 제공합니다.
연습문제
문제 1. RC 저역통과(10 kΩ, 100 nF)의 차단주파수를 손으로 계산하고, expect 로 쓰세요.
exercises/17-03-rc-expect.yaml풀이
f_c차단 주파수cutoff frequencyHzanalyses:
- {type: ac, sweep: dec, points: 50, fstart: 1, fstop: 100k}
expect:
- {measure: gain_db, node: OUT, at: 159.15, analysis: ac, value: -3.01, tol: 0.2}
- {measure: gain_db, node: OUT, at: 1591.5, analysis: ac, value: -20.04, tol: 0.5}10배 주파수에서 −20 dB(1차 롤오프)도 함께 검증합니다.
문제 2. 시뮬레이션 대역폭이 실측보다 훨씬 넓습니다. 무엇을 빠뜨렸을까요?
exercises/17-03-missing-parasitics.yaml풀이
기생 용량(parasitic capacitance)기생 용량 parasitic capacitance부품·배선·케이블이 원치 않게 갖는 커패시턴스로, 고임피던스 신호원에서 대역폭을 가장 먼저 잡아먹습니다.자세히 보기 →을 넣지 않았을 가능성이 큽니다 (11-07).
확인 목록:
- 고임피던스 노드의 대지 용량 (PCB 1~3 pF/cm)
- 케이블 용량 (100 pF/m)
- OP앰프 입력 용량 (2~10 pF)
- 프로브(probe) 용량 (측정 시 10 pF)
- 소스 임피던스가 실제 값인가
- OP앰프 품번이 모델표에 있는가 (없으면 GBW 1 MHz 일반값으로 풀립니다)
가장 흔한 원인: 소스 임피던스와 입력 용량을 넣지 않아 가 0 이 된 경우.
수정 예:
components:
- {ref: RS, type: r, value: 1MEG, label: 실제 소스 임피던스}
- {ref: CIN, type: c, value: 15p, label: 입력 용량 + PCB + 프로브}문제 3. NPN 스위치의 컬렉터 전류를 계산했더니 = 1.1 A 가 나왔습니다. 그런데 시뮬레이션은 49 mA 라고 합니다. 누가 맞습니까?
exercises/17-03-bjt-saturation.yaml풀이
시뮬레이션이 맞고, 를 쓴 것이 틀렸습니다. 는 활성 영역에서만 성립합니다.
부하가 240 Ω, 전원이 12 V 면 흐를 수 있는 최대 전류가 50 mA 입니다. 그보다 많이 흘리려 하면 컬렉터 전압이 이미터 아래로 내려가고, 그러면 베이스-컬렉터 접합이 순방향이 되어 여분의 베이스 전류를 되돌려 보냅니다. 이것이 포화입니다 (6-02).
beta전류 이득 (BJT)current gainI_B베이스 전류base currentAI_C컬렉터 전류collector currentAR_L부하 저항load resistanceΩV_CC전압 (CC)voltage (CC)VV_CE(sat)전압 (CE(sat))voltage (CE(sat))V스위치로 쓸 때는 일부러 포화시킵니다 — 가 0.1~0.2 V 로 내려가야 손실이 작습니다. 그래서 베이스 전류를 필요한 것보다 넉넉히(보통 ) 줍니다.
이 시뮬레이터를 만들 때 베이스-컬렉터 접합을 빼먹었더니 정확히 이 회로가 1.04 A 를 흘렸습니다. 부하가 허용하는 것이 50 mA 인데도요.
이전 ← 02 검증 (ERC) | 다음 → 04 EasyEDA로 내보내기