콘텐츠로 이동

유도 과정

아래 각 절은 python/pe_core/derive/의 스크립트에서 생성됩니다. 같은 스크립트가 pytest에서도 실행되며, 유도 결과(derived result)와 equations.yaml에 저장된 수식의 기호적 차이(symbolic difference)가 0으로 정리되지 않으면 테스트가 실패합니다. 설명과 제목은 사람이 쓴 것이고, 이 페이지의 모든 수식은 그 스크립트에서 sympy가 출력한 것입니다.

기초 복습: 소자 법칙(element laws), 임피던스, 푸리에 급수, 자기학(magnetics), 이상적 변압기

섹션 제목: “기초 복습: 소자 법칙(element laws), 임피던스, 푸리에 급수, 자기학(magnetics), 이상적 변압기”

소자 법칙을 일정한 전압 또는 전류에 대해 적분하고, 같은 법칙의 페이저 형태에서 임피던스를 구하며, 펄스열의 푸리에 계수와 실효값을 한 주기에 걸쳐 계산합니다. 이상적 변압기는 자기저항이 0인 무손실 코어를 가정하고 패러데이 법칙과 앙페르 법칙에서 얻습니다.

  1. 인덕터 법칙은 v=L di/dtv = L\,\mathrm{d}i/\mathrm{d}t입니다. 전압 VLV_L이 일정하면 전류의 기울기도 일정하므로, 구간 tt에 걸쳐 적분합니다.

    ∫0tVLL dτ\int\limits_{0}^{t} \frac{V_L}{L}\, d\tau
  2. 적분을 계산합니다.

    Δi=VLtL\Delta i = \frac{V_L t}{L}

    ✓ 재현하는 수식 ind.di (pytest가 sympy로 일치를 검증함)

  3. 인덕터 법칙의 쌍대인 커패시터 법칙 i=C dv/dti = C\,\mathrm{d}v/\mathrm{d}t를 일정한 전류 ICI_C에 대해 적분합니다.

    ∫0tICC dτ\int\limits_{0}^{t} \frac{I_C}{C}\, d\tau
  4. 적분을 계산합니다.

    ΔvC=ICtC\Delta v_C = \frac{I_C t}{C}

    ✓ 재현하는 수식 cap.dv (pytest가 sympy로 일치를 검증함)

  5. 인덕터에 전달되는 에너지는 ∫v i dt=∫L i di\int v\,i\,\mathrm{d}t = \int L\,i\,\mathrm{d}i이며, 전류 0에서 ILI_L까지 적분합니다.

    ∫0ILLi di\int\limits_{0}^{I_L} L i\, di
  6. 적분을 계산합니다.

    EL=LIL22E_L = \frac{L I_L^{2}}{2}

    ✓ 재현하는 수식 ind.E (pytest가 sympy로 일치를 검증함)

  7. 커패시터에 전달되는 에너지는 ∫v i dt=∫C v dv\int v\,i\,\mathrm{d}t = \int C\,v\,\mathrm{d}v이며, 전압 0에서 VCV_C까지 적분합니다.

    ∫0VCCv dv\int\limits_{0}^{V_C} C v\, dv
  8. 적분을 계산합니다.

    EC=CVC22E_C = \frac{C V_C^{2}}{2}

    ✓ 재현하는 수식 cap.E (pytest가 sympy로 일치를 검증함)

  9. 정현파 정상상태에서는 d/dt\mathrm{d}/\mathrm{d}t가 jωj\omega를 곱하는 연산이 되며, ω=2πf\omega = 2\pi f입니다. 인덕터 법칙에서 인덕터의 임피던스를 얻습니다.

    ZL=2πiLfZ_L = 2 \pi i L f
  10. 그 크기.

    ∣ZL∣=2πfL|Z_L| = 2 \pi f L

    ✓ 재현하는 수식 imp.ZL (pytest가 sympy로 일치를 검증함)

  11. 커패시터 법칙에서 커패시터의 임피던스를 얻습니다.

    ZC=−i2πCfZ_C = - \frac{i}{2 \pi C f}
  12. 그 크기.

    ∣ZC∣=12πfC|Z_C| = \frac{1}{2 \pi f C}

    ✓ 재현하는 수식 imp.ZC (pytest가 sympy로 일치를 검증함)

  13. 부하가 없는 R-C 저역통과 필터에서 출력은 RfR_f와 커패시터 임피던스로 이루어진 분압기에서 커패시터에 걸리는 몫입니다.

    G(jω)=−i2πCfRff−iG(j\omega) = - \frac{i}{2 \pi C_f R_f f - i}
  14. 크기의 제곱.

    ∣G(jω)∣2=11+4π2Cf2Rf2f2\left|{G(j\omega)}\right|^{2} = \frac{1}{1 + 4 \pi^{2} C_f^{2} R_f^{2} f^{2}}
  15. 차단(-3 dB) 주파수는 크기의 제곱이 1/2로 떨어지는 주파수입니다.

    fc=12πRfCff_c = \frac{1}{2 \pi R_f C_f}

    ✓ 재현하는 수식 rc.fc (pytest가 sympy로 일치를 검증함)

  16. 크기를 RfCfR_f C_f 대신 fcf_c로 나타냅니다.

    ∣G∣=fcf2+fc2=11+(ffc)2|G| = \frac{f_c}{\sqrt{f^{2} + f_c^{2}}} = \frac{1}{\sqrt{1 + \left(\frac{f}{f_c}\right)^{2}}}

    ✓ 재현하는 수식 rc.gain (pytest가 sympy로 일치를 검증함)

  17. 기생 커패시턴스가 병렬로 붙은 인덕턴스에서는 어드미턴스가 더해집니다.

    Y=2πiCpf−i2πLfY = 2 \pi i C_p f - \frac{i}{2 \pi L f}
  18. 공진에서 어드미턴스는 0입니다(무손실 모델에서는 임피던스가 무한대).

    fsrf=12πLCpf_\mathrm{srf} = \frac{1}{2 \pi \sqrt{L C_p}}

    ✓ 재현하는 수식 passive.f_srf (pytest가 sympy로 일치를 검증함)

  19. 주기 TT마다 높이 VpkV_\mathrm{pk}, 폭 DTD T인 펄스열을 생각합니다. hh차 고조파의 코사인 계수는 다음과 같습니다.

    ah,cos⁡=Vpksin⁡(2πDh)πha_{h,\cos} = \frac{V_\mathrm{pk} \sin{\left(2 \pi D h \right)}}{\pi h}
  20. 사인 계수는 다음과 같습니다.

    ah,sin⁡=2Vpksin⁡2(πDh)πha_{h,\sin} = \frac{2 V_\mathrm{pk} \sin^{2}{\left(\pi D h \right)}}{\pi h}
  21. 고조파 진폭의 제곱은 두 계수의 제곱의 합이며, 1−cos⁡2x=2sin⁡2x1 - \cos 2x = 2\sin^2 x를 쓰면 완전제곱이 됩니다.

    ah2=4Vpk2sin⁡2(πDh)π2h2a_h^{2} = \frac{4 V_\mathrm{pk}^{2} \sin^{2}{\left(\pi D h \right)}}{\pi^{2} h^{2}}
  22. 음이 아닌 제곱근을 취합니다.

    ah=2Vpk∣sin⁡(πhD)∣πha_h = \frac{2 V_\mathrm{pk} \left|{\sin{\left(\pi h D \right)}}\right|}{\pi h}

    ✓ 재현하는 수식 fourier.pulse.harm (pytest가 sympy로 일치를 검증함)

  23. 한 주기에 걸친 제곱 평균에는 펄스가 DTD T 동안 Vpk2V_\mathrm{pk}^2를 기여합니다.

    Vrms2=DVpk2V_\mathrm{rms}^{2} = D V_\mathrm{pk}^{2}
  24. 실효값은 그 제곱근입니다.

    Vrms=VpkDV_\mathrm{rms} = V_\mathrm{pk} \sqrt{D}

    ✓ 재현하는 수식 fourier.pulse.rms (pytest가 sympy로 일치를 검증함)

  25. 리플 전류는 커패시터의 직렬 저항을 흐르며, 이 저항의 전압은 매 순간 전류를 따릅니다. 최댓값과 최솟값의 차는 다음과 같습니다.

    ΔvESR=iC,maxRESR−iC,minRESR\Delta v_\mathrm{ESR} = i_{C,\mathrm{max}} R_\mathrm{ESR} - i_{C,\mathrm{min}} R_\mathrm{ESR}
  26. 전류의 피크-피크 값은 최댓값에서 최솟값을 뺀 값입니다.

    ΔvESR=RESRΔiL,pp\Delta v_\mathrm{ESR} = R_\mathrm{ESR} \Delta i_{L,\mathrm{pp}}

    ✓ 재현하는 수식 cap.esr.ripple (pytest가 sympy로 일치를 검증함)

  27. 코어를 한 바퀴 도는 경로에 앙페르 법칙을 적용하면, HH의 선적분은 감싸인 전류, 즉 각각 IwI_w가 흐르는 NN턴의 전류와 같습니다. 공극이 없고 자계가 균일한 코어에서 이 선적분은 HH와 자로 길이의 곱입니다.

    Hle=IwNH l_e = I_w N
  28. HH에 대해 풉니다.

    H=NIwleH = \frac{N I_w}{l_e}

    ✓ 재현하는 수식 mag.H_ampere (pytest가 sympy로 일치를 검증함)

  29. 한 코어에 감긴 두 권선에 패러데이 법칙을 적용하면, 각 권선 전압은 턴 수에 공통 자속의 변화율을 곱한 값입니다. 1차 권선에서는 다음과 같습니다.

    V1=NpdΦ/dtV_1 = N_p \mathrm{d}\Phi/\mathrm{d}t
  30. 2차 권선에서는 다음과 같습니다.

    V2=NsdΦ/dtV_2 = N_s \mathrm{d}\Phi/\mathrm{d}t
  31. 두 식을 나누면 자속 항이 소거되며, 턴 수의 비는 nn입니다(1:n 규약).

    V2=nV1V_2 = n V_1

    ✓ 재현하는 수식 xfmr.V2 (pytest가 sympy로 일치를 검증함)

  32. 자기저항이 0인 이상적인 코어에 앙페르 법칙을 적용하면 순 기자력은 0입니다.

    I1Np−I2Ns=0I_1 N_p - I_2 N_s = 0
  33. Ns=nNpN_s = n N_p로 놓고 2차 전류에 대해 풉니다.

    I2=I1nI_2 = \frac{I_1}{n}

    ✓ 재현하는 수식 xfmr.I2 (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/foundations.py

평균화(averaging), 평형 조건(balance), 평균 모델의 손실

섹션 제목: “평균화(averaging), 평형 조건(balance), 평균 모델의 손실”

스위칭 컨버터는 직류 입력을 스위칭해 펄스열로 만들고, 저역통과 필터가 그 평균을 남깁니다. 각 회로 방정식을 한 주기에 걸쳐 평균하면 스위칭 회로가 직류 모델이 되며, 인덕터 권선 저항 RLR_L 같은 손실은 일반 저항으로 나타납니다.

  1. 벅의 스위치 노드는 0<t<DTs0 < t < D T_s 동안 VgV_g, DTs<t<TsD T_s < t < T_s 동안 00입니다. 이를 한 주기에 걸쳐 평균합니다.

    ⟨vs⟩=∫0Tsvs dtTs\langle v_s \rangle = \frac{\int\limits_{0}^{T_s} v_s\, dt}{T_s}
  2. 두 구간의 적분을 계산합니다.

    ⟨vs⟩=DVg\langle v_s \rangle = D V_g

    ✓ 재현하는 수식 sw.v_avg (pytest가 sympy로 일치를 검증함)

  3. 인덕터는 vL=L di/dtv_L = L \, di/dt를 따릅니다. 한 주기에 걸쳐 적분하면 전류의 변화는 전압의 적분을 LL로 나눈 값입니다.

    Δi=∫0TsvL dtL\Delta i = \frac{\int\limits_{0}^{T_s} v_L\, dt}{L}
  4. DTsD T_s 동안 vL,onv_{L,\mathrm{on}}, 나머지 시간 동안 vL,offv_{L,\mathrm{off}}인 전압이라면 적분은 한 주기 평균에 TsT_s를 곱한 값입니다.

    ⟨vL⟩=vL,off+vL,onD−vL,offD\langle v_L \rangle = v_{L,\mathrm{off}} + v_{L,\mathrm{on}} D - v_{L,\mathrm{off}} D
  5. 따라서 한 주기 동안의 변화는 평균 전압에 TsT_s를 곱해 LL로 나눈 값이며, 평균이 0일 때만 0입니다(전압-초 평형).

    Δi=⟨vL⟩TsL\Delta i = \frac{\langle v_L \rangle T_s}{L}

    ✓ 재현하는 수식 vsb.drift (pytest가 sympy로 일치를 검증함)

  6. 소리플 근사를 쓰면 인덕터 전압(또는 커패시터 전류)은 DTsD T_s 동안 xonx_\mathrm{on}, (1−D)Ts(1 - D) T_s 동안 xoffx_\mathrm{off} 값을 가지며, 그 평균은 0이어야 합니다.

    xoff(1−D)+xonD=0x_\mathrm{off} \left(1 - D\right) + x_\mathrm{on} D = 0
  7. 인덕터 전압(x=vLx = v_L)에 대해서는 전압-초 평형입니다.

    vL,off=DvL,on−1+D=−DvL,on1−Dv_{L,\mathrm{off}} = \frac{D v_{L,\mathrm{on}}}{-1 + D} = - \frac{D v_{L,\mathrm{on}}}{1 - D}

    ✓ 재현하는 수식 vsb.v_off (pytest가 sympy로 일치를 검증함)

  8. 커패시터 전류(x=iCx = i_C)에 대해서는 전하 평형입니다.

    iC,off=DiC,on−1+D=−DiC,on1−Di_{C,\mathrm{off}} = \frac{D i_{C,\mathrm{on}}}{-1 + D} = - \frac{D i_{C,\mathrm{on}}}{1 - D}

    ✓ 재현하는 수식 csb.i_off (pytest가 sympy로 일치를 검증함)

  9. 인덕터 권선 저항 RLR_L이 있는 부스트의 전압-초 평형: 인덕터에는 스위치 온 구간에 Vg−IRLV_g - I R_L, 다이오드 도통 구간에 Vg−IRL−VV_g - I R_L - V가 걸립니다(II = 인덕터 직류 전류).

    D(Vg−IRL)+(1−D)(Vg−V−IRL)=0D \left(V_g - I R_L\right) + \left(1 - D\right) \left(V_g - V - I R_L\right) = 0
  10. 출력 커패시터의 전하 평형: 커패시터 전류는 스위치 온 구간에 −V/R-V/R, 다이오드 도통 구간에 I−V/RI - V/R입니다.

    (1−D)(I−VR)−DVR=0\left(1 - D\right) \left(I - \frac{V}{R}\right) - \frac{D V}{R} = 0
  11. 두 1차 방정식을 II에 대해 풉니다.

    I=VgR+RL−2DR+RD2I = \frac{V_g}{R + R_L - 2 D R + R D^{2}}
  12. M=V/VgM = V/V_g에 대해서도 풉니다.

    M=R(1−D)R+RL−2DR+RD2=1(1−D)(1+RL(1−D)2R)M = \frac{R \left(1 - D\right)}{R + R_L - 2 D R + R D^{2}} = \frac{1}{\left(1 - D\right) \left(1 + \frac{R_L}{\left(1 - D\right)^{2} R}\right)}

    ✓ 재현하는 수식 boost.ccm.M_RL (pytest가 sympy로 일치를 검증함)

  13. 효율은 출력 전력 V2/RV^2/R을 입력 전력 VgIV_g I로 나눈 값입니다.

    η=R(−1+D)2R+RL−2DR+RD2=11+RL(1−D)2R\eta = \frac{R \left(-1 + D\right)^{2}}{R + R_L - 2 D R + R D^{2}} = \frac{1}{1 + \frac{R_L}{\left(1 - D\right)^{2} R}}

    ✓ 재현하는 수식 boost.ccm.eta_RL (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/averaging.py

주기적 정상상태에서는 모든 인덕터 전류가 한 스위칭 주기의 끝에서 시작값으로 돌아오므로 한 주기 동안의 평균 인덕터 전압은 0입니다. 소리플 근사를 쓰면 각 구간에 걸리는 전압이 일정하므로 이 평형 조건은 출력 전압에 대한 1차 방정식이 됩니다.

  1. 전압-초 평형: 한 스위칭 주기 동안 평균한 인덕터 전압은 0입니다.

    ⟨vL⟩=0\langle v_L \rangle = 0
  2. 벅: 인덕터에는 스위치 온 구간(비율 DD)에 Vg−VV_g - V, 다이오드 도통 구간(1−D1 - D)에 −V-V가 걸립니다.

    D(Vg−V)−V(1−D)=0D \left(V_g - V\right) - V \left(1 - D\right) = 0
  3. VV에 대해 풀고 VgV_g로 나눕니다.

    M=DM = D

    ✓ 재현하는 수식 buck.ccm.M (pytest가 sympy로 일치를 검증함)

  4. 부스트: 스위치 온 구간에는 VgV_g, 다이오드 도통 구간에는 Vg−VV_g - V가 걸립니다.

    DVg+(1−D)(Vg−V)=0D V_g + \left(1 - D\right) \left(V_g - V\right) = 0
  5. VV에 대해 풉니다.

    M=−1−1+D=11−DM = - \frac{1}{-1 + D} = \frac{1}{1 - D}

    ✓ 재현하는 수식 boost.ccm.M (pytest가 sympy로 일치를 검증함)

  6. 벅-부스트: 스위치 온 구간에는 VgV_g, 다이오드 도통 구간에는 (음의) 출력 전압 VV가 걸립니다.

    V(1−D)+DVg=0V \left(1 - D\right) + D V_g = 0
  7. VV에 대해 풉니다. 출력 극성은 반전됩니다.

    M=D−1+D=−D1−DM = \frac{D}{-1 + D} = - \frac{D}{1 - D}

    ✓ 재현하는 수식 buckboost.ccm.M (pytest가 sympy로 일치를 검증함)

  8. 플라이백(1:nn, 1차 측 자화 인덕턴스): 스위치 온 구간에는 VgV_g가 걸리고, 다이오드 도통 구간에는 2차 측이 VV로 클램프되어 1차 측에 −V/n-V/n으로 반사됩니다.

    DVg−V(1−D)n=0D V_g - \frac{V \left(1 - D\right)}{n} = 0
  9. VV에 대해 풉니다.

    M=−Dn−1+D=nD1−DM = - \frac{D n}{-1 + D} = \frac{n D}{1 - D}

    ✓ 재현하는 수식 flyback.ccm.M (pytest가 sympy로 일치를 검증함)

  10. 포워드: 스위치 온 구간에 2차 측이 출력 필터에 nVgnV_g를 인가하므로 출력 인덕터에는 nVg−VnV_g - V가 걸리고, 환류 다이오드 도통 구간에는 −V-V가 걸립니다.

    D(−V+Vgn)−V(1−D)=0D \left(- V + V_g n\right) - V \left(1 - D\right) = 0
  11. VV에 대해 풉니다.

    M=nDM = n D

    ✓ 재현하는 수식 forward.ccm.M (pytest가 sympy로 일치를 검증함)

  12. 포워드 리셋: 자화 인덕턴스에는 DTsD T_s 동안 VgV_g가 걸리고, 이후 자화 전류가 0으로 돌아올 때까지 D2TsD_2 T_s 동안 리셋 권선(NrN_r 턴)이 이 전압을 −Vg/nr-V_g/n_r로 클램프합니다.

    DVg−D2Vgnr=0D V_g - \frac{D_2 V_g}{n_r} = 0
  13. 리셋 구간을 구합니다.

    D2=DnrD_2 = D n_r
  14. 리셋은 한 주기 안에 끝나야 하므로 D+D2≤1D + D_2 \le 1이며, 등호일 때 듀티비가 최대입니다.

    Dmax=11+nrD_\mathrm{max} = \frac{1}{1 + n_r}

    ✓ 재현하는 수식 forward.reset.Dmax (pytest가 sympy로 일치를 검증함)

  15. 벅 리플: 온 구간 DTsD T_s 동안 인덕터 전류가 기울기 (Vg−V)/L(V_g - V)/L로 증가하며, 이 증가량이 피크-피크 리플, 즉 2ΔiL2\Delta i_L입니다.

    2ΔiL=DTs(Vg−V)L2 \Delta i_L = \frac{D T_s \left(V_g - V\right)}{L}
  16. 그 절반이 Erickson의 ΔiL\Delta i_L입니다.

    ΔiL=(Vg−V)DTs2L\Delta i_L = \frac{\left(V_g - V\right) D T_s}{2 L}

    ✓ 재현하는 수식 buck.ripple.iL (pytest가 sympy로 일치를 검증함)

  17. Ts=1/fsT_s = 1/f_s로 쓴 피크-피크 값.

    ΔiL,pp=(Vg−V)DLfs\Delta i_{L,\mathrm{pp}} = \frac{\left(V_g - V\right) D}{L f_s}

    ✓ 재현하는 수식 buck.ripple.iL_pp (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/ccm_ratios.py

인덕터 전류 리플이 커져 전류가 0에 닿으면 컨버터는 CCM을 벗어납니다. 경계에서는 리플의 절반 ΔiL\Delta i_L이 인덕터 직류 전류와 같습니다. DCM에서는 스위치와 다이오드가 모두 꺼진 세 번째 구간 D3TsD_3 T_s가 생기고 그 길이를 모르므로, 전압-초 평형에 커패시터 전하 평형(평균 다이오드 전류 또는 평균 인덕터 전류가 부하 전류와 같음)을 함께 씁니다.

  1. 이 유도 전체에서 쓰는 정의: K=2L/(RTs)K = 2L/(R T_s), 즉 L=KRTs/2L = K R T_s/2.

    K=2LRTsK = \frac{2 L}{R T_s}
  2. 벅: 인덕터 직류 전류는 부하 전류 V/RV/R이며, CCM에서 V=DVgV = D V_g입니다.

    IL=DVgRI_L = \frac{D V_g}{R}
  3. CCM 동작점을 대입한 온 구간의 리플 절반.

    ΔiL=DTs(Vg−DVg)2L\Delta i_L = \frac{D T_s \left(V_g - D V_g\right)}{2 L}
  4. 경계 조건 ΔiL=IL\Delta i_L = I_L에 L=KRTs/2L = K R T_s/2를 넣고 KK에 대해 풉니다.

    Kcrit=1−DK_\mathrm{crit} = 1 - D

    ✓ 재현하는 수식 Kcrit.buck (pytest가 sympy로 일치를 검증함)

  5. 부스트: 인덕터에는 입력 전류 V/((1−D)R)V/((1 - D)R)가 흐르며, V=Vg/(1−D)V = V_g/(1 - D)입니다.

    IL=VgR(1−D)2I_L = \frac{V_g}{R \left(1 - D\right)^{2}}
  6. CCM 동작점을 대입한 온 구간의 리플 절반.

    ΔiL=DTsVg2L\Delta i_L = \frac{D T_s V_g}{2 L}
  7. 경계 조건 ΔiL=IL\Delta i_L = I_L에 L=KRTs/2L = K R T_s/2를 넣고 KK에 대해 풉니다.

    Kcrit=D(−1+D)2=D(1−D)2K_\mathrm{crit} = D \left(-1 + D\right)^{2} = D \left(1 - D\right)^{2}

    ✓ 재현하는 수식 Kcrit.boost (pytest가 sympy로 일치를 검증함)

  8. 벅-부스트: 인덕터 전류는 ∣V∣/((1−D)R)|V|/((1 - D)R)이며, ∣V∣=DVg/(1−D)|V| = D V_g/(1 - D)입니다.

    IL=DVgR(1−D)2I_L = \frac{D V_g}{R \left(1 - D\right)^{2}}
  9. CCM 동작점을 대입한 온 구간의 리플 절반.

    ΔiL=DTsVg2L\Delta i_L = \frac{D T_s V_g}{2 L}
  10. 경계 조건 ΔiL=IL\Delta i_L = I_L에 L=KRTs/2L = K R T_s/2를 넣고 KK에 대해 풉니다.

    Kcrit=(−1+D)2=(1−D)2K_\mathrm{crit} = \left(-1 + D\right)^{2} = \left(1 - D\right)^{2}

    ✓ 재현하는 수식 Kcrit.buckboost (pytest가 sympy로 일치를 검증함)

  11. 경계에서 KK는 KcritK_\mathrm{crit}과 같으므로, KK의 정의를 LL에 대해 풉니다.

    Lcrit=KcritRTs2L_\mathrm{crit} = \frac{K_\mathrm{crit} R T_s}{2}

    ✓ 재현하는 수식 L.crit (pytest가 sympy로 일치를 검증함)

  12. 벅 DCM, V=MVgV = M V_g로 쓴 전압-초 평형: DTsD T_s 동안 Vg−VV_g - V, D2TsD_2 T_s 동안 −V-V, D3TsD_3 T_s 동안 00.

    D(Vg−MVg)−D2MVg=0D \left(V_g - M V_g\right) - D_2 M V_g = 0
  13. D2D_2를 구합니다.

    D2=−D+DM=D(1−M)MD_2 = - D + \frac{D}{M} = \frac{D \left(1 - M\right)}{M}

    ✓ 재현하는 수식 buck.dcm.D2 (pytest가 sympy로 일치를 검증함)

  14. 온 구간 끝의 인덕터 피크 전류.

    ipk=DTs(Vg−MVg)Li_\mathrm{pk} = \frac{D T_s \left(V_g - M V_g\right)}{L}
  15. 전하 평형: 평균 인덕터 전류(높이 ipki_\mathrm{pk}, 밑변 (D+D2)Ts(D + D_2)T_s인 삼각형)가 부하 전류 V/RV/R과 같습니다.

    TsD2(Vg−MVg)2LM=MVgR\frac{T_s D^{2} \left(V_g - M V_g\right)}{2 L M} = \frac{M V_g}{R}
  16. L=KRTs/2L = K R T_s/2를 대입하고 MM에 대한 2차식의 양의 근을 택합니다.

    M=D(−D+4K+D2)2K=21+1+4KD2M = \frac{D \left(- D + \sqrt{4 K + D^{2}}\right)}{2 K} = \frac{2}{1 + \sqrt{1 + \frac{4 K}{D^{2}}}}

    ✓ 재현하는 수식 buck.dcm.M (pytest가 sympy로 일치를 검증함)

  17. 부스트 DCM 전압-초 평형: DTsD T_s 동안 VgV_g, D2TsD_2 T_s 동안 Vg−VV_g - V.

    DVg+D2(Vg−MVg)=0D V_g + D_2 \left(V_g - M V_g\right) = 0
  18. D2D_2를 구합니다.

    D2=D−1+MD_2 = \frac{D}{-1 + M}
  19. 출력의 전하 평형: 평균 다이오드 전류(D2TsD_2 T_s 동안 높이 ipki_\mathrm{pk}인 삼각형)가 부하 전류와 같습니다.

    TsVgD22L(−1+M)=MVgR\frac{T_s V_g D^{2}}{2 L \left(-1 + M\right)} = \frac{M V_g}{R}
  20. L=KRTs/2L = K R T_s/2를 대입하고 M>1M > 1인 근을 택합니다.

    M=12+K+4D22K=1+1+4D2K2M = \frac{1}{2} + \frac{\sqrt{K + 4 D^{2}}}{2 \sqrt{K}} = \frac{1 + \sqrt{1 + \frac{4 D^{2}}{K}}}{2}

    ✓ 재현하는 수식 boost.dcm.M (pytest가 sympy로 일치를 검증함)

  21. 벅-부스트 DCM, 음의 출력 V=MVgV = M V_g로 쓴 전압-초 평형: DTsD T_s 동안 VgV_g, D2TsD_2 T_s 동안 VV.

    DVg+D2VgM=0D V_g + D_2 V_g M = 0
  22. D2D_2를 구합니다.

    D2=−DMD_2 = - \frac{D}{M}
  23. 전하 평형: 평균 다이오드 전류가 부하 전류 ∣V∣/R|V|/R과 같습니다.

    −TsVgD22LM=−VgMR- \frac{T_s V_g D^{2}}{2 L M} = - \frac{V_g M}{R}
  24. L=KRTs/2L = K R T_s/2를 대입해 풉니다(M<0M < 0).

    M=−DKM = - \frac{D}{\sqrt{K}}

    ✓ 재현하는 수식 buckboost.dcm.M (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/dcm.py

플라이백: DCM 변환비, 경계, 스트레스, 무손실 저항(loss-free resistor)

섹션 제목: “플라이백: DCM 변환비, 경계, 스트레스, 무손실 저항(loss-free resistor)”

플라이백은 스위치 온 구간에 자화 인덕턴스 LML_M에 에너지를 저장하고, 오프 구간에 다이오드를 통해 출력으로 내보냅니다. 1:nn 변압기(n=Ns/Npn = N_s/N_p)에서 2차 측 전압은 nn으로 나뉘어 1차 측에 반사되고, 2차 측 전류는 1차 측 환산 자화 전류를 nn으로 나눈 값입니다.

  1. 온 구간: LML_M 양단에 VgV_g가 걸려 자화 전류가 0(DCM)에서 ipki_\mathrm{pk}까지 증가합니다.

    ipk=DTsVgLMi_\mathrm{pk} = \frac{D T_s V_g}{L_M}
  2. LML_M의 전압-초 평형: DTsD T_s 동안 VgV_g, 이후 D2TsD_2 T_s 동안 반사된 출력 −V/n-V/n.

    DVg−D2Vn=0D V_g - \frac{D_2 V}{n} = 0
  3. D2D_2를 구합니다.

    D2=DVgnVD_2 = \frac{D V_g n}{V}
  4. 전하 평형: 2차 측 전류는 ipk/ni_\mathrm{pk}/n에서 시작해 D2TsD_2 T_s 동안 0으로 감소하며, 그 평균이 부하 전류 V/RV/R과 같습니다.

    TsD2Vg22LMV=VR\frac{T_s D^{2} V_g^{2}}{2 L_M V} = \frac{V}{R}
  5. LM=KRTs/2L_M = K R T_s/2를 대입해 V/VgV/V_g를 구합니다. nn은 소거됩니다.

    M=DKM = \frac{D}{\sqrt{K}}

    ✓ 재현하는 수식 flyback.dcm.M (pytest가 sympy로 일치를 검증함)

  6. DCM 출력 전압을 대입한 DCM 감자(demagnetizing) 구간.

    D2=nKD_2 = n \sqrt{K}
  7. 감자 구간이 주기의 나머지를 모두 채울 때, 즉 D+D2=1D + D_2 = 1일 때 경계에 도달합니다.

    Kcrit=(−1+D)2n2=(1−D)2n2K_\mathrm{crit} = \frac{\left(-1 + D\right)^{2}}{n^{2}} = \frac{\left(1 - D\right)^{2}}{n^{2}}

    ✓ 재현하는 수식 Kcrit.flyback (pytest가 sympy로 일치를 검증함)

  8. 출력이 VV로 고정되고(배터리 또는 정전압 버스) 다이오드 강하가 VDV_D이면, 감자 구간의 반사 전압은 −(V+VD)/n-(V + V_D)/n입니다.

    DVg+D2(−V−VD)n=0D V_g + \frac{D_2 \left(- V - V_D\right)}{n} = 0
  9. D+D2=1D + D_2 = 1로 두면 컨버터가 CCM에 들어가는 입력 전압을 얻습니다. 그 이상에서는 CCM 전압-초 평형이 VgV_g를 이 값에 묶어 둡니다.

    Vg,crit=V+VD−D(V+VD)Dn=(V+VD)(1−D)nDV_{g,\mathrm{crit}} = \frac{V + V_D - D \left(V + V_D\right)}{D n} = \frac{\left(V + V_D\right) \left(1 - D\right)}{n D}

    ✓ 재현하는 수식 flyback.V_crit (pytest가 sympy로 일치를 검증함)

  10. 다이오드가 도통하는 동안 1차 권선의 반사 전압 (V+VD)/n(V + V_D)/n이 VgV_g에 더해지므로, 오프 상태의 스위치 전압은 그 합입니다(누설 스파이크는 이 위에 더해집니다).

    VDS=Vg+V+VDnV_\mathrm{DS} = V_g + \frac{V + V_D}{n}

    ✓ 재현하는 수식 flyback.Vds_off (pytest가 sympy로 일치를 검증함)

  11. 입력이 Vg,critV_{g,\mathrm{crit}}에 묶이면 오프 상태의 스위치 전압이 간단해집니다.

    VDS=V+VDnDV_\mathrm{DS} = \frac{V + V_D}{n D}

    ✓ 재현하는 수식 flyback.Vds_clamped (pytest가 sympy로 일치를 검증함)

  12. 스위치 온 구간에는 2차 권선 전압 nVgn V_g가 출력 전압에 더해져 역바이어스된 다이오드에 걸립니다.

    VR=V+nVgV_R = V + n V_g

    ✓ 재현하는 수식 flyback.diode.VR (pytest가 sympy로 일치를 검증함)

  13. CCM 전하 평형: 다이오드가 도통하는 (1−D)Ts(1 - D) T_s 동안 2차 측에는 IM/nI_M/n이 흐르며(소리플 근사), 그 평균이 부하 전류 V/RV/R과 같습니다.

    IM(1−D)n=VR\frac{I_M \left(1 - D\right)}{n} = \frac{V}{R}
  14. IMI_M에 대해 풉니다.

    IM=−VnR(−1+D)=nV(1−D)RI_M = - \frac{V n}{R \left(-1 + D\right)} = \frac{n V}{\left(1 - D\right) R}

    ✓ 재현하는 수식 flyback.IM (pytest가 sympy로 일치를 검증함)

  15. 온 구간: DTsD T_s 동안 LML_M 양단에 VgV_g가 걸리므로 자화 전류는 리플 절반 ΔiM\Delta i_M의 두 배만큼 증가합니다.

    2ΔiM=DTsVgLM2 \Delta i_M = \frac{D T_s V_g}{L_M}
  16. ΔiM\Delta i_M에 대해 풉니다.

    ΔiM=VgDTs2LM\Delta i_M = \frac{V_g D T_s}{2 L_M}

    ✓ 재현하는 수식 flyback.ripple.iM (pytest가 sympy로 일치를 검증함)

  17. 스위치가 켜져 있는 동안 다이오드는 꺼져 있으므로 DTsD T_s 동안 커패시터만이 부하 전류 V/RV/R을 공급하고, 그 전압은 리플 절반 Δv\Delta v의 두 배만큼 떨어집니다.

    2Δv=DTsVCR2 \Delta v = \frac{D T_s V}{C R}
  18. Δv\Delta v에 대해 풉니다.

    Δv=VDTs2RC\Delta v = \frac{V D T_s}{2 R C}

    ✓ 재현하는 수식 flyback.ripple.v (pytest가 sympy로 일치를 검증함)

  19. Ts=1/fsT_s = 1/f_s로 쓴 DCM 피크 자화 전류.

    Ipk=VgDLMfsI_\mathrm{pk} = \frac{V_g D}{L_M f_s}

    ✓ 재현하는 수식 flyback.Ipk.dcm (pytest가 sympy로 일치를 검증함)

  20. 매 온 구간이 끝날 때 LML_M에 저장된 에너지입니다(DCM에서는 매 주기 이 에너지가 모두 전달됩니다).

    E=D2Ts2Vg22LME = \frac{D^{2} T_s^{2} V_g^{2}}{2 L_M}
  21. 전력은 주기당 에너지 × 스위칭 주파수입니다. VgV_g, DD, LML_M, fsf_s로 정해지며 부하와는 무관합니다.

    P=Vg2D22LMfsP = \frac{V_g^{2} D^{2}}{2 L_M f_s}

    ✓ 재현하는 수식 dcm.P_in (pytest가 sympy로 일치를 검증함)

  22. P=Vg2/RinP = V_g^2/R_\mathrm{in}이므로 입력은 아무것도 소산하지 않는 저항(무손실 저항)처럼 동작합니다.

    Rin=2LMfsD2R_\mathrm{in} = \frac{2 L_M f_s}{D^{2}}

    ✓ 재현하는 수식 lfr.R_in (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/flyback.py

플라이백 클램프: 반사 전압(reflected voltage), 클램프 손실, 출력 상한

섹션 제목: “플라이백 클램프: 반사 전압(reflected voltage), 클램프 손실, 출력 상한”

플라이백의 스위치가 꺼지면 자화 전류는 2차 측으로 넘어가지만, 누설 인덕턴스 LlkL_\mathrm{lk}의 전류는 1차 측에 연결된 클램프 외에는 흐를 곳이 없습니다. 클램프는 이 전류가 0으로 줄어들 때까지 1차 측을 VclampV_\mathrm{clamp}에 묶어 둡니다.

  1. 출력 다이오드가 도통하는 동안 2차 권선에는 출력 전압과 다이오드 전압 강하의 합이 걸립니다.

    vs=V+VDv_s = V + V_D
  2. 이상적인 1:nn 변압기에서 2차 측 전압은 1차 측에서 nn으로 나뉩니다.

    VOR=V+VDnV_\mathrm{OR} = \frac{V + V_D}{n}

    ✓ 재현하는 수식 flyback.V_OR (pytest가 sympy로 일치를 검증함)

  3. 스위치는 입력과 1차 권선 사이에 있으며, 클램프가 도통하는 동안 1차 권선은 VclampV_\mathrm{clamp}에 묶입니다.

    VDS=Vg+VclampV_\mathrm{DS} = V_g + V_\mathrm{clamp}

    ✓ 재현하는 수식 clamp.Vds (pytest가 sympy로 일치를 검증함)

  4. 출력 다이오드가 도통하는 동안 자화 인덕턴스 양단은 VORV_\mathrm{OR}이므로, 누설 인덕턴스에는 Vclamp−VORV_\mathrm{clamp} - V_\mathrm{OR}가 걸려 전류가 IpkI_\mathrm{pk}에서 선형으로 감소합니다.

    ilk=Ipk−t(Vclamp−VOR)Llki_\mathrm{lk} = I_\mathrm{pk} - \frac{t \left(V_\mathrm{clamp} - V_\mathrm{OR}\right)}{L_\mathrm{lk}}
  5. 전류는 이 시간 뒤에 0이 되며, 이 시간은 오프 시간 안에 들어가야 합니다.

    tr=LlkIpkVclamp−VORt_r = \frac{L_\mathrm{lk} I_\mathrm{pk}}{V_\mathrm{clamp} - V_\mathrm{OR}}

    ✓ 재현하는 수식 clamp.t_reset (pytest가 sympy로 일치를 검증함)

  6. 클램프는 클램프 전압과 감소하는 이 전류의 곱을 흡수합니다. 그동안 반사 전압이 전류를 계속 밀어 주므로 흡수하는 에너지는 누설 에너지 12LlkIpk2\tfrac12 L_\mathrm{lk} I_\mathrm{pk}^2보다 많습니다.

    Eclamp=LlkVclampIpk22(Vclamp−VOR)E_\mathrm{clamp} = \frac{L_\mathrm{lk} V_\mathrm{clamp} I_\mathrm{pk}^{2}}{2 \left(V_\mathrm{clamp} - V_\mathrm{OR}\right)}
  7. 스위칭 주기마다 한 번씩.

    Pclamp=LlkVclampfsIpk22(Vclamp−VOR)=LlkIpk2fsVclamp2(Vclamp−VOR)P_\mathrm{clamp} = \frac{L_\mathrm{lk} V_\mathrm{clamp} f_s I_\mathrm{pk}^{2}}{2 \left(V_\mathrm{clamp} - V_\mathrm{OR}\right)} = \frac{L_\mathrm{lk} I_\mathrm{pk}^{2} f_s V_\mathrm{clamp}}{2 \left(V_\mathrm{clamp} - V_\mathrm{OR}\right)}

    ✓ 재현하는 수식 clamp.P (pytest가 sympy로 일치를 검증함)

  8. RCD 클램프에서는 커패시터가 VclampV_\mathrm{clamp}를 유지하고 저항이 클램프 전력을 소산합니다.

    Vclamp2Rclamp=LlkVclampfsIpk22(Vclamp−VOR)\frac{V_\mathrm{clamp}^{2}}{R_\mathrm{clamp}} = \frac{L_\mathrm{lk} V_\mathrm{clamp} f_s I_\mathrm{pk}^{2}}{2 \left(V_\mathrm{clamp} - V_\mathrm{OR}\right)}
  9. VORV_\mathrm{OR}보다 큰 근.

    Vclamp=VOR+VOR2+2RclampLlkIpk2fs2V_\mathrm{clamp} = \frac{V_\mathrm{OR} + \sqrt{V_\mathrm{OR}^{2} + 2 R_\mathrm{clamp} L_\mathrm{lk} I_\mathrm{pk}^{2} f_s}}{2}

    ✓ 재현하는 수식 clamp.rcd.V (pytest가 sympy로 일치를 검증함)

  10. 부하를 제거하고 레귤레이션이 없으면 출력은 계속 충전되고, 반사 전압은 클램프 전압에 도달할 때까지 오릅니다. 그 뒤에는 클램프가 입력 전력을 모두 가져갑니다. 이는 전압이 그 전력에 따라 변하지 않는 클램프(TVS)에 해당하며, RCD 클램프의 전압은 그 전력에 따라 올라갑니다.

    VD+Vo,maxn=Vclamp\frac{V_D + V_\mathrm{o,max}}{n} = V_\mathrm{clamp}
  11. 출력 전압에 대해 풉니다.

    Vo,max=nVclamp−VDV_\mathrm{o,max} = n V_\mathrm{clamp} - V_D

    ✓ 재현하는 수식 flyback.V_ceiling (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/clamp.py

스너버(snubber): 링잉에서 구한 기생 성분, 감쇠 저항, 손실

섹션 제목: “스너버(snubber): 링잉에서 구한 기생 성분, 감쇠 저항, 손실”

스위칭 에지는 노드의 기생 인덕턴스와 커패시턴스를 링잉시킵니다. 레이아웃에서 읽을 수 없는 이 값들은 링잉 주파수를 두 번, 즉 원래 회로에서 한 번, 값을 아는 커패시터를 추가해서 한 번 재면 구할 수 있습니다.

  1. 원래 회로에서 노드는 인덕턴스와 커패시턴스의 공진 주파수로 링잉합니다.

    fr0=12πCparLparf_{r0} = \frac{1}{2 \pi \sqrt{C_\mathrm{par}} \sqrt{L_\mathrm{par}}}
  2. 노드에 값을 아는 커패시터를 달면 커패시턴스는 그만큼 늘고 인덕턴스는 그대로입니다.

    fr1=12πLparCadd+Cparf_{r1} = \frac{1}{2 \pi \sqrt{L_\mathrm{par}} \sqrt{C_\mathrm{add} + C_\mathrm{par}}}
  3. 두 주파수의 비 x=fr0/fr1x = f_{r0}/f_{r1}에서 인덕턴스가 소거됩니다.

    x2=Cadd+CparCparx^{2} = \frac{C_\mathrm{add} + C_\mathrm{par}}{C_\mathrm{par}}
  4. 노드의 커패시턴스에 대해 풀면:

    Cpar=Caddfr12fr02−fr12=Cadd(fr0fr1)2−1C_\mathrm{par} = \frac{C_\mathrm{add} f_{r1}^{2}}{f_{r0}^{2} - f_{r1}^{2}} = \frac{C_\mathrm{add}}{\left(\frac{f_{r0}}{f_{r1}}\right)^{2} - 1}

    ✓ 재현하는 수식 snub.C_par (pytest가 sympy로 일치를 검증함)

  5. 그러면 첫 번째 공진에서 인덕턴스가 나옵니다.

    Lpar=14π2fr02CparL_\mathrm{par} = \frac{1}{4 \pi^{2} f_{r0}^{2} C_\mathrm{par}}

    ✓ 재현하는 수식 snub.L_par (pytest가 sympy로 일치를 검증함)

  6. AN11160은 기생 인덕턴스, 스너버 저항, 스너버 커패시터를 직렬로 본 루프의 감쇠 계수를 쓰며, 노드 자체의 커패시턴스는 넣지 않습니다. 이 루프의 고유 주파수는 다음 식을 만족합니다.

    1+sCsnubRsnub+CsnubLpars2=01 + s C_\mathrm{snub} R_\mathrm{snub} + C_\mathrm{snub} L_\mathrm{par} s^{2} = 0
  7. LparCsnubL_\mathrm{par} C_\mathrm{snub}로 나누어 ω0=1/LparCsnub\omega_0 = 1/\sqrt{L_\mathrm{par} C_\mathrm{snub}}인 s2+2ζω0s+ω02=0s^2 + 2\zeta\omega_0 s + \omega_0^2 = 0 꼴로 쓰면, 감쇠 계수는 다음과 같습니다.

    ζ=RsnubCsnub2Lpar\zeta = \frac{R_\mathrm{snub} \sqrt{C_\mathrm{snub}}}{2 \sqrt{L_\mathrm{par}}}
  8. 저항에 대해 풀면:

    Rsnub=2ζLparCsnubR_\mathrm{snub} = 2 \zeta \sqrt{\frac{L_\mathrm{par}}{C_\mathrm{snub}}}

    ✓ 재현하는 수식 snub.R (pytest가 sympy로 일치를 검증함)

  9. 에지에서 노드 전압이 VsnubV_\mathrm{snub}만큼 바뀌면 스너버 커패시터가 저항을 통해 충전되며, 전류는 i=(Vsnub/R) e−t/(RCsnub)i = (V_\mathrm{snub}/R)\,e^{-t/(R C_\mathrm{snub})}입니다. 저항이 가져가는 에너지는 RR과 무관합니다.

    ER=CsnubVsnub22E_R = \frac{C_\mathrm{snub} V_\mathrm{snub}^{2}}{2}
  10. 다음 에지에서는 커패시터가 저항과 켜지는 스위치를 통해 방전하며 저장된 에너지, 즉 같은 양을 다시 잃습니다. 따라서 한 주기에 잃는 에너지는 다음과 같습니다.

    2ER=CsnubVsnub22 E_R = C_\mathrm{snub} V_\mathrm{snub}^{2}
  11. 초당 fsf_s 주기이므로:

    P=CsnubVsnub2fsP = C_\mathrm{snub} V_\mathrm{snub}^{2} f_s

    ✓ 재현하는 수식 snub.P (pytest가 sympy로 일치를 검증함)

  12. AN11160은 기생 인덕턴스에 전류 IringI_\mathrm{ring}이 흐르는 동안 커패시터를 충전하는 에지로 저항의 정격을 정합니다. 전원은 커패시터의 전하 CsnubVsnubC_\mathrm{snub} V_\mathrm{snub}을 전압 VsnubV_\mathrm{snub}에서 공급합니다.

    Es=CsnubVsnub2E_s = C_\mathrm{snub} V_\mathrm{snub}^{2}
  13. 커패시터는 그 에너지의 절반을 저장하고 인덕턴스는 자신의 에너지 LparIring2/2L_\mathrm{par} I_\mathrm{ring}^2/2를 모두 내놓습니다. 나머지는 저항값과 관계없이 저항이 가져갑니다.

    WR=CsnubVsnub22+LparIring22W_R = \frac{C_\mathrm{snub} V_\mathrm{snub}^{2}}{2} + \frac{L_\mathrm{par} I_\mathrm{ring}^{2}}{2}
  14. 한 주기에 한 번이므로:

    PR,snub=fs(CsnubVsnub2+LparIring2)2P_{R,\mathrm{snub}} = \frac{f_s \left(C_\mathrm{snub} V_\mathrm{snub}^{2} + L_\mathrm{par} I_\mathrm{ring}^{2}\right)}{2}

    ✓ 재현하는 수식 snub.P_R (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/snubbers.py

토폴로지 세부: 직류 전류, 리플, 스위치 스트레스, 이용률(utilization)

섹션 제목: “토폴로지 세부: 직류 전류, 리플, 스위치 스트레스, 이용률(utilization)”

출력 커패시터의 전하 평형으로 각 컨버터의 인덕터 직류 전류를 구합니다. 온 구간 동안 인덕터에는 일정한 전압이 걸리므로 전류는 리플 절반 ΔiL\Delta i_L의 두 배만큼 선형으로 변하며, 같은 방식으로 한 주기 동안 커패시터가 주고받는 전하에서 전압 리플 Δv\Delta v를 구합니다. 트랜지스터 이용률 UU는 부하 전력을 트랜지스터의 피크 전압과 실효 전류의 곱과 비교한 값입니다.

  1. 벅, 전하 평형: 커패시터 전류는 두 구간 모두에서 IL−V/RI_L - V/R입니다(소리플 근사).

    ⟨iC⟩=IL−VR\langle i_C \rangle = I_L - \frac{V}{R}
  2. 평균을 0으로 놓습니다.

    IL=VRI_L = \frac{V}{R}

    ✓ 재현하는 수식 buck.IL (pytest가 sympy로 일치를 검증함)

  3. 벅 출력 리플: 커패시터는 인덕터 전류의 삼각파 교류 성분을 받습니다. 그중 양의 부분은 Ts/2T_s/2 동안 이어지고 최댓값이 ΔiL\Delta i_L이므로 전하 qq를 전달합니다.

    q=ΔiLTs4q = \frac{\Delta i_L T_s}{4}
  4. 그 전하가 커패시터 전압을 최솟값에서 최댓값까지, 즉 2Δv2\Delta v만큼 올립니다.

    2CΔv=ΔiLTs42 C \Delta v = \frac{\Delta i_L T_s}{4}
  5. Δv\Delta v에 대해 풉니다.

    Δv=ΔiLTs8C\Delta v = \frac{\Delta i_L T_s}{8 C}

    ✓ 재현하는 수식 buck.ripple.v (pytest가 sympy로 일치를 검증함)

  6. 부스트, 전하 평형: 스위치 온 구간에 −V/R-V/R, 다이오드 도통 구간에 IL−V/RI_L - V/R.

    (1−D)(IL−VR)−DVR=0\left(1 - D\right) \left(I_L - \frac{V}{R}\right) - \frac{D V}{R} = 0
  7. ILI_L에 대해 풉니다.

    IL=−VR(−1+D)=V(1−D)RI_L = - \frac{V}{R \left(-1 + D\right)} = \frac{V}{\left(1 - D\right) R}

    ✓ 재현하는 수식 boost.IL (pytest가 sympy로 일치를 검증함)

  8. 부스트 전류 리플: 인덕터에 DTsD T_s 동안 VgV_g가 걸리므로 전류는 VgDTs/LV_g D T_s/L, 즉 2ΔiL2\Delta i_L만큼 증가합니다.

    2ΔiL=DTsVgL2 \Delta i_L = \frac{D T_s V_g}{L}
  9. ΔiL\Delta i_L에 대해 풉니다.

    ΔiL=VgDTs2L\Delta i_L = \frac{V_g D T_s}{2 L}

    ✓ 재현하는 수식 boost.ripple.iL (pytest가 sympy로 일치를 검증함)

  10. 부스트 전압 리플: 스위치가 켜져 있는 DTsD T_s 동안 커패시터만이 부하 전류 V/RV/R을 공급하므로 전압이 2Δv2\Delta v만큼 떨어집니다.

    2Δv=DTsVCR2 \Delta v = \frac{D T_s V}{C R}
  11. Δv\Delta v에 대해 풉니다.

    Δv=VDTs2RC\Delta v = \frac{V D T_s}{2 R C}

    ✓ 재현하는 수식 boost.ripple.v (pytest가 sympy로 일치를 검증함)

  12. 출력 크기 VV로 쓴 벅-부스트: 인덕터에는 스위치 온 구간에 VgV_g, 다이오드 도통 구간에 −V-V가 걸립니다.

    DVg−V(1−D)=0D V_g - V \left(1 - D\right) = 0
  13. VV에 대해 풉니다.

    V=−DVg−1+D=DVg1−DV = - \frac{D V_g}{-1 + D} = \frac{D V_g}{1 - D}

    ✓ 재현하는 수식 buckboost.V (pytest가 sympy로 일치를 검증함)

  14. 전하 평형은 부스트와 같습니다. 스위치 온 구간에는 커패시터가 부하에 전류를 공급하고, 다이오드 도통 구간에는 ILI_L을 받습니다.

    IL=−VR(−1+D)=V(1−D)RI_L = - \frac{V}{R \left(-1 + D\right)} = \frac{V}{\left(1 - D\right) R}

    ✓ 재현하는 수식 buckboost.IL (pytest가 sympy로 일치를 검증함)

  15. 부스트와 마찬가지로 인덕터에는 DTsD T_s 동안 VgV_g가 걸립니다.

    ΔiL=VgDTs2L\Delta i_L = \frac{V_g D T_s}{2 L}

    ✓ 재현하는 수식 buckboost.ripple.iL (pytest가 sympy로 일치를 검증함)

  16. 부스트와 마찬가지로 DTsD T_s 동안 커패시터만이 부하에 전류를 공급합니다.

    Δv=VDTs2RC\Delta v = \frac{V D T_s}{2 R C}

    ✓ 재현하는 수식 buckboost.ripple.v (pytest가 sympy로 일치를 검증함)

  17. 벅: 다이오드가 도통하는 동안 스위치 노드는 접지 전위에 있으므로(이상적 다이오드), 입력과 그 노드 사이의 스위치는 VgV_g를 차단합니다.

    VDS=VgV_\mathrm{DS} = V_g

    ✓ 재현하는 수식 buck.Vds (pytest가 sympy로 일치를 검증함)

  18. 부스트: 다이오드가 도통하는 동안 스위치 노드는 출력에 연결되므로, 그 노드와 접지 사이의 스위치는 VV를 차단합니다.

    VDS=VV_\mathrm{DS} = V

    ✓ 재현하는 수식 boost.Vds (pytest가 sympy로 일치를 검증함)

  19. 다이오드가 도통하는 동안 스위치의 반대쪽 단자는 출력 전위 −V-V에 있으므로, 스위치는 Vg−(−V)V_g - (-V)를 차단합니다.

    VDS=Vg+VV_\mathrm{DS} = V_g + V

    ✓ 재현하는 수식 buckboost.Vds (pytest가 sympy로 일치를 검증함)

  20. 포워드, 리셋 구간: 리셋 권선(NrN_r턴)이 반대 극성으로 VgV_g에 연결되므로 1차 권선(NpN_p턴)에는 −VgNp/Nr-V_g N_p/N_r이 걸립니다.

    vpri=−Vgnrv_\mathrm{pri} = - \frac{V_g}{n_r}
  21. 스위치는 입력 전압에서 1차 전압을 뺀 값을 차단합니다.

    VDS=Vg(1+nr)nr=Vg(1+1nr)V_\mathrm{DS} = \frac{V_g \left(1 + n_r\right)}{n_r} = V_g \left(1 + \frac{1}{n_r}\right)

    ✓ 재현하는 수식 forward.Vds (pytest가 sympy로 일치를 검증함)

  22. 포워드 출력 인덕터: 스위치가 켜져 있는 동안 2차 권선이 nVgn V_g를 인가하므로 인덕터에는 DTsD T_s 동안 nVg−Vn V_g - V가 걸립니다.

    2ΔiL=DTs(−V+Vgn)L2 \Delta i_L = \frac{D T_s \left(- V + V_g n\right)}{L}
  23. ΔiL\Delta i_L에 대해 풉니다.

    ΔiL=(nVg−V)DTs2L\Delta i_L = \frac{\left(n V_g - V\right) D T_s}{2 L}

    ✓ 재현하는 수식 forward.ripple.iL (pytest가 sympy로 일치를 검증함)

  24. 트랜지스터 이용률은 부하 전력 P=VIP = V I를 트랜지스터의 피크 전압과 실효 전류의 곱으로 나눈 값입니다. 소리플 근사에서 트랜지스터 전류는 DTsD T_s 동안 높이 IQI_Q인 평평한 펄스이며, 그 실효값은 IQDI_Q \sqrt{D}입니다.

  25. 벅: V=DVgV = D V_g이고, 트랜지스터는 VgV_g를 차단하며 인덕터 전류 II를 흘립니다.

    U=DU = \sqrt{D}
  26. 정리합니다.

    U=DU = \sqrt{D}

    ✓ 재현하는 수식 util.buck (pytest가 sympy로 일치를 검증함)

  27. 부스트: 트랜지스터는 VV를 차단하고 인덕터 전류 I/(1−D)I/(1 - D)를 흘립니다.

    U=1−DDU = \frac{1 - D}{\sqrt{D}}
  28. 정리합니다.

    U=1−DDU = \frac{1 - D}{\sqrt{D}}

    ✓ 재현하는 수식 util.boost (pytest가 sympy로 일치를 검증함)

  29. 벅-부스트: V=DVg/(1−D)V = D V_g/(1 - D)이고, 트랜지스터는 Vg+VV_g + V를 차단하며 I/(1−D)I/(1 - D)를 흘립니다.

    U=VgDVg+DVg1−DU = \frac{V_g \sqrt{D}}{V_g + \frac{D V_g}{1 - D}}
  30. 정리합니다.

    U=(1−D)DU = \left(1 - D\right) \sqrt{D}

    ✓ 재현하는 수식 util.buckboost (pytest가 sympy로 일치를 검증함)

  31. 플라이백: V=nDVg/(1−D)V = n D V_g/(1 - D)이고, 트랜지스터는 Vg+V/nV_g + V/n을 차단하며 1차 측 환산 자화 전류 nI/(1−D)n I/(1 - D)를 흘립니다. 권선비가 상쇄되어 벅-부스트와 같은 결과가 됩니다.

    U=D(1−D)U = \sqrt{D} \left(1 - D\right)
  32. 포워드: V=nDVgV = n D V_g이고, 트랜지스터는 Vg(1+1/nr)V_g(1 + 1/n_r)를 차단하며 반사된 인덕터 전류 nIn I를 흘립니다(자화 전류 무시).

    U=D1+1nrU = \frac{\sqrt{D}}{1 + \frac{1}{n_r}}
  33. 정리합니다.

    U=nrD1+nr=D1+1nrU = \frac{n_r \sqrt{D}}{1 + n_r} = \frac{\sqrt{D}}{1 + \frac{1}{n_r}}

    ✓ 재현하는 수식 util.forward (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/topologies.py

소신호 전달함수(small-signal transfer functions), CCM

섹션 제목: “소신호 전달함수(small-signal transfer functions), CCM”

평균화로 스위칭 리플을 없앤 뒤, 평균 방정식을 동작점 주변에서 섭동(d=D+d^d = D + \hat d, v=V+v^v = V + \hat v, i=I+i^i = I + \hat i)하고 2차 항을 버리면 선형 방정식이 되며, 이를 라플라스 변환하면 v^/d^\hat v/\hat d를 얻습니다. 아래 각 컨버터는 이득 Gd0G_{d0}, 품질계수 QQ인 ω0\omega_0의 극점, 그리고 부스트와 벅-부스트의 경우 우반평면 영점 ωz\omega_z를 갖는 표준 2차 형태로 정리됩니다.

  1. 벅의 선형화된 평균 방정식(v^g=0\hat v_g = 0): 인덕터에는 d vg−vd\,v_g - v가 걸리고 커패시터에는 i−v/Ri - v/R이 흐릅니다.

    (i^sL=−v^+d^Vg, sv^C=i^−v^R)\left( \hat i s L = - \hat v + \hat d V_g, \ s \hat v C = \hat i - \frac{\hat v}{R}\right)
  2. v^/d^\hat v/\hat d를 구합니다.

    Gvd(s)=RVgR+sL+CLRs2G_{vd}(s) = \frac{R V_g}{R + s L + C L R s^{2}}
  3. 직류 이득: s=0s = 0에서의 값.

    Gd0=VgG_{d0} = V_g

    ✓ 재현하는 수식 buck.ss.Gd0 (pytest가 sympy로 일치를 검증함)

  4. 극점: s2s^2 계수 a2a_2로부터 ω0=1/a2\omega_0 = 1/\sqrt{a_2}.

    ω0=1LC\omega_0 = \frac{1}{\sqrt{L C}}

    ✓ 재현하는 수식 buck.ss.w0 (pytest가 sympy로 일치를 검증함)

  5. ss 계수 a1a_1로부터 Q=a2/a1Q = \sqrt{a_2}/a_1.

    Q=RCLQ = R \sqrt{\frac{C}{L}}

    ✓ 재현하는 수식 buck.ss.Q (pytest가 sympy로 일치를 검증함)

  6. 부스트: 평균 인덕터 전압은 vg−d′vv_g - d' v, 커패시터 전류는 d′i−v/Rd' i - v/R입니다(d′=1−dd' = 1 - d). d′=D′−d^d' = D' - \hat d로 섭동하고 선형화하면:

    (i^sL=d^V−v^D′, sv^C=i^D′−d^I−v^R)\left( \hat i s L = \hat d V - \hat v D', \ s \hat v C = \hat i D' - \hat d I - \frac{\hat v}{R}\right)
  7. D′=1−DD' = 1 - D로 쓴 정상상태 동작점: V=Vg/D′V = V_g/D', I=V/(D′R)I = V/(D' R).

    (V=VgD′, I=VgD′2R)\left( V = \frac{V_g}{D'}, \ I = \frac{V_g}{D'^{2} R}\right)
  8. v^/d^\hat v/\hat d를 구합니다.

    Gvd(s)=Vg(−sL+RD′2)D′2(sL+RD′2+CLRs2)G_{vd}(s) = \frac{V_g \left(- s L + R D'^{2}\right)}{D'^{2} \left(s L + R D'^{2} + C L R s^{2}\right)}
  9. 직류 이득(결과는 D′=1−DD' = 1 - D를 대입한 형태로 나타냄).

    Gd0=Vg(1−D)2G_{d0} = \frac{V_g}{\left(1 - D\right)^{2}}

    ✓ 재현하는 수식 boost.ss.Gd0 (pytest가 sympy로 일치를 검증함)

  10. 극점 주파수.

    ω0=1−DLC\omega_0 = \frac{1 - D}{\sqrt{L C}}

    ✓ 재현하는 수식 boost.ss.w0 (pytest가 sympy로 일치를 검증함)

  11. 품질계수.

    Q=(1−D)RCLQ = \left(1 - D\right) R \sqrt{\frac{C}{L}}

    ✓ 재현하는 수식 boost.ss.Q (pytest가 sympy로 일치를 검증함)

  12. 분자가 양의 실수 ss에서 0이 되므로 우반평면 영점입니다.

    ωz=(1−D)2RL\omega_z = \frac{\left(1 - D\right)^{2} R}{L}

    ✓ 재현하는 수식 boost.ss.wz (pytest가 sympy로 일치를 검증함)

  13. 벅-부스트: 평균 인덕터 전압은 d vg+d′vd\,v_g + d' v, 커패시터 전류는 −d′i−v/R-d' i - v/R이며 출력 vv는 음수입니다. 선형화하면:

    (i^sL=d^(Vg−V)+v^D′, sv^C=d^I−i^D′−v^R)\left( \hat i s L = \hat d \left(V_g - V\right) + \hat v D', \ s \hat v C = \hat d I - \hat i D' - \frac{\hat v}{R}\right)
  14. D′=1−DD' = 1 - D로 쓴 동작점: V=−DVg/D′V = -D V_g/D', I=DVg/(D′2R)I = D V_g/(D'^2 R).

    (V=Vg(−1+D′)D′, I=Vg(1−D′)D′2R)\left( V = \frac{V_g \left(-1 + D'\right)}{D'}, \ I = \frac{V_g \left(1 - D'\right)}{D'^{2} R}\right)
  15. v^/d^\hat v/\hat d를 구합니다.

    Gvd(s)=Vg(−sL(−1+D′)−RD′2)D′2(sL+RD′2+CLRs2)G_{vd}(s) = \frac{V_g \left(- s L \left(-1 + D'\right) - R D'^{2}\right)}{D'^{2} \left(s L + R D'^{2} + C L R s^{2}\right)}
  16. 직류 이득은 음수(반전 출력)이며, 그 크기는 다음과 같습니다.

    Gd0=Vg(1−D)2G_{d0} = \frac{V_g}{\left(1 - D\right)^{2}}

    ✓ 재현하는 수식 buckboost.ss.Gd0 (pytest가 sympy로 일치를 검증함)

  17. 극점 주파수.

    ω0=1−DLC\omega_0 = \frac{1 - D}{\sqrt{L C}}

    ✓ 재현하는 수식 buckboost.ss.w0 (pytest가 sympy로 일치를 검증함)

  18. 품질계수.

    Q=(1−D)RCLQ = \left(1 - D\right) R \sqrt{\frac{C}{L}}

    ✓ 재현하는 수식 buckboost.ss.Q (pytest가 sympy로 일치를 검증함)

  19. 우반평면 영점.

    ωz=R(−1+D)2DL=(1−D)2RDL\omega_z = \frac{R \left(-1 + D\right)^{2}}{D L} = \frac{\left(1 - D\right)^{2} R}{D L}

    ✓ 재현하는 수식 buckboost.ss.wz (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/small_signal.py

PWM 변조기(modulator)와 루프 이득(loop gain)

섹션 제목: “PWM 변조기(modulator)와 루프 이득(loop gain)”

전압 모드 제어기는 제어 전압을 주기적인 램프와 비교해 듀티비를 정합니다. 루프를 한 바퀴 돌면 보상기, 변조기, 전력단, 센서의 이득이 곱해지며, 그 곱인 루프 이득 TT가 외란을 얼마나 강하게 억제하는지 결정합니다.

  1. 램프는 TsT_s 동안 00에서 VMV_M까지 증가하며, VctrlV_\mathrm{ctrl}을 넘는 순간 스위치가 꺼집니다.

    VMtoffTs=Vctrl\frac{V_M t_\mathrm{off}}{T_s} = V_\mathrm{ctrl}
  2. 온 시간 비율은 D=toff/TsD = t_\mathrm{off}/T_s입니다.

    D=VctrlVMD = \frac{V_\mathrm{ctrl}}{V_M}

    ✓ 재현하는 수식 pwm.d (pytest가 sympy로 일치를 검증함)

  3. 루프를 따라가면 보상기 출력이 변조기(이득 1/VM1/V_M)를 구동하고, 전력단이 d^\hat d를 v^\hat v로 바꾸며(이득 GvdG_{vd}), 센서가 Hv^H \hat v를 피드백합니다.

  4. 루프 이득은 루프를 한 바퀴 도는 이득들의 곱입니다.

    T=GcGvdHVMT = \frac{G_c G_{vd} H}{V_M}

    ✓ 재현하는 수식 loop.T (pytest가 sympy로 일치를 검증함)

  5. 출력 외란 v^dist\hat v_\mathrm{dist}가 제어된 출력에 더해지고, 제어기는 오차 v^ref−Hv^\hat v_\mathrm{ref} - H\hat v에 따라 동작합니다.

    v^=v^dist+GcGvd(v^ref−v^H)VM\hat v = \hat v_\mathrm{dist} + \frac{G_c G_{vd} \left(\hat v_\mathrm{ref} - \hat v H\right)}{V_M}
  6. 출력에 도달하는 외란은 1+T1 + T로 나뉩니다.

    S=11+TS = \frac{1}{1 + T}

    ✓ 재현하는 수식 loop.suppression (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/control.py

인덕터나 커패시터에 저장된 에너지는 공급된 전력 viv i의 적분입니다. 스위칭 주기마다 반복되는 손실은 주기당 손실 에너지 × fsf_s이고, 도통 손실은 순시 전력의 주기 평균입니다.

  1. 인덕턴스에 공급되는 에너지: p=vip = v i이고 v=L di/dtv = L\,di/dt이므로 dE=Li didE = L i\,di입니다. 0에서 턴오프 전류까지 적분합니다.

    Elk=∫0IpkiLlk diE_\mathrm{lk} = \int\limits_{0}^{I_\mathrm{pk}} i L_\mathrm{lk}\, di
  2. 적분을 계산합니다.

    Elk=LlkIpk22E_\mathrm{lk} = \frac{L_\mathrm{lk} I_\mathrm{pk}^{2}}{2}

    ✓ 재현하는 수식 flyback.leak.E (pytest가 sympy로 일치를 검증함)

  3. 이 에너지를 매 주기 제거하면(클램프하거나 소산시키면) 평균 전력은 ElkfsE_\mathrm{lk} f_s입니다.

    Plk=ElkfsP_\mathrm{lk} = E_\mathrm{lk} f_s

    ✓ 재현하는 수식 flyback.leak.P (pytest가 sympy로 일치를 검증함)

  4. VswV_\mathrm{sw}로 충전된 스위치 노드 커패시턴스의 저장 에너지: dE=v dq=Cv dvdE = v\,dq = C v\,dv.

    EC=∫0VswvCnode dvE_C = \int\limits_{0}^{V_\mathrm{sw}} v C_\mathrm{node}\, dv
  5. 하드 턴온은 매 주기 이 에너지를 스위치 채널로 방전시키므로 P=ECfsP = E_C f_s입니다.

    P=CnodeVsw2fs2P = \frac{C_\mathrm{node} V_\mathrm{sw}^{2} f_s}{2}

    ✓ 재현하는 수식 loss.sw.cap (pytest가 sympy로 일치를 검증함)

  6. 도통 손실은 순시 전력 i(t)2Rxi(t)^2 R_x의 주기 평균입니다.

    P=∫0TsRxi2(t) dtTsP = \frac{\int\limits_{0}^{T_s} R_x i^{2}{\left(t \right)}\, dt}{T_s}
  7. 정의상 rms 전류는 i(t)2i(t)^2의 주기 평균의 제곱근입니다.

    Irms2=∫0Tsi2(t) dtTsI_\mathrm{rms}^{2} = \frac{\int\limits_{0}^{T_s} i^{2}{\left(t \right)}\, dt}{T_s}
  8. RxR_x는 상수이므로 평균 밖으로 나옵니다.

    P=Irms2RxP = I_\mathrm{rms}^{2} R_x

    ✓ 재현하는 수식 loss.cond (pytest가 sympy로 일치를 검증함)

  9. 도통 중인 다이오드는 순방향 전압 절편과 동저항으로 모델링합니다. vD=VF+rdiv_D = V_F + r_d i이므로 p=VFi+rdi2p = V_F i + r_d i^2입니다.

    P=∫0Ts(VFi(t)+rdi2(t)) dtTsP = \frac{\int\limits_{0}^{T_s} \left(V_F i{\left(t \right)} + r_d i^{2}{\left(t \right)}\right)\, dt}{T_s}
  10. ii의 평균은 IavgI_\mathrm{avg}, i2i^2의 평균은 Irms2I_\mathrm{rms}^2입니다.

    P=VFIavg+rdIrms2P = V_F I_\mathrm{avg} + r_d I_\mathrm{rms}^{2}

    ✓ 재현하는 수식 loss.diode (pytest가 sympy로 일치를 검증함)

  11. 드라이버는 매 주기 VGSV_\mathrm{GS} 전원에서 게이트 전하 QgQ_g를 끌어옵니다. 전원에서 가져가는 에너지는 VGS dqV_\mathrm{GS}\,dq의 적분입니다.

    EG=∫0QgVGS dqE_G = \int\limits_{0}^{Q_g} V_\mathrm{GS}\, dq
  12. 이 에너지는 모두 드라이버와 게이트의 저항에서 열이 되며, 여기에 fsf_s를 곱합니다.

    P=QgVGSfsP = Q_g V_\mathrm{GS} f_s

    ✓ 재현하는 수식 loss.gate (pytest가 sympy로 일치를 검증함)

  13. 감쇠 없는 L-C 루프는 LC d2v/dt2+v=0L C\,d^2v/dt^2 + v = 0을 따르며, 특성 방정식은 LCs2+1=0L C s^2 + 1 = 0입니다.

    1+CnodeLMs2=01 + C_\mathrm{node} L_M s^{2} = 0
  14. 근은 ±jω0\pm j\omega_0입니다.

    ω0=1CnodeLM\omega_0 = \frac{1}{\sqrt{C_\mathrm{node}} \sqrt{L_M}}
  15. f=ω0/(2π)f = \omega_0/(2\pi).

    fring=12πLMCnodef_\mathrm{ring} = \frac{1}{2 \pi \sqrt{L_M C_\mathrm{node}}}

    ✓ 재현하는 수식 dcm.ring.f (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/energy.py

자기 회로(magnetic circuits): 인덕턴스 계수, 자속 밀도, 코어 기하 상수

섹션 제목: “자기 회로(magnetic circuits): 인덕턴스 계수, 자속 밀도, 코어 기하 상수”

자기 경로는 저항 회로처럼 동작합니다. 기자력 NiN i가 자기저항 R=l/(μA)\mathcal{R} = l/(\mu A)를 통해 자속 Φ\Phi를 흐르게 합니다. 유효 단면적 AeA_e에서 자속 밀도가 균일하면 B=Φ/AeB = \Phi/A_e입니다.

  1. 코어 자기저항(비투자율 μi\mu_i).

    Rc=leAeμ0μi\mathcal{R}_c = \frac{l_e}{A_e \mu_0 \mu_i}
  2. 공극 자기저항(프린징 무시: 공극 면적 = AeA_e).

    Rg=lgAeμ0\mathcal{R}_g = \frac{l_g}{A_e \mu_0}
  3. 두 자기저항은 직렬입니다.

    R=lgAeμ0+leAeμ0μi\mathcal{R} = \frac{l_g}{A_e \mu_0} + \frac{l_e}{A_e \mu_0 \mu_i}
  4. 쇄교 자속이 λ=NΦ=N(Ni/R)\lambda = N\Phi = N (N i/\mathcal{R})이므로 L=λ/i=N2/RL = \lambda/i = N^2/\mathcal{R}입니다.

    L=N2RL = \frac{N^{2}}{\mathcal{R}}
  5. 인덕턴스 계수는 턴 수 제곱당 인덕턴스, 즉 AL=L/N2=1/RA_L = L/N^2 = 1/\mathcal{R}입니다.

    AL=1RA_L = \frac{1}{\mathcal{R}}
  6. 두 자기저항을 대입합니다.

    AL=Aeμ0μile+lgμi=μ0Aelg+leμiA_L = \frac{A_e \mu_0 \mu_i}{l_e + l_g \mu_i} = \frac{\mu_0 A_e}{l_g + \frac{l_e}{\mu_i}}

    ✓ 재현하는 수식 mag.AL_gap (pytest가 sympy로 일치를 검증함)

  7. 따라서 L=ALN2L = A_L N^2입니다.

    L=ALN2L = A_L N^{2}

    ✓ 재현하는 수식 mag.L_from_AL (pytest가 sympy로 일치를 검증함)

  8. 쇄교 자속과 인덕턴스: λ=NΦ=Li\lambda = N\Phi = L i이므로 Φ=Li/N\Phi = L i/N입니다.

    λ=NΦ\lambda = N \Phi
  9. 피크 전류에서는 Bpk=Φpk/Ae=LIpk/(NAe)B_\mathrm{pk} = \Phi_\mathrm{pk}/A_e = L I_\mathrm{pk}/(N A_e)입니다.

    Bpk=LIpkNAeB_\mathrm{pk} = \frac{L I_\mathrm{pk}}{N A_e}

    ✓ 재현하는 수식 mag.B_pk (pytest가 sympy로 일치를 검증함)

  10. 자속 밀도는 전류를 따라 B=Li/(NAe)B = L i/(N A_e)입니다. 직류 전류를 중심으로 한 ±ΔiL\pm\Delta i_L의 리플은 자속 밀도를 직류 값을 중심으로 ±L ΔiL/(NAe)\pm L\,\Delta i_L/(N A_e)만큼 움직이며, 이 진폭이 BacB_\mathrm{ac}입니다.

    Bac=LΔiLNAeB_\mathrm{ac} = \frac{L \Delta i_L}{N A_e}

    ✓ 재현하는 수식 mag.B_ac (pytest가 sympy로 일치를 검증함)

  11. BpkB_\mathrm{pk}를 한계 BmaxB_\mathrm{max}로 두고 턴 수에 대해 풀면, 한계를 넘지 않는 최소 턴 수가 나옵니다.

    N=LIpkBmaxAeN = \frac{L I_\mathrm{pk}}{B_\mathrm{max} A_e}

    ✓ 재현하는 수식 mag.N_Bmax (pytest가 sympy로 일치를 검증함)

  12. NN이 정해지면 인덕턴스 L=N2/(Rc+Rg)L = N^2/(\mathcal{R}_c + \mathcal{R}_g)가 공극 자기저항을, 따라서 공극 길이를 정합니다.

    lg=μ0AeN2L−leμil_g = \frac{\mu_0 A_e N^{2}}{L} - \frac{l_e}{\mu_i}

    ✓ 재현하는 수식 mag.gap_length (pytest가 sympy로 일치를 검증함)

  13. 코어 선정: 구리 단면적이 AwA_w인 NN턴 권선은 창 면적 WAW_A 중 비율 KuK_u만큼만 채울 수 있습니다.

    KuWA=AwNK_u W_A = A_w N
  14. 한계에서는 평균 길이 MLT인 NN턴 권선의 저항이 구리 손실 한도 Rdc,maxR_\mathrm{dc,max}와 같습니다.

    Rdc,max=MLTNρwAwR_\mathrm{dc,max} = \frac{\mathrm{MLT} N \rho_w}{A_w}
  15. 창이 선재를 정하므로(Aw=KuWA/NA_w = K_u W_A/N) 저항은 턴 수의 제곱에 비례해 커집니다.

    Rdc,max=MLTρwN2KuWAR_\mathrm{dc,max} = \frac{\mathrm{MLT} \rho_w N^{2}}{K_u W_A}
  16. 자속 한계가 턴 수를 정합니다: N=LIpk/(BmaxAe)N = L I_\mathrm{pk}/(B_\mathrm{max} A_e).

    Rdc,max=MLTρwIpk2L2Ae2Bmax2KuWAR_\mathrm{dc,max} = \frac{\mathrm{MLT} \rho_w I_\mathrm{pk}^{2} L^{2}}{A_e^{2} B_\mathrm{max}^{2} K_u W_A}
  17. 코어 치수를 한쪽으로 모으면 코어 기하 상수가 정의되고, 다른 쪽은 사양만으로 정해집니다.

    Kg=WAAe2MLTK_g = \frac{W_A A_e^{2}}{\mathrm{MLT}}
  18. 코어의 KgK_g가 다음 값 이상이면 자속 한계, 창, 저항 한도를 함께 만족합니다.

    Kg=ρwL2Ipk2Bmax2Rdc,maxKuK_g = \frac{\rho_w L^{2} I_\mathrm{pk}^{2}}{B_\mathrm{max}^{2} R_\mathrm{dc,max} K_u}

    ✓ 재현하는 수식 mag.Kg_req (pytest가 sympy로 일치를 검증함)

  19. 패러데이 법칙 v=NAe dB/dtv = N A_e\,dB/dt에 따라 온 구간 동안의 BB 변화는 v/(NAe)v/(N A_e)의 적분입니다.

    ΔB=∫0tonVwAeN dt\Delta B = \int\limits_{0}^{t_\mathrm{on}} \frac{V_w}{A_e N}\, dt
  20. 권선 전압 VwV_w가 일정하면 변화폭은 전압-초 VwtonV_w t_\mathrm{on}에 비례합니다.

    ΔB=VwtonNAe\Delta B = \frac{V_w t_\mathrm{on}}{N A_e}

    ✓ 재현하는 수식 mag.dB_faraday (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/magnetics.py

권선(windings): 저항, 표피 깊이(skin depth), 얇은 층, 누설(leakage), 단락

섹션 제목: “권선(windings): 저항, 표피 깊이(skin depth), 얇은 층, 누설(leakage), 단락”

권선은 층으로 감긴 긴 도체입니다. 저항은 길이와 단면적에서 나오고, 주파수가 높으면 전류가 표면층으로 몰리며, 권선 사이의 자계는 누설 인덕턴스로 나타나는 에너지를 저장합니다.

  1. 권선은 평균 길이 MLT인 NN턴으로 된 도체 하나입니다.

    lw=MLTNl_w = \mathrm{MLT} N
  2. 직류 저항은 저항률에 길이를 곱하고 도체 단면적으로 나눈 값입니다.

    Rdc=ρwNMLTAwR_\mathrm{dc} = \frac{\rho_w N \mathrm{MLT}}{A_w}

    ✓ 재현하는 수식 wind.dcr (pytest가 sympy로 일치를 검증함)

  3. 양도체(전도율 1/ρw1/\rho_w) 안의 정현파 전류 밀도는 d2J/dx2=jωμ0J/ρwd^2 J/dx^2 = j\omega\mu_0 J/\rho_w를 따르므로 e−kxe^{-k x}로 변하며, kk는 다음과 같습니다.

    k2=2πifμ0ρwk^{2} = \frac{2 \pi i f \mu_0}{\rho_w}
  4. 실수부가 양수인 근:

    k=πfμ0ρw+iπfμ0ρwk = \frac{\sqrt{\pi} \sqrt{f} \sqrt{\mu_0}}{\sqrt{\rho_w}} + \frac{i \sqrt{\pi} \sqrt{f} \sqrt{\mu_0}}{\sqrt{\rho_w}}
  5. 크기는 표피 깊이, 곧 kk 실수부의 역수만큼 들어갈 때마다 ee배씩 줄어듭니다.

    δ=ρwπμ0f\delta = \sqrt{\frac{\rho_w}{\pi \mu_0 f}}

    ✓ 재현하는 수식 wind.skin_depth (pytest가 sympy로 일치를 검증함)

  6. 두께가 표피 깊이의 φ\varphi배인 층 MℓM_\ell개의 Dowell 교류 저항 계수(`wind.dowell`):

    FR=φ(sin⁡(2φ)+sinh⁡(2φ)−cos⁡(2φ)+cosh⁡(2φ)+(−23+2Mℓ23)(−sin⁡(φ)+sinh⁡(φ))cos⁡(φ)+cosh⁡(φ))F_R = \varphi \left(\frac{\sin{\left(2 \varphi \right)} + \sinh{\left(2 \varphi \right)}}{- \cos{\left(2 \varphi \right)} + \cosh{\left(2 \varphi \right)}} + \frac{\left(- \frac{2}{3} + \frac{2 M_\ell^{2}}{3}\right) \left(- \sin{\left(\varphi \right)} + \sinh{\left(\varphi \right)}\right)}{\cos{\left(\varphi \right)} + \cosh{\left(\varphi \right)}}\right)
  7. 얇은 층에서는 쌍곡선 함수와 삼각 함수를 φ\varphi의 거듭제곱으로 전개합니다. φ3\varphi^3까지의 항은 상쇄되고, 처음 나타나는 초과분은 4차 항입니다.

    FR=1−φ445+Mℓ2φ49=1+(5Mℓ2−1)φ445F_R = 1 - \frac{\varphi^{4}}{45} + \frac{M_\ell^{2} \varphi^{4}}{9} = 1 + \frac{\left(5 M_\ell^{2} - 1\right) \varphi^{4}}{45}

    ✓ 재현하는 수식 wind.dowell_low (pytest가 sympy로 일치를 검증함)

  8. 주파수가 정해지면 표피 깊이도 정해지므로, 두께가 표피 깊이의 φ\varphi배인 층의 직류 저항은 Rδ/φR_\delta/\varphi입니다(RδR_\delta는 두께가 표피 깊이 하나인 층의 직류 저항). 전류 II가 흐르면 손실은 다음과 같습니다.

    P=FRRδI2φP = \frac{F_R R_\delta I^{2}}{\varphi}
  9. 같은 전류가 직류로 흐르는, 두께가 표피 깊이 하나인 층의 손실 RδI2R_\delta I^2에 대한 비는 다음과 같습니다.

    P/Pδ=FRφP/P_\delta = \frac{F_R}{\varphi}

    ✓ 재현하는 수식 wind.loss_rel (pytest가 sympy로 일치를 검증함)

  10. 얇은 층의 급수를 쓰면:

    P/Pδ=1−φ445+Mℓ2φ49φP/P_\delta = \frac{1 - \frac{\varphi^{4}}{45} + \frac{M_\ell^{2} \varphi^{4}}{9}}{\varphi}
  11. 도함수가 0인 곳에서 가장 작습니다.

    φopt=(155Mℓ2−1)14\varphi_\mathrm{opt} = \left(\frac{15}{5 M_\ell^{2} - 1}\right)^{\frac{1}{4}}

    ✓ 재현하는 수식 wind.phi_opt (pytest가 sympy로 일치를 검증함)

  12. 그곳에서 교류 저항 계수는 층 수와 관계없이 같습니다.

    FR=43F_R = \frac{4}{3}
  13. 창 안의 자계는 폭 bwb_w 방향으로 향하므로, 그 높이까지 둘러싸인 기자력을 F\mathcal{F}라 하면 H=F/bwH = \mathcal{F}/b_w이고, 턴 길이 MLT에 걸쳐 저장되는 에너지는 다음과 같습니다.

    E=MLTμ0∫F2 dy2bwE = \frac{\mathrm{MLT} \mu_0 \int \mathcal{F}^{2}\, dy}{2 b_w}
  14. 1차 권선 다음에 2차 권선이 있으면, 기자력은 1차 권선을 지나며 NIN I까지 선형으로 오르고, 간격에서는 그대로 유지되다가, 2차 권선을 지나며 0으로 돌아옵니다.

    F=IN\mathcal{F} = I N
  15. Llk=2E/I2L_\mathrm{lk} = 2E/I^2에서 각 권선은 높이의 1/3이, 간격은 전부가 들어갑니다.

    Llk=MLTμ0N2(hp+hs+3hg)3bw=μ0N2MLT(hp3+hg+hs3)bwL_\mathrm{lk} = \frac{\mathrm{MLT} \mu_0 N^{2} \left(h_p + h_s + 3 h_g\right)}{3 b_w} = \frac{\mu_0 N^{2} \mathrm{MLT} \left(\frac{h_p}{3} + h_g + \frac{h_s}{3}\right)}{b_w}

    ✓ 재현하는 수식 xfmr.leakage.ps (pytest가 sympy로 일치를 검증함)

  16. 1차 권선을 2차 권선 양쪽으로 나누면, 기자력은 첫 번째 절반에서 NI/2N I/2까지 오르고, 2차 권선을 지나며 NI/2N I/2에서 −NI/2-N I/2로 바뀐 뒤, 두 번째 절반에서 0으로 돌아옵니다.

    F=IN2\mathcal{F} = \frac{I N}{2}
  17. 최대 기자력이 절반이 되므로 에너지와 누설은 약 1/4로 줄고, 두 간격이 모두 들어갑니다.

    Llk=MLTμ0N2(hp+hs+6hg)12bw=μ0N2MLT(hp3+2hg+hs3)4bwL_\mathrm{lk} = \frac{\mathrm{MLT} \mu_0 N^{2} \left(h_p + h_s + 6 h_g\right)}{12 b_w} = \frac{\mu_0 N^{2} \mathrm{MLT} \left(\frac{h_p}{3} + 2 h_g + \frac{h_s}{3}\right)}{4 b_w}

    ✓ 재현하는 수식 xfmr.leakage.psp (pytest가 sympy로 일치를 검증함)

  18. 각자의 인덕턴스와 둘 사이의 상호 인덕턴스 L12L_{12}를 갖는 두 결합 권선:

    v1=di1dtL11+di2dtL12v_1 = \frac{di_1}{dt} L_{11} + \frac{di_2}{dt} L_{12}
  19. 권선 2에서는:

    v2=di1dtL12+di2dtL22v_2 = \frac{di_1}{dt} L_{12} + \frac{di_2}{dt} L_{22}
  20. 권선 2를 단락하면 v2=0v_2 = 0이므로 그 전류는 권선 1의 전류와 반대로 변합니다.

    di2dt=−di1dtL12L22\frac{di_2}{dt} = - \frac{\frac{di_1}{dt} L_{12}}{L_{22}}
  21. 그러면 권선 1이 보는 인덕턴스는 v1/(di1/dt)v_1/(di_1/dt)입니다.

    Lsc=L11−L122L22L_\mathrm{sc} = L_{11} - \frac{L_{12}^{2}}{L_{22}}
  22. 결합 계수 k=L12/L11L22k = L_{12}/\sqrt{L_{11} L_{22}}(`xfmr.k`)를 쓰면:

    Lsc=L11(1−k2)L_\mathrm{sc} = L_{11} \left(1 - k^{2}\right)

    ✓ 재현하는 수식 xfmr.L_sc (pytest가 sympy로 일치를 검증함)

  23. 변압기 모델(1:nn, 자화 인덕턴스 LML_M와 누설 인덕턴스는 모두 1차 기준)에서 권선 인덕턴스는 다음과 같습니다.

    L11=LM+Lℓ1L_{11} = L_M + L_{\ell 1}
  24. 상호 인덕턴스는

    L12=LMnL_{12} = L_M n
  25. 권선 2의 인덕턴스는(누설 Lℓ2=n2Lℓ2′L_{\ell 2} = n^2 L_{\ell 2}')

    L22=n2(LM+Lℓ2′)L_{22} = n^{2} \left(L_M + L_{\ell 2}'\right)
  26. 이를 대입하면 권선비가 소거됩니다. 1차 누설에, 2차 누설과 LML_M의 병렬이 직렬로 더해집니다.

    Lsc=Lℓ1+Lℓ2′LMLℓ2′+LML_\mathrm{sc} = L_{\ell 1} + \frac{L_{\ell 2}' L_M}{L_{\ell 2}' + L_M}

    ✓ 재현하는 수식 xfmr.L_sc_T (pytest가 sympy로 일치를 검증함)

  27. 권선 2를 개방하면 그 권선에는 전류가 흐르지 않으므로(di2/dt=0di_2/dt = 0) 두 전압의 비는 다음과 같습니다.

    V2/V1=L12L11V_2/V_1 = \frac{L_{12}}{L_{11}}
  28. 변압기 모델에서는 1차 누설이 전압의 일부를 나누어 가지므로 권선비보다 조금 작습니다.

    V2/V1=nLMLℓ1+LMV_2/V_1 = \frac{n L_M}{L_{\ell 1} + L_M}

    ✓ 재현하는 수식 xfmr.V_oc (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/windings.py

측정: 자기 공진 근처에서 읽히는 인덕턴스

섹션 제목: “측정: 자기 공진 근처에서 읽히는 인덕턴스”

권선은 턴 사이 커패시턴스가 병렬로 붙은 인덕턴스입니다. 임피던스 측정기는 측정한 리액턴스를 ω\omega로 나누어 인덕턴스로 표시합니다.

  1. 병렬로 연결된 인덕턴스와 커패시턴스:

    Z=1iCpω−iLωZ = \frac{1}{i C_p \omega - \frac{i}{L \omega}}
  2. 이는 순수 리액턴스입니다.

    Z=−iLω−1+CpLω2Z = - \frac{i L \omega}{-1 + C_p L \omega^{2}}
  3. 따라서 측정기는 Z/(jω)Z/(j\omega)를 인덕턴스로 읽습니다.

    Lapp=−L−1+CpLω2L_\mathrm{app} = - \frac{L}{-1 + C_p L \omega^{2}}
  4. 자기 공진 주파수(`passive.f_srf`)로 쓰면 ω2LCp=(f/fsrf)2\omega^2 L C_p = (f/f_\mathrm{srf})^2입니다.

    fsrf=12πCpLf_\mathrm{srf} = \frac{1}{2 \pi \sqrt{C_p} \sqrt{L}}
  5. ω=2πf\omega = 2\pi f를 대입하면:

    Lapp=−Lfsrf2f2−fsrf2=L1−(ffsrf)2L_\mathrm{app} = - \frac{L f_\mathrm{srf}^{2}}{f^{2} - f_\mathrm{srf}^{2}} = \frac{L}{1 - \left(\frac{f}{f_\mathrm{srf}}\right)^{2}}

    ✓ 재현하는 수식 meas.L_app (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/measurement.py

선형 전원(linear sources): 최대 전력, 정전압 추출(constant-voltage extraction), 무손실 저항

섹션 제목: “선형 전원(linear sources): 최대 전력, 정전압 추출(constant-voltage extraction), 무손실 저항”

선형 에너지원은 테브난 등가회로, 즉 전원 저항 RsR_s 뒤의 개방 전압 VocV_\mathrm{oc}로 모델링합니다. 가용 전력 중 얼마가 컨버터에 도달하는지는 컨버터 입력이 어떻게 보이는지에 달려 있습니다.

  1. 부하 저항 RLR_L로 들어가는 전력.

    PL=RLVoc2(RL+Rs)2P_L = \frac{R_L V_\mathrm{oc}^{2}}{\left(R_L + R_s\right)^{2}}
  2. dPL/dRL=0dP_L/dR_L = 0에서 정합 부하를 얻습니다.

    RL=RsR_L = R_s
  3. RL=RsR_L = R_s를 대입합니다.

    Pmax=Voc24RsP_\mathrm{max} = \frac{V_\mathrm{oc}^{2}}{4 R_s}

    ✓ 재현하는 수식 src.Pmax (pytest가 sympy로 일치를 검증함)

  4. 전압 VcV_c의 정전압 싱크(예: 입력이 고정 전압에 묶인 컨버터)는 I=(Voc−Vc)/RsI = (V_\mathrm{oc} - V_c)/R_s를 끌어옵니다.

    I=Voc−VcRsI = \frac{V_\mathrm{oc} - V_c}{R_s}
  5. 싱크가 흡수하는 전력입니다. Vc>VocV_c > V_\mathrm{oc}이면 음수이며, 이때 싱크는 전원으로 에너지를 되돌려 보냅니다.

    P=Vc(Voc−Vc)RsP = \frac{V_c \left(V_\mathrm{oc} - V_c\right)}{R_s}

    ✓ 재현하는 수식 src.cv_power (pytest가 sympy로 일치를 검증함)

  6. PmaxP_\mathrm{max}로 정규화합니다.

    ηext=4Vc(Voc−Vc)Voc2\eta_\mathrm{ext} = \frac{4 V_c \left(V_\mathrm{oc} - V_c\right)}{V_\mathrm{oc}^{2}}

    ✓ 재현하는 수식 src.cv_extraction (pytest가 sympy로 일치를 검증함)

  7. DCM 컨버터는 입력 전압에 비례하는 평균 입력 전류를 끌어오므로, 입력이 저항 RinR_\mathrm{in}, 즉 무손실 저항으로 보이며 RLR_L 자리에 들어갑니다.

  8. 전원 저항과 RinR_\mathrm{in}이 전원 전압을 분압합니다.

    Vg=VocRinRs+RinV_g = \frac{V_\mathrm{oc} R_\mathrm{in}}{R_s + R_\mathrm{in}}

    ✓ 재현하는 수식 lfr.Vg (pytest가 sympy로 일치를 검증함)

  9. RL=RinR_L = R_\mathrm{in}일 때의 PLP_L을 PmaxP_\mathrm{max}로 정규화합니다. 전원 전압은 소거됩니다.

    ηext=4RsRin(Rs+Rin)2\eta_\mathrm{ext} = \frac{4 R_s R_\mathrm{in}}{\left(R_s + R_\mathrm{in}\right)^{2}}

    ✓ 재현하는 수식 lfr.eta (pytest가 sympy로 일치를 검증함)

  10. 무손실 저항은 입력 전압이 걸린 저항과 같은 전력을 끌어옵니다.

    P=Vg2RinP = \frac{V_g^{2}}{R_\mathrm{in}}
  11. VgV_g에 대해 풉니다. 전력이 클수록 입력 전압이 높아야 합니다.

    Vg=PRinV_g = \sqrt{P R_\mathrm{in}}

    ✓ 재현하는 수식 lfr.Vg_power (pytest가 sympy로 일치를 검증함)

  12. DCM 플라이백의 입력 저항은 Rin=2LMfs/D2R_\mathrm{in} = 2 L_M f_s / D^2입니다(플라이백에서 유도).

    Rin=2LMfsD2R_\mathrm{in} = \frac{2 L_M f_s}{D^{2}}
  13. LML_M에 대해 풀면, 원하는 RinR_\mathrm{in}(전원과 정합하려면 RsR_s)을 만드는 인덕턴스가 나옵니다.

    LM=RinD22fsL_M = \frac{R_\mathrm{in} D^{2}}{2 f_s}

    ✓ 재현하는 수식 lfr.L_M (pytest가 sympy로 일치를 검증함)

  14. 포락선이 버스에 비해 충분히 느리면 무손실 저항은 매 순간 ηextVoc2/(4Rs)\eta_\mathrm{ext} V_\mathrm{oc}^2/(4 R_s)를 받습니다. 포락선의 반파 하나인 Voc(t)=V^ocsin⁡(πt/Tenv)V_\mathrm{oc}(t) = \hat{V}_\mathrm{oc} \sin(\pi t / T_\mathrm{env})를 생각합니다(정류된 사인은 이를 반복합니다).

    P=ηextV^oc2sin⁡2(πtTenv)4RsP = \frac{\eta_\mathrm{ext} \hat{V}_\mathrm{oc}^{2} \sin^{2}{\left(\frac{\pi t}{T_\mathrm{env}} \right)}}{4 R_s}
  15. 반파에 걸쳐 평균합니다. 사인의 제곱은 평균이 최댓값 제곱의 절반입니다.

    Pˉ=ηextV^oc28Rs\bar{P} = \frac{\eta_\mathrm{ext} \hat{V}_\mathrm{oc}^{2}}{8 R_s}

    ✓ 재현하는 수식 lfr.P_env (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/harvesting.py

압전 전원(piezoelectric source): 부하와 인터페이스

섹션 제목: “압전 전원(piezoelectric source): 부하와 인터페이스”

진폭이 일정한 정현파 진동을 받는 압전 소자는 클램프 커패시턴스 C0C_0와 병렬인 전류원 Ipsin⁡ωtI_p \sin \omega t입니다. 부하나 인터페이스가 가져가는 에너지는 반주기마다 그 전류의 전하가 어디로 가는지로 정해집니다.

  1. 아무것도 연결하지 않으면 전류 전부가 C0C_0를 충전합니다: v=1C0∫Ipsin⁡ωt dtv = \frac{1}{C_0}\int I_p \sin \omega t \, dt.

    v=−Ipcos⁡(ωt)C0ωv = - \frac{I_p \cos{\left(\omega t \right)}}{C_0 \omega}
  2. 그 진폭.

    Vp=IpωC0V_p = \frac{I_p}{\omega C_0}

    ✓ 재현하는 수식 piezo.Vp (pytest가 sympy로 일치를 검증함)

  3. 소자 양단의 저항 RR은 C0C_0와 전류를 나눕니다. 전압 진폭은 Ip∣R∥1/(jωC0)∣I_p |R \parallel 1/(j\omega C_0)|이고, 저항이 받는 전력은 그 제곱의 절반을 RR로 나눈 값입니다.

    P=RIp22(1+C02R2ω2)P = \frac{R I_p^{2}}{2 \left(1 + C_0^{2} R^{2} \omega^{2}\right)}
  4. dP/dR=0dP/dR = 0.

    R=1ωC0R = \frac{1}{\omega C_0}

    ✓ 재현하는 수식 piezo.R_opt (pytest가 sympy로 일치를 검증함)

  5. 이를 대입합니다.

    P=Ip24ωC0P = \frac{I_p^{2}}{4 \omega C_0}

    ✓ 재현하는 수식 piezo.P_R (pytest가 sympy로 일치를 검증함)

  6. 전원은 변위의 두 극값 사이, 즉 반주기마다 2Ip/ω2 I_p/\omega의 전하를 흘립니다.

    q=2Ipωq = \frac{2 I_p}{\omega}
  7. 전파 브리지를 거쳐 VDCV_\mathrm{DC}에 연결하면, 소자 전압이 −VDC-V_\mathrm{DC}에서 VDCV_\mathrm{DC}까지 바뀐 뒤에야 브리지가 도통하며, 이 변화에 전하 2C0VDC2 C_0 V_\mathrm{DC}가 듭니다. 나머지 전하가 VDCV_\mathrm{DC}로 들어갑니다.

    E1/2=VDC(−2C0VDC+2Ipω)E_{1/2} = V_\mathrm{DC} \left(- 2 C_0 V_\mathrm{DC} + \frac{2 I_p}{\omega}\right)
  8. 단위 시간당: π/ω\pi/\omega마다 반주기 하나.

    P=2IpVDCπ−2C0ωVDC2π=2VDC(Ip−ωC0VDC)πP = \frac{2 I_p V_\mathrm{DC}}{\pi} - \frac{2 C_0 \omega V_\mathrm{DC}^{2}}{\pi} = \frac{2 V_\mathrm{DC} \left(I_p - \omega C_0 V_\mathrm{DC}\right)}{\pi}

    ✓ 재현하는 수식 piezo.P_std (pytest가 sympy로 일치를 검증함)

  9. dP/dVDC=0dP/dV_\mathrm{DC} = 0: 개방 전압 진폭의 절반.

    VDC=Ip2C0ωV_\mathrm{DC} = \frac{I_p}{2 C_0 \omega}
  10. 이를 대입합니다.

    Pstd,max=Ip22πωC0P_\mathrm{std,max} = \frac{I_p^{2}}{2 \pi \omega C_0}

    ✓ 재현하는 수식 piezo.P_std_max (pytest가 sympy로 일치를 검증함)

  11. SECE는 극값 사이에서 소자를 개방해 두므로 전압이 0에서 2Ip/(ωC0)2 I_p/(\omega C_0)까지 오릅니다. 극값에서 12C0v2\tfrac12 C_0 v^2 전부를 꺼내며, 이는 부하와 무관합니다.

    E1/2=2Ip2C0ω2E_{1/2} = \frac{2 I_p^{2}}{C_0 \omega^{2}}
  12. 단위 시간당.

    P=2Ip2πωC0P = \frac{2 I_p^{2}}{\pi \omega C_0}

    ✓ 재현하는 수식 piezo.P_sece (pytest가 sympy로 일치를 검증함)

  13. 병렬 SSHI는 극값마다 소자 전압을 ∓VDC\mp V_\mathrm{DC}에서 ±γVDC\pm\gamma V_\mathrm{DC}로 반전시키므로, 반대쪽 레일까지의 변화에는 (1−γ)C0VDC(1 - \gamma) C_0 V_\mathrm{DC}만 듭니다.

    E1/2=VDC(−C0VDC(1−γ)+2Ipω)E_{1/2} = V_\mathrm{DC} \left(- C_0 V_\mathrm{DC} \left(1 - \gamma\right) + \frac{2 I_p}{\omega}\right)
  14. 단위 시간당.

    P=2IpVDCπ−C0ωVDC2π+C0γωVDC2π=2VDC(Ip−ωC0VDC(1−γ)2)πP = \frac{2 I_p V_\mathrm{DC}}{\pi} - \frac{C_0 \omega V_\mathrm{DC}^{2}}{\pi} + \frac{C_0 \gamma \omega V_\mathrm{DC}^{2}}{\pi} = \frac{2 V_\mathrm{DC} \left(I_p - \frac{\omega C_0 V_\mathrm{DC} \left(1 - \gamma\right)}{2}\right)}{\pi}

    ✓ 재현하는 수식 piezo.P_sshi (pytest가 sympy로 일치를 검증함)

  15. dP/dVDC=0dP/dV_\mathrm{DC} = 0.

    VDC=IpC0ω(1−γ)V_\mathrm{DC} = \frac{I_p}{C_0 \omega \left(1 - \gamma\right)}
  16. 이를 대입합니다.

    PSSHI,max=Ip2πωC0(1−γ)P_\mathrm{SSHI,max} = \frac{I_p^{2}}{\pi \omega C_0 \left(1 - \gamma\right)}

    ✓ 재현하는 수식 piezo.P_sshi_max (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/piezo.py

전류 출력형 하이사이드 모니터는 션트 양단의 작은 전압을 전류로 바꾸고, 출력 저항이 이를 다시 접지 기준 전압으로 바꿉니다.

  1. 션트 양단의 옴의 법칙입니다. 이 전압은 신호이면서, 션트가 측정 대상 회로에서 빼앗는 전압이기도 합니다.

    VSENSE=ISENSERSENSEV_\mathrm{SENSE} = I_\mathrm{SENSE} R_\mathrm{SENSE}

    ✓ 재현하는 수식 sense.burden (pytest가 sympy로 일치를 검증함)

  2. 이상적 증폭기는 같은 전압을 RINR_\mathrm{IN} 양단에 걸므로, RINR_\mathrm{IN}을 흐르는 전류는 VSENSE/RINV_\mathrm{SENSE}/R_\mathrm{IN}입니다.

    IOUT=VSENSERINI_\mathrm{OUT} = \frac{V_\mathrm{SENSE}}{R_\mathrm{IN}}
  3. 그 전류가 ROUTR_\mathrm{OUT}으로 흘러 나가므로 VOUT=IOUTROUTV_\mathrm{OUT} = I_\mathrm{OUT} R_\mathrm{OUT}입니다.

    VOUT=ISENSERSENSEROUTRINV_\mathrm{OUT} = \frac{I_\mathrm{SENSE} R_\mathrm{SENSE} R_\mathrm{OUT}}{R_\mathrm{IN}}

    ✓ 재현하는 수식 sense.current_out_monitor (pytest가 sympy로 일치를 검증함)

  4. 전압 출력형 증폭기는 센스 전압에 고정 이득 GG를 곱하고, 전류가 0일 때의 출력을 정하는 REF 핀 전압을 더합니다.

    VOUT=GISENSERSENSE+VREFV_\mathrm{OUT} = G I_\mathrm{SENSE} R_\mathrm{SENSE} + V_\mathrm{REF}

    ✓ 재현하는 수식 sense.voltage_out_monitor (pytest가 sympy로 일치를 검증함)

  5. 입력 오프셋 전압은 센스 전압에 그대로 더해지므로, 두 증폭기 모두 출력이 나타내는 전류는 다음과 같습니다.

    Imeas=VOS+ISENSERSENSERSENSEI_\mathrm{meas} = \frac{V_\mathrm{OS} + I_\mathrm{SENSE} R_\mathrm{SENSE}}{R_\mathrm{SENSE}}
  6. 측정값은 전류와 관계없이 오프셋을 센스 저항으로 나눈 만큼 실제 전류보다 큽니다.

    IOS,eq=VOSRSENSEI_\mathrm{OS,eq} = \frac{V_\mathrm{OS}}{R_\mathrm{SENSE}}

    ✓ 재현하는 수식 sense.offset_current (pytest가 sympy로 일치를 검증함)

  7. 켈빈 연결이 없으면 센스 연결점이 패드와 납땜부 너머에 있고, 그 저항 RpadR_\mathrm{pad}에도 같은 전류가 흐릅니다. RSENSER_\mathrm{SENSE}로 환산한 측정값은 다음과 같습니다.

    Imeas=ISENSE(RSENSE+Rpad)RSENSEI_\mathrm{meas} = \frac{I_\mathrm{SENSE} \left(R_\mathrm{SENSE} + R_\mathrm{pad}\right)}{R_\mathrm{SENSE}}
  8. 상대 오차는 전류와 무관하며, 션트가 작을수록 커집니다.

    εpad=RpadRSENSE\varepsilon_\mathrm{pad} = \frac{R_\mathrm{pad}}{R_\mathrm{SENSE}}

    ✓ 재현하는 수식 sense.pad_error (pytest가 sympy로 일치를 검증함)

  9. 둘이 함께 있으면 증폭기는 ISENSE(RSENSE+Rpad)+VOSI_\mathrm{SENSE} (R_\mathrm{SENSE} + R_\mathrm{pad}) + V_\mathrm{OS}를 보고 이를 RSENSER_\mathrm{SENSE}에 흐르는 전류로 읽습니다. 출력은 이 전류를 출력 식에 넣은 값이며, 출력을 높이는 부호의 오프셋이 출력의 상한을, 반대 부호의 오프셋이 하한을 줍니다.

    Imeas=VOS+ISENSE(RSENSE+Rpad)RSENSE=ISENSE(RSENSE+Rpad)RSENSE+VOSRSENSEI_\mathrm{meas} = \frac{V_\mathrm{OS} + I_\mathrm{SENSE} \left(R_\mathrm{SENSE} + R_\mathrm{pad}\right)}{R_\mathrm{SENSE}} = \frac{I_\mathrm{SENSE} \left(R_\mathrm{SENSE} + R_\mathrm{pad}\right)}{R_\mathrm{SENSE}} + \frac{V_\mathrm{OS}}{R_\mathrm{SENSE}}

    ✓ 재현하는 수식 sense.reading (pytest가 sympy로 일치를 검증함)

  10. 상대 오차는 교차 항 없이 두 몫의 합입니다. 오프셋의 몫은 1/ISENSE1/I_\mathrm{SENSE}에 비례해 줄고, 패드의 몫은 그대로입니다.

    εI=VOS+ISENSERpadISENSERSENSE=VOSISENSERSENSE+RpadRSENSE\varepsilon_I = \frac{V_\mathrm{OS} + I_\mathrm{SENSE} R_\mathrm{pad}}{I_\mathrm{SENSE} R_\mathrm{SENSE}} = \frac{V_\mathrm{OS}}{I_\mathrm{SENSE} R_\mathrm{SENSE}} + \frac{R_\mathrm{pad}}{R_\mathrm{SENSE}}

    ✓ 재현하는 수식 sense.rel_error (pytest가 sympy로 일치를 검증함)

  11. 전류 출력형 증폭기는 노드 A에서 전류 IOUTI_\mathrm{OUT}을 ROUTR_\mathrm{OUT}으로 흘립니다. 그 뒤에 R-C 필터가 이어집니다. RfR_f는 노드 A와 노드 B 사이에, CfC_f는 노드 B와 접지 사이에 있고, 노드 B에는 다른 부하가 없습니다. 노드 A의 전류 평형(라플라스 영역)은 다음과 같습니다.

    IOUT=VA−VBRf+VAROUTI_\mathrm{OUT} = \frac{V_A - V_B}{R_f} + \frac{V_A}{R_\mathrm{OUT}}
  12. 노드 B에서는 다음과 같습니다.

    VA−VBRf=VBsCf\frac{V_A - V_B}{R_f} = V_B s C_f
  13. 커패시터 전압에 대해 풀면 극점이 하나이며, 직류에서 출력은 그대로 IOUTROUTI_\mathrm{OUT} R_\mathrm{OUT}입니다.

    VBIOUT=ROUT1+sCfROUT+sCfRf\frac{V_B}{I_\mathrm{OUT}} = \frac{R_\mathrm{OUT}}{1 + s C_f R_\mathrm{OUT} + s C_f R_f}
  14. 그 극점의 시정수는 Cf(ROUT+Rf)C_f (R_\mathrm{OUT} + R_f)입니다. 커패시터는 RfR_f와 직렬인 ROUTR_\mathrm{OUT}을 봅니다. ROUTR_\mathrm{OUT}은 자신이 부하로 걸린 전류원의 테브난 저항입니다.

    Rfilt=ROUT+RfR_\mathrm{filt} = R_\mathrm{OUT} + R_f

    ✓ 재현하는 수식 sense.filter_R (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/sensing.py

벤치: 에지, 게이트 구동, 상승 시간, 돌입 전류, 열, 배터리 단자

섹션 제목: “벤치: 에지, 게이트 구동, 상승 시간, 돌입 전류, 열, 배터리 단자”

인덕터와 커패시터의 법칙, 1차 회로의 계단 응답, 게이트 저항 양단의 옴의 법칙, 직렬 열 경로, Rint 배터리 모델에서 나오는 결과를 벤치에서 쓰는 형태로 정리합니다.

  1. 인덕턴스 양단 전압은 전류의 변화율에 비례합니다.

    v=Lloopddti(t)v = L_\mathrm{loop} \frac{d}{d t} i{\left(t \right)}
  2. 에지 tedget_\mathrm{edge} 동안 ΔI\Delta I만큼 선형으로 변하는 전류는 일정한 속도로 변합니다.

    ddti(t)=ΔItedge\frac{d}{d t} i{\left(t \right)} = \frac{\Delta I}{t_\mathrm{edge}}
  3. 따라서 에지 동안 루프 인덕턴스에 걸리는 전압은 다음과 같습니다.

    Vspike=LloopΔItedgeV_\mathrm{spike} = \frac{L_\mathrm{loop} \Delta I}{t_\mathrm{edge}}

    ✓ 재현하는 수식 layout.v_spike (pytest가 sympy로 일치를 검증함)

  4. 턴오프 에지 뒤에 루프 인덕턴스는 스위치 노드 커패시턴스와 직렬 L-C를 이루어 다음 주파수로 링잉합니다.

    fring=12πCnodeLloopf_\mathrm{ring} = \frac{1}{2 \pi \sqrt{C_\mathrm{node}} \sqrt{L_\mathrm{loop}}}
  5. 따라서 링잉 주파수에서 루프 인덕턴스를 구할 수 있습니다.

    Lloop=14π2fring2CnodeL_\mathrm{loop} = \frac{1}{4 \pi^{2} f_\mathrm{ring}^{2} C_\mathrm{node}}

    ✓ 재현하는 수식 layout.L_ring (pytest가 sympy로 일치를 검증함)

  6. 드레인 전압이 바뀌는 동안 게이트는 플래토 전압 VplV_\mathrm{pl}에 머뭅니다. 드라이버는 게이트 루프 저항 RGR_G 뒤에서 출력을 VGSV_\mathrm{GS}(턴온) 또는 0(턴오프)으로 바꾸므로, 옴의 법칙에 따라 그동안 게이트 전류는 일정합니다.

  7. 턴온 때

    IG=VGS−VplRGI_G = \frac{V_\mathrm{GS} - V_\mathrm{pl}}{R_G}

    ✓ 재현하는 수식 gate.I_on (pytest가 sympy로 일치를 검증함)

  8. 턴오프 때

    IG=VplRGI_G = \frac{V_\mathrm{pl}}{R_G}

    ✓ 재현하는 수식 gate.I_off (pytest가 sympy로 일치를 검증함)

  9. 일정한 전류는 일정한 속도로 전하를 전달합니다.

    q=IGtq = I_G t
  10. 따라서 게이트가 게이트-드레인 전하 QGDQ_\mathrm{GD}를 받는 플래토는 다음 시간 동안 지속됩니다.

    tpl=QGDIGt_\mathrm{pl} = \frac{Q_\mathrm{GD}}{I_G}

    ✓ 재현하는 수식 gate.t_pl (pytest가 sympy로 일치를 검증함)

  11. 커패시터의 전하는 커패시턴스와 전압의 곱이므로, 전하 QbootQ_\mathrm{boot}를 공급하면 전압이 다음만큼 떨어집니다.

    ΔVboot=QbootCboot\Delta V_\mathrm{boot} = \frac{Q_\mathrm{boot}}{C_\mathrm{boot}}
  12. 강하가 ΔVboot\Delta V_\mathrm{boot} 이하가 되려면 커패시턴스는 적어도 다음 값이어야 합니다.

    Cboot=QbootΔVbootC_\mathrm{boot} = \frac{Q_\mathrm{boot}}{\Delta V_\mathrm{boot}}

    ✓ 재현하는 수식 boot.C (pytest가 sympy로 일치를 검증함)

  13. 단일 극점 시스템은 단위 계단 입력에 다음과 같이 응답합니다.

    y=1−e−tτy = 1 - e^{- \frac{t}{\tau}}
  14. 최종값의 10 %와 90 %에 도달하는 시각은 각각 다음과 같습니다.

    (t10=τln⁡(109), t90=τln⁡(10))\left( t_{10} = \tau \ln{\left(\frac{10}{9} \right)}, \ t_{90} = \tau \ln{\left(10 \right)}\right)
  15. 따라서 10-90 % 상승 시간은 다음과 같습니다.

    trise=2τln⁡(3)t_\mathrm{rise} = 2 \tau \ln{\left(3 \right)}
  16. -3 dB 대역폭은 같은 극점의 차단 주파수입니다.

    fBW=12πτf_\mathrm{BW} = \frac{1}{2 \pi \tau}
  17. τ\tau를 소거하면:

    trise=ln⁡(3)πfBW=ln⁡(9)2πfBWt_\mathrm{rise} = \frac{\ln{\left(3 \right)}}{\pi f_\mathrm{BW}} = \frac{\ln{\left(9 \right)}}{2 \pi f_\mathrm{BW}}

    ✓ 재현하는 수식 probe.t_rise (pytest가 sympy로 일치를 검증함)

  18. 팁과 접지가 이루는 루프의 인덕턴스와 프로브 입력 커패시턴스는 직렬 L-C를 이룹니다. 손실이 없으면 전류 ii는 다음 식을 따릅니다.

    Lgndd2dt2i(t)+i(t)Cprobe=0L_\mathrm{gnd} \frac{d^{2}}{d t^{2}} i{\left(t \right)} + \frac{i{\left(t \right)}}{C_\mathrm{probe}} = 0
  19. 그 해는 다음 각주파수로 링잉합니다.

    ω0=1CprobeLgnd\omega_0 = \frac{1}{\sqrt{C_\mathrm{probe}} \sqrt{L_\mathrm{gnd}}}
  20. 주파수로 나타내면 다음과 같습니다.

    fprobe=12πLgndCprobef_\mathrm{probe} = \frac{1}{2 \pi \sqrt{L_\mathrm{gnd} C_\mathrm{probe}}}

    ✓ 재현하는 수식 probe.f_ring (pytest가 sympy로 일치를 검증함)

  21. 빈 커패시터가 직렬 저항을 통해 계단 전압 VgV_g에 연결되면 다음 전류로 충전됩니다.

    i=Vge−tCinRserRseri = \frac{V_g e^{- \frac{t}{C_\mathrm{in} R_\mathrm{ser}}}}{R_\mathrm{ser}}
  22. 이 전류는 커패시터 전압이 0인 계단 순간에 가장 큽니다.

    Iinrush=VgRserI_\mathrm{inrush} = \frac{V_g}{R_\mathrm{ser}}

    ✓ 재현하는 수식 inrush.I_pk (pytest가 sympy로 일치를 검증함)

  23. 펄스 전체에 걸친 전류 제곱의 적분은 다음과 같습니다.

    I2t=Vg2Cin2RserI^2 t = \frac{V_g^{2} C_\mathrm{in}}{2 R_\mathrm{ser}}

    ✓ 재현하는 수식 inrush.I2t (pytest가 sympy로 일치를 검증함)

  24. 커패시터 전류는 커패시턴스와 전압 변화율의 곱입니다.

    i=Cinddtv(t)i = C_\mathrm{in} \frac{d}{d t} v{\left(t \right)}
  25. 따라서 전압을 trampt_\mathrm{ramp} 동안 0에서 VgV_g까지 선형으로 올리면 일정한 전류가 흐릅니다.

    Iramp=CinVgtrampI_\mathrm{ramp} = \frac{C_\mathrm{in} V_g}{t_\mathrm{ramp}}

    ✓ 재현하는 수식 inrush.I_ramp (pytest가 sympy로 일치를 검증함)

  26. 열저항은 열 경로의 한 부분 양단 온도 차를 그 부분을 지나는 전력 1 W당으로 나타낸 값입니다. 소자의 전력 전부가 접합에서 케이스로, 케이스에서 방열판으로, 방열판에서 주위로 차례로 흐르면 다음이 성립합니다.

    (TJ−TC=PDθJC, TC−TS=PDθCS, TS−TA=PDθSA)\left( T_J - T_C = P_D \theta_\mathrm{JC}, \ T_C - T_S = P_D \theta_\mathrm{CS}, \ T_S - T_A = P_D \theta_\mathrm{SA}\right)
  27. 주위 온도에서부터 온도 상승분을 더하면 다음과 같습니다.

    TJ=TA+PD(θJC+θCS+θSA)T_J = T_A + P_D \left(\theta_\mathrm{JC} + \theta_\mathrm{CS} + \theta_\mathrm{SA}\right)

    ✓ 재현하는 수식 therm.Tj (pytest가 sympy로 일치를 검증함)

  28. Rint 모델은 내부 저항 뒤의 개방 전압입니다. 충전 전류는 저항을 거쳐 양극 단자로 들어갑니다(`bat.rint`).

    Ib=V−VbRbI_b = \frac{V - V_b}{R_b}
  29. 따라서 단자 전압은 다음과 같습니다.

    V=Vb+IbRbV = V_b + I_b R_b

    ✓ 재현하는 수식 bat.v_term (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/bench.py

시뮬레이션: 회로를 한 타임 스텝(time step)씩 계산하기와 정착에 걸리는 시간

섹션 제목: “시뮬레이션: 회로를 한 타임 스텝(time step)씩 계산하기와 정착에 걸리는 시간”

시뮬레이터는 회로의 상태를 한 타임 스텝씩 계산합니다. 한 스텝 안에서 스위칭 컨버터는 전원이 일정한 선형 회로이며, 1차 회로의 예에서 보듯 이런 회로는 한 스텝을 정확히 계산할 수 있습니다. 흔히 쓰는 적분 규칙들은 감쇠 모드 하나, 곧 시험 방정식(test equation)으로 비교합니다. 이 방정식에서 각 규칙은 스텝마다 편차에 일정한 배율을 곱합니다. 끝으로 출력 필터 링잉의 포락선을 이용해, 정지 상태에서 시작한 시뮬레이션을 몇 스위칭 주기 동안 실행해야 마지막 주기들이 정상상태를 보여 주는지 구합니다.

  1. 한 스텝 안에서 회로는 선형이고 전원은 일정합니다. 그러면 저항을 통해 충전되는 커패시터는 남은 전압 차에 비례하고 시정수 τ\tau에 반비례하는 속도로 전압 v∞v_\infty에 다가갑니다.

    ddtv(t)=v∞−v(t)τ\frac{d}{d t} v{\left(t \right)} = \frac{v_\infty - v{\left(t \right)}}{\tau}
  2. 스텝이 시작할 때의 전압 v0v_0을 초기값으로 풉니다.

    v(t)=v∞+(v0−v∞)e−tτv{\left(t \right)} = v_\infty + \left(v_0 - v_\infty\right) e^{- \frac{t}{\tau}}
  3. 스텝이 끝나는 t=Δtt = \Delta t에서의 값입니다. 근사한 것이 없으므로 스텝을 그 구간 전체만큼 길게 잡아도 됩니다.

    v1=v∞+(v0−v∞)e−Δtτv_1 = v_\infty + \left(v_0 - v_\infty\right) e^{- \frac{\Delta t}{\tau}}

    ✓ 재현하는 수식 sim.exact_step (pytest가 sympy로 일치를 검증함)

  4. 흔히 쓰는 규칙들을 감쇠 모드 하나만 떼어 비교합니다. 이 모드는 회로가 향하는 값에서 벗어난 편차 xx이며, −x/τ-x/\tau의 속도로 변합니다(시험 방정식). Δt\Delta t 동안 편차를 x0x_0에서 x1x_1로 계산하는 규칙은 매 스텝 편차에 배율 g=x1/x0g = x_1/x_0를 곱합니다.

    ddtx(t)=−x(t)τ\frac{d}{d t} x{\left(t \right)} = - \frac{x{\left(t \right)}}{\tau}
  5. 전진 오일러(forward Euler)는 스텝 시작점의 기울기를 씁니다.

    x1=x0−x0Δtτx_1 = x_0 - \frac{x_0 \Delta t}{\tau}
  6. 스텝당 배율은 다음과 같습니다.

    gFE=1−Δtτg_\mathrm{FE} = 1 - \frac{\Delta t}{\tau}

    ✓ 재현하는 수식 num.gain_fe (pytest가 sympy로 일치를 검증함)

  7. 사다리꼴 규칙(trapezoidal rule)은 스텝 양 끝의 기울기를 평균하므로 x1x_1이 양변에 나타납니다.

    x1=x0+Δt(−x0τ−x1τ)2x_1 = x_0 + \frac{\Delta t \left(- \frac{x_0}{\tau} - \frac{x_1}{\tau}\right)}{2}
  8. x1x_1에 대해 풀고 x0x_0으로 나눕니다.

    gTR=−Δt−2τΔt+2τ=1−Δt2τ1+Δt2τg_\mathrm{TR} = - \frac{\Delta t - 2 \tau}{\Delta t + 2 \tau} = \frac{1 - \frac{\Delta t}{2 \tau}}{1 + \frac{\Delta t}{2 \tau}}

    ✓ 재현하는 수식 num.gain_tr (pytest가 sympy로 일치를 검증함)

  9. 후진 오일러(backward Euler)는 스텝 끝점의 기울기를 씁니다.

    x1=x0−x1Δtτx_1 = x_0 - \frac{x_1 \Delta t}{\tau}
  10. 스텝당 배율은 다음과 같습니다.

    gBE=τΔt+τ=11+Δtτg_\mathrm{BE} = \frac{\tau}{\Delta t + \tau} = \frac{1}{1 + \frac{\Delta t}{\tau}}

    ✓ 재현하는 수식 num.gain_be (pytest가 sympy로 일치를 검증함)

  11. 스텝이 τ\tau보다 훨씬 긴 강성(stiff) 모드에서는 정확한 배율 e−Δt/τe^{-\Delta t/\tau}가 거의 0입니다. 이때 전진 오일러의 배율은 한없이 커지고, 사다리꼴 규칙의 배율은 −1-1에 가까워져 모드가 크기를 유지한 채 매 스텝 부호만 바뀌며, 후진 오일러의 배율은 정확한 배율처럼 0에 가까워집니다.

    (lim⁡Δt→∞(−Δt−2τΔt+2τ)=−1, lim⁡Δt→∞(τΔt+τ)=0)\left( \lim_{\Delta t \to \infty}\left(- \frac{\Delta t - 2 \tau}{\Delta t + 2 \tau}\right) = -1, \ \lim_{\Delta t \to \infty}\left(\frac{\tau}{\Delta t + \tau}\right) = 0\right)
  12. 후진 오일러는 인덕터 전류를 스텝 끝점의 기울기, 곧 인덕터 전압 vL,1v_{L,1}을 인덕턴스로 나눈 값으로 계산합니다.

    i1=i0+vL,1ΔtLi_1 = i_0 + \frac{v_{L,1} \Delta t}{L}
  13. 다이오드가 꺼지기 전에 다이오드 전류가 0을 지나 −Ios-I_\mathrm{os}까지 내려갔습니다. 이 전류가 흐를 다른 경로가 없으면 다음 스텝은 전류가 0인 상태로 끝나야 합니다.

    0=−Ios+vL,1ΔtL0 = - I_\mathrm{os} + \frac{v_{L,1} \Delta t}{L}
  14. 그 스텝에서 인덕터에 걸리는 전압에 대해 풉니다.

    vjump=LIosΔtv_\mathrm{jump} = \frac{L I_\mathrm{os}}{\Delta t}

    ✓ 재현하는 수식 sim.step_jump (pytest가 sympy로 일치를 검증함)

  15. 이상적인 부품으로 된 벅을 생각합니다. 전원을 끄면(전압원은 단락) 필터의 인덕턴스와 커패시턴스, 부하 저항이 병렬이 됩니다. 이 병렬 RLC 회로의 자연 응답은 este^{st} 꼴이며, ss는 특성 방정식의 근입니다.

    1CL+sCR+s2=0\frac{1}{C L} + \frac{s}{C R} + s^{2} = 0
  16. 필터가 링잉할 때 두 근은 켤레 복소수입니다. 두 근의 합의 절반인 공통 실수부가 −α-\alpha이며, α\alpha는 링잉 포락선의 감쇠율, 곧 네퍼 주파수(neper frequency)입니다.

    α=12CR\alpha = \frac{1}{2 C R}
  17. 포락선은 e−αte^{-\alpha t}로 감쇠하며, 시정수는 인덕턴스와 관계없이 1/α1/\alpha입니다(이상적인 부품에서).

    τenv=2RC\tau_\mathrm{env} = 2 R C

    ✓ 재현하는 수식 filter.tau_env (pytest가 sympy로 일치를 검증함)

  18. 정지 상태에서 시작한 시뮬레이션은 처음 오차가 정상상태 값만큼 큽니다. NN 스위칭 주기 뒤에는 이 오차가 처음 값의 εr\varepsilon_r배로 줄어듭니다.

    εr=e−NTsτenv\varepsilon_r = e^{- \frac{N T_s}{\tau_\mathrm{env}}}
  19. NN에 대해 풉니다.

    Nset=−τenvln⁡(εr)Ts=τenvln⁡(1εr)TsN_\mathrm{set} = - \frac{\tau_\mathrm{env} \ln{\left(\varepsilon_r \right)}}{T_s} = \frac{\tau_\mathrm{env} \ln{\left(\frac{1}{\varepsilon_r} \right)}}{T_s}

    ✓ 재현하는 수식 sim.periods_settle (pytest가 sympy로 일치를 검증함)

유도 스크립트: python/pe_core/derive/numerics.py

이 사이트의 예제, 프리셋, 연습 문제에 나오는 수치는 교육용으로 만든 어림수(합성 값)이며, 실제 설계의 데이터가 아닙니다.