CircuitJS1로 보는 컨버터
- SPICE 라이브러리의 회로를 CircuitJS1에서 열고 스코프(scope)를 읽습니다.
- CircuitJS1이 회로를 시뮬레이션하는 방법과, 다이오드가 도통을 멈추는 타임 스텝(time step) 안에서 일어날 수 있는 일을 압니다.
- 수치적인 스파이크와 회로 자체의 스파이크를 구별하고, 라이브러리의 회로에 바디 다이오드(body diode), 후진 오일러(backward Euler)로 계산하는 자성 부품, 1보다 조금 작은 결합 계수(coupling coefficient)가 들어간 이유를 압니다.
CircuitJS1로 보는 라이브러리
섹션 제목: “CircuitJS1로 보는 라이브러리”CircuitJS1은 Paul Falstad의 회로 시뮬레이터를 Iain Sharp가 브라우저용으로 옮긴
것입니다 [Falstad & Sharp, CircuitJS1 browser circuit simulator]. 웹 페이지 안에서 회로를 시뮬레이션하며,
회로에 흐르는 전류를 애니메이션으로 보여 줍니다. 저장소의 sim/falstad/ 폴더에는 SPICE
라이브러리의 일곱 사례가 CircuitJS1 회로로 들어 있습니다. 각 회로는 텍스트
파일(File > Import From Text)과, falstad.com에서 회로를 여는 링크로 제공됩니다.
링크는 회로 전체를 압축해 주소 안에 담고 있습니다 [Falstad & Sharp, CircuitJS1 source code, version 4.1.5.1js].
스크립트가 같은 이름의 SPICE 넷리스트를 만드는 부품 목록과 같은 예제의 값으로
모든 회로를 생성하고, 각 부품이 넷리스트에서와 같은 노드에 연결되는지 확인합니다.
| 사례 | 회로 | CI가 비교하는 이상적인 값 |
|---|---|---|
| 벅 컨버터, CCM 시뮬레이터 프리셋: buck-basic | CircuitJS1에서 열기 | 출력 전압: 평균 12 V 인덕터 전류: 평균 1.2 A, 최대 1.5 A, 최소 900 mA 스위치 노드: 최대 24 V |
| 벅 컨버터, DCM 시뮬레이터 프리셋: buck-light-load | CircuitJS1에서 열기 | 출력 전압: 평균 15.74 V 인덕터 전류: 평균 157.4 mA, 최대 413 mA, 최소 0 A 스위치 노드: 최대 24 V |
| 부스트 컨버터, CCM 시뮬레이터 프리셋: boost-ideal | CircuitJS1에서 열기 | 출력 전압: 평균 24 V 인덕터 전류: 평균 2.4 A, 최대 2.7 A, 최소 2.1 A 스위치 노드: 최대 24.3 V |
| 벅-부스트 컨버터(반전형), CCM 시뮬레이터 프리셋: buckboost-basic | CircuitJS1에서 열기 | 출력 전압: 평균 −12 V 인덕터 전류: 평균 2.4 A, 최대 2.7 A, 최소 2.1 A 스위치 노드: 최대 12 V, 최소 −12.3 V |
| 플라이백 컨버터, CCM 시뮬레이터 프리셋: flyback-ccm | CircuitJS1에서 열기 | 출력 전압: 평균 8 V 드레인: 최대 80.13 V |
| 플라이백 컨버터, DCM 시뮬레이터 프리셋: flyback-dcm | CircuitJS1에서 열기 | 출력 전압: 평균 20.36 V 드레인: 최대 129.5 V |
| 리셋 권선이 있는 포워드 컨버터, CCM 시뮬레이터 프리셋: forward-basic | CircuitJS1에서 열기 | 출력 전압: 평균 9.6 V 인덕터 전류: 평균 1.92 A, 최대 2.208 A, 최소 1.632 A 드레인: 최대 96 V |
아래쪽의 스코프는 인덕터 전류(플라이백에서는 스위치 전류), 스위치 노드나 드레인, 출력을 보여 줍니다. 회로는 1초에 스위칭 주기 하나 정도의 속도로 열리고, 전류 점도 눈으로 따라갈 수 있을 만큼 느리게 움직입니다. Simulation Speed 슬라이더를 올리면 더 빨리 실행됩니다. 회로는 이상적인 정상상태의 값에서 시작합니다. 출력 커패시터는 출력 전압에서, 인덕터(플라이백은 자화 인덕턴스)는 스위치가 켜질 때의 전류에서 시작하므로, 스코프는 처음 몇 주기 안에 정상상태를 보여 줍니다. Reset은 커패시터와 인덕터를 이 값으로 되돌립니다. 원하는 값으로 보려면 사이트의 시뮬레이터에 값을 넣고 이 값으로 CircuitJS1에서 열기 링크를 여십시오. 입력한 값으로 만든 같은 회로가 열립니다(같은 회로).
사이트의 CI는 모든 링크의 사본, 곧 속도만 높인 같은 회로를 falstad.com에서 헤드리스 브라우저(headless browser)로 엽니다. 사본을 SPICE 사례와 같은 주기 수만큼 실행한 뒤, 마지막 두 주기의 평균과 최댓값·최솟값을 표의 이상적인 값과 비교합니다. 각 값은 그 두 주기 동안 해당 양의 최대 크기 대비 1 % 안에 들어야 합니다.
CircuitJS1이 회로를 시뮬레이션하는 방법
섹션 제목: “CircuitJS1이 회로를 시뮬레이션하는 방법”CircuitJS1은 회로 전체를 고정된 타임 스텝으로 한 스텝씩 계산합니다. 반복 계산이 수렴하지 못할 때에만 스텝을 절반으로 줄이며, 그것도 Other Options에서 Auto-Adjust Timestep이 켜져 있을 때뿐입니다 [Falstad & Sharp, CircuitJS1 source code, version 4.1.5.1js]. 라이브러리의 회로는 이 옵션을 끄고 스위칭 주기의 500분의 1인 스텝으로 계산합니다. SPICE는 오차 추정값에 따라 스텝마다 길이를 정하지만 [The ngspice team, Ngspice User's Manual], CircuitJS1은 다이오드가 도통을 시작하거나 멈추는 순간을 찾지 않습니다.
스텝마다 각 인덕터는 전류원과 병렬로 연결된 컨덕턴스, 곧 동반 모델(companion model)로 바뀝니다. 이 모델은 인덕터의 Trapezoidal Approximation 확인란을 끄지 않는 한 사다리꼴 규칙(trapezoidal rule)을 따르고, 확인란을 끄면 후진 오일러를 따릅니다. 변압기의 권선도 같은 방식입니다 [Falstad & Sharp, CircuitJS1 source code, version 4.1.5.1js]. 다이오드는 비선형이므로 CircuitJS1은 반복 계산을 합니다. 다이오드를 현재 전압에서의 직선으로 바꾸어 회로를 풀고, 이를 되풀이합니다. 다이오드 전압이 한 반복에서 다음 반복으로 10 mV 이하로만 바뀌면 수렴한 것으로 보고 [Falstad & Sharp, CircuitJS1 source code, version 4.1.5.1js], 그때의 해를 다시 풀지 않고 그대로 씁니다.
다이오드가 도통을 멈추는 곳
섹션 제목: “다이오드가 도통을 멈추는 곳”라이브러리의 다이오드는 이상에 가깝습니다. 반복 계산이 받아들이는 것보다 훨씬 작은 전압 변화에도 전류가 몇 배씩 바뀝니다. 다이오드 전류가 스텝 도중에 0에 이르면, 다이오드를 대신하는 직선은 그 스텝, 경우에 따라서는 다음 스텝까지 0을 지나서도 전류를 흘릴 수 있고, 인덕터 전류는 0 아래에서 스텝을 마칩니다. 라이브러리의 DCM 벅에서는 전류가 한 스텝 동안 바뀌는 양보다 조금 더 0을 지나칩니다. 반복 계산이 다이오드가 꺼졌다고 판단했는데 전류를 받아 줄 다른 경로가 없으면, 다음 스텝은 전류를 0으로 되돌려야 하고, 후진 오일러는 그 한 스텝 동안 인덕터에 다음 전압을 겁니다.
- 한 스텝 전압 점프
- 타임 스텝
- 0을 지나친 전류
- 인덕턴스
가정, 표기 규약, 출처
- 가정
- 후진 오일러: 스텝 끝의 인덕터 전압이 인덕턴스와 스텝 동안의 전류 변화를 곱해 스텝으로 나눈 값임
- 스텝 안에서 전류 경로가 열리고, 다른 소자(바디 다이오드, 스너버, 노드 커패시턴스)가 전류를 받지 않음
- 모든 스텝에서 같은 타임 스텝
- 비고
- 다이오드를 지나는 인덕터 전류가 0을 지나친 채로 스텝이 끝날 수 있습니다. 반복 계산이 다이오드 전류가 자리 잡기 전에 다이오드를 대신하는 직선 모델을 받아들이는 경우가 그렇습니다. 이어서 다이오드가 꺼지고 다른 소자가 전류를 받지 않으면, 다음 스텝은 전류를 에서 0으로 되돌려야 하고, 후진 오일러는 그 스텝 동안 인덕터에 이 전압을 겁니다. 전류가 빠져나간 노드의 전압은 인덕터 반대쪽 끝의 전압과 이만큼 차이 납니다. 회로에는 이런 스파이크가 없으며, 스텝을 줄여도 사라지지 않습니다. 0을 지나친 전류가 스텝과 함께 줄어들므로, 점프의 크기는 그 전에 인덕터에 걸려 있던 전압 정도로 남습니다. 스위치가 열릴 때 그 전류를 받을 소자가 없으면(스위치에 걸친 바디 다이오드는 그때 역바이어스) 같은 스텝이 누설 인덕턴스의 전류도 멈춥니다. 이 전류는 스텝과 함께 줄지 않으므로 이 스파이크는 스텝이 짧을수록 커집니다. 노드에 걸친 다이오드는 점프를 레일에서 다이오드 강하 이내로 묶고, 후진 오일러로 계산하는 노드 커패시턴스는 점프 없이 전류를 받습니다
- 출처
- Alexander & Sadiku 2017, Ch. 6 (Capacitors and Inductors: v = L di/dt, and the current through an inductor cannot change abruptly); derived here; Hairer & Wanner 1996, Sec. IV.3 (implicit Euler takes the slope at the end of the step); Falstad & Sharp, CircuitJS1 source code, version 4.1.5.1js, Inductor.java: the backward Euler companion model, a resistance L over the time step in parallel with the previous current
- 유도
- sympy 단계별 유도
- 수식 id
sim.step_jump· equations.yaml 항목
전류가 빠져나간 노드의 전압은 인덕터 반대쪽 끝의 전압과 이만큼 차이 납니다. 바디 다이오드가 없는 DCM 벅에서 스위치 노드는 한 스텝 동안 0 근처에서 출력보다 이만큼 높은 곳, 곧 입력보다 10볼트쯤 높은 곳으로 튑니다. 회로에는 없는 스파이크입니다. 스텝을 줄여도 사라지지 않습니다. 전류가 0을 지나치는 양은 한 스텝 동안의 변화 정도이므로 스텝과 함께 줄어들고, 점프의 크기는 다이오드가 꺼지기 전 인덕터에 걸려 있던 전압, 벅에서는 출력 전압의 크기 정도로 남습니다. 스텝을 절반으로, 다시 절반으로 줄여도 DCM 벅의 점프는 출력 전압의 약 0.7배에서 1.4배 사이였습니다.
그래서 라이브러리의 회로는 사이트의 시뮬레이터처럼 스위치마다 바디 다이오드를 둡니다. 바디 다이오드는 점프를 없애지는 못하지만 그 크기를 제한합니다. 0을 지나친 전류가 이를 통해 흐르므로, 노드는 레일(rail)을 다이오드 강하 이상 벗어나지 않습니다. DCM 벅의 스위치 노드는 몇 스텝 동안 입력보다 다이오드 강하만큼 높은 곳에 머물다가, 바디 다이오드 자체의 전류가 0을 지나치면서 한 스텝 동안 출력보다 아래로 떨어집니다. 다이오드가 꺼질 때 입력 전압으로 내려오는 DCM 플라이백의 드레인은 한 스텝 동안 떨어질 수 있지만, 접지보다 다이오드 강하 이상 내려가지는 않습니다. 바디 다이오드가 없으면 접지보다 훨씬 아래까지 내려갑니다. 후진 오일러로 계산하는 노드 커패시턴스는 점프 없이 전류를 받습니다.
변압기
섹션 제목: “변압기”CircuitJS1의 변압기는 권선 인덕턴스 행렬의 역행렬을 쓰는데, 결합 계수가 정확히 1이면 이 행렬은 특이 행렬이 되며, 편집 대화 상자는 0과 1 사이의 결합 계수만 받습니다 [Falstad & Sharp, CircuitJS1 source code, version 4.1.5.1js]. 라이브러리의 변압기는 0.99999를 씁니다. 남는 누설 인덕턴스(leakage inductance)는 턴오프 때 드레인에 한 스텝 동안 스파이크를 더합니다. 스위치가 그 스텝 안에 누설 인덕턴스의 전류를 멈추기 때문입니다 (한 스텝 점프에 스위치 전류가 흐르는 누설 인덕턴스와 스위치가 끊는 전류를 넣은 값). 이 전류는 스텝과 함께 줄지 않으므로, 라이브러리의 스텝에서 1볼트 미만인 이 스파이크는 1에서 결합 계수를 뺀 값에 비례하고 스텝에 반비례합니다.
이 누설 인덕턴스는 스텝보다 훨씬 빠른 모드도 만듭니다. 그런 모드에 대한 사다리꼴 규칙의 배율은 -1에 가까우므로 (사다리꼴 규칙의 배율) 이 모드는 스텝마다 부호를 바꾸며 링잉합니다. Trapezoidal Approximation 확인란을 켜면, 출력 다이오드가 도통하는 동안 DCM 플라이백의 드레인은 스텝마다 보여야 할 값의 약 두 배와 0 사이를 오갑니다. 그래서 라이브러리의 인덕터와 변압기는 그런 모드에 대한 배율이 0에 가까운 후진 오일러를 씁니다 (후진 오일러의 배율).
풀이 예제
섹션 제목: “풀이 예제”라이브러리의 DCM 벅은 인덕터를 후진 오일러로 계산합니다. 바디 다이오드를 없애면, 환류 다이오드(freewheeling diode)가 꺼질 때 0을 지나친 전류가 한 스텝 안에 멈춰야 합니다.
| 기호 | 값 | 구하는 방법 |
|---|---|---|
| 인덕턴스 | 100 µH | 주어진 값 |
| 0을 지나친 전류 | 3.7 mA | 주어진 값 |
| 타임 스텝 | 20 ns | 주어진 값 |
| 한 스텝 전압 점프 | 18.5 V | 인덕터 전류를 멈추는 후진 오일러 스텝의 전압 |
스위치 노드는 15.7 V인 출력보다 18.5 V 높이 튀므로, 한 스텝 동안 입력보다 10볼트쯤 높은 값을 보입니다. 바디 다이오드가 있으면 전류가 이를 통해 입력으로 돌아가고, 스위치 노드는 몇 스텝 동안 입력보다 다이오드 강하만큼 높은 곳에 머뭅니다.
직접 해 보기
섹션 제목: “직접 해 보기”▶ 수식 탐색기에서 열기: 인덕터 전류를 멈추는 후진 오일러 스텝의 전압
초기값을 가져온 예제 falstad-jump
스텝이 정해져 있으면 점프는 0을 지나친 전류에 비례해 커집니다. 이제 CircuitJS1에서 확인해 봅니다. 표에서 DCM 벅을 열고, 스위치 양단의 다이오드를 선택해 지운 뒤, 다이오드 도통이 끝날 때마다 스위치 노드의 스코프에 스파이크가 생기는 것을 봅니다. Other Options에서 타임 스텝을 바꿔도 스파이크는 남습니다. DCM 플라이백에서 변압기를 더블클릭해 Trapezoidal Approximation을 켜면, 드레인의 스코프가 스텝마다 오가는 값으로 채워집니다. 사이트의 시뮬레이터는 다이오드 전류가 0에 이르는 순간을 스텝 안에서 찾으므로(계산 방법) 두 현상 모두 보이지 않습니다.
▶ 시뮬레이터에서 열기: 벅
초기값을 가져온 예제 buck-light-load
벤치 실습
섹션 제목: “벤치 실습”벤치에서 DCM 컨버터의 스위치 노드를 다이오드가 도통을 멈추는 순간에 캡처합니다. 인덕턴스가 스위치 노드의 커패시턴스와 함께 링잉합니다 (링잉 주파수). 링잉 주파수와 인덕턴스로부터 그 커패시턴스를 구합니다. CircuitJS1에서 라이브러리의 DCM 벅에 여러분의 컨버터 값을 넣고, 그 커패시턴스를 스위치 노드와 접지 사이에 추가하되 Trapezoidal Approximation 확인란을 끄고, 링잉을 충분히 나타낼 만큼 짧은 타임 스텝, 곧 링잉 주기의 작은 일부를 설정합니다. 이제 스위치 노드는 0에서 매끄럽게 올라가 벤치와 같은 주파수로 링잉하며, 입력까지 올라가면 바디 다이오드가 그 위를 잘라 냅니다. 감쇠가 아니라 주파수를 비교하십시오. 후진 오일러는 진동에 대한 배율의 크기가 1보다 작아서 [Hairer & Wanner 1996, Sec. IV.3] 스스로 진동을 감쇠시키며, 링잉 한 주기에 들어가는 스텝이 적을수록 시뮬레이션의 링잉이 빨리 사라집니다.
주의할 점
섹션 제목: “주의할 점”- 한 스텝 동안만 나타나고 스텝을 바꾸면 달라지는 스파이크는 수치적인 것입니다. 회로에서 원인을 찾기 전에 갈 곳이 없는 전류를 찾아보십시오 (한 스텝 점프).
- 스텝마다 값이 오가는 노드는 스텝보다 훨씬 빠른 모드에 사다리꼴 규칙이 적용된 결과입니다. 그 모드에 속한 인덕터, 변압기, 커패시터의 Trapezoidal Approximation을 끄십시오.
- 결합 계수를 정확히 1로 넣을 수 없습니다. 대화 상자가 받지 않습니다 [Falstad & Sharp, CircuitJS1 source code, version 4.1.5.1js]. 1보다 조금 작은 값을 쓰고, 턴오프 때 작은 누설 스파이크를 예상하십시오.
- 곡선이 가파른 다이오드는 느슨하게 수렴합니다. 반복 계산은 전류가 아니라 전압의 변화로 멈추므로, 이상에 가까운 다이오드에서는 인덕터 전류가 0을 한참 지난 채로 스텝을 마칠 수 있습니다. 전류가 흐를 경로를 주십시오. 바디 다이오드는 점프를 제한하고, Trapezoidal Approximation을 끈(후진 오일러) 노드 커패시턴스는 점프를 없앱니다.
더 알아보기
섹션 제목: “더 알아보기”- 도구 CircuitJS1 circuit simulator
전류의 흐름을 애니메이션으로 보여 주는 브라우저 회로 시뮬레이터. 컨버터를 처음 살펴보기에 좋습니다. - 도구 CircuitJS1 source code
시뮬레이터의 소스 코드. 회로를 한 타임 스텝씩 계산하는 방법과, 스텝마다 인덕터·변압기·다이오드를 모델링하는 방법. - 도구 Circuit Simulator JavaScript Interface Documentation
웹 페이지에서 JavaScript로 시뮬레이터를 실행하고 스텝마다 노드 전압과 전류를 읽는 방법. 이 사이트의 CI도 이 방법으로 라이브러리의 회로를 확인합니다.
CircuitJS1은 라이브러리의 회로를 시간에 따라 어떻게 계산합니까?
정답과 해설
정답: B CircuitJS1은 타임 스텝을 고정해 둡니다. 반복 계산이 수렴하지 못할 때에만 스텝을 절반으로 줄이며, 그것도 라이브러리의 회로가 꺼 둔 Auto-Adjust Timestep이 켜져 있을 때뿐입니다. 다이오드가 꺼지는 순간에 스텝을 줄이는 장치는 없습니다.
100 µH 인덕터를 후진 오일러로 20 ns 스텝마다 계산합니다. 다이오드가 꺼질 때 전류가 0을 3.7 mA 지나쳐 있고, 이 전류를 받아 줄 다른 경로가 없습니다. 인덕터에 걸리는 한 스텝 점프는 얼마입니까?
정답과 해설
정답: B 그 스텝은 전류를 0으로 되돌려야 하므로 인덕터에는 L과 전류의 곱을 스텝으로 나눈 전압이 걸립니다. 100 µH × 3.7 mA / 20 ns는 18.5 V입니다.
그 스파이크를 없애려고 타임 스텝을 절반으로 줄입니다. 스파이크는 어떻게 됩니까?
정답과 해설
정답: C 전류가 0을 지나치는 양은 한 스텝 동안의 변화 정도라서 스텝과 함께 절반이 되고, 같은 전류라면 짧아진 스텝이 전압을 두 배로 만듭니다. 점프의 크기는 다이오드가 꺼지기 전 인덕터에 걸려 있던 전압의 크기 정도로 남습니다. 라이브러리의 DCM 벅에서는 출력 전압의 약 0.7배에서 1.4배 사이였습니다.
다이오드가 꺼질 때 노드가 전원 범위를 훨씬 벗어나 튀지 않도록 라이브러리의 회로는 무엇을 더합니까?
정답과 해설
정답: B 0을 지나친 전류가 바디 다이오드를 통해 흐르므로 노드는 레일을 다이오드 강하 이상 벗어나지 않습니다. 레일 안쪽에서 한 스텝 동안의 처짐은 남을 수 있습니다. 스텝을 줄여도 나아지지 않으며, 점프 없이 전류를 받는 것은 후진 오일러로 계산하는 노드 커패시턴스입니다.
변압기의 Trapezoidal Approximation을 켜면 출력 다이오드가 도통하는 동안 DCM 플라이백의 드레인이 스텝마다 기대값의 약 두 배와 0 사이를 오갑니다. 이유는 무엇입니까?
정답과 해설
정답: B 누설 인덕턴스는 스텝보다 훨씬 빠른 모드를 만듭니다. 사다리꼴 규칙은 스텝마다 이 모드에 거의 -1을 곱하므로 모드가 감쇠하지 않고 부호만 바꿉니다. 후진 오일러의 배율은 이 모드에 대해 0에 가깝습니다.
라이브러리의 변압기가 결합 계수로 1이 아니라 0.99999를 쓰는 이유는 무엇입니까?
정답과 해설
정답: B 결합 계수가 1이면 인덕턴스 행렬의 행렬식 L1 L2 - M^2가 0이 되어 역행렬을 구할 수 없습니다. 0.99999가 남기는 누설은 턴오프 때 드레인에 한 스텝 동안 스파이크를 더합니다. 스위치가 그 스텝 안에 누설 인덕턴스의 전류를 멈추기 때문이며, 라이브러리의 스텝에서는 1 V 미만입니다.
이 사이트의 예제, 프리셋, 연습 문제에 나오는 수치는 교육용으로 만든 어림수(합성 값)이며, 실제 설계의 데이터가 아닙니다.