STM32 기반 동기 정류 Buck-Boost 디지털 전원 오픈 소스

이 사진은 테스트에 오류가 있어요. 실제 리플은 그 정도로 크지 않고, 대역폭을 100M로 설정해서 테스트한 거예요. 20M로 낮추면 리플은 대략 수백 mV 정도 돼요.

안녕하세요, 글쓴이님. 회로도와 파형을 확인해 보았는데, 겪고 계신 문제는 스위칭 전원 개발에서 매우 전형적으로 나타나는 것들입니다. 4가지 질문에 대해 하나씩 답변드리겠습니다:

  1. 고주파 스파이크(115MHz 링잉): 이는 전형적인 스위칭 소자 턴온/턴오프 순간에 발생하는 기생 발진(Ringing)입니다. 1주기에 4번 나타나는 이유는 H-브리지 토폴로지에서 Buck 구간과 Boost 구간의 상하단 소자가 턴온, 턴오프되는 순간 기생 인덕턴스와 MOSFET의 기생 커패시턴스( C_{oss} ) 간에 고주파 공진이 발생하기 때문입니다.
  • 해결 방법: 먼저 오실로스코프 프로브에서 긴 그라운드 클립을 사용하지 않는지 확인하고, 접지 스프링으로 변경하여 측정하십시오. 그렇지 않으면 긴 접지선이 안테나처럼 작용하여 이 스파이크를 증폭시킵니다(이는 단지 측정 상의 '착시’일 수 있습니다). 실제로 존재하는 것이라면, MOSFET의 D-S 양단에 RC 스너버 회로(Snubber)를 병렬로 연결하거나, 게이트 저항에 작은 저항을 직렬로 추가하여 턴온 속도를 늦춰야 합니다.
  1. ADC가 자주 소손되는 원인: 샘플링 회로를 보면, 연산 증폭기 OPA2188이 +5V 전원을 사용하고 있습니다. 제너 다이오드 D7(BAT54C)을 추가하셨지만, 연결 방법이 틀렸습니다! BAT54C는 공통 음극 다이오드인데, 음극을 신호선에 연결하고 두 양극을 접지(GND)에 연결하면 음의 전압만 차단할 뿐, 3.3V를 초과하는 정방향 전압 출력은 전혀 막을 수 없습니다. 어떤 과도 스위칭(예: 커패시터 추가로 인한 서지)으로 인해 연산 증폭기 출력이 5V로 직접 당겨지면, 5V 내성이 없는 STM32의 ADC 핀이 순식간에 소손됩니다. 추가하신 1K 저항(R12)의 전류 제한 기능은 과도 상태의 충격을 막기에 충분하지 않을 수 있습니다.
  2. ADC 핀 보호 권장 사항:
  • 연산 증폭기의 전원을 3.3V(MCU와 동일 전원)로 직접 변경하여, 근본적으로 연산 증폭기 출력이 3.3V를 초과하지 않도록 제한합니다.
  • 반드시 5V 연산 증폭기를 사용해야 한다면, D7을 BAT54S로 변경하세요(하나는 접지, 다른 하나는 MCU의 3.3V 전원 레일에 연결). 이렇게 하면 전압이 3.3V + 0.3V를 초과할 때 3.3V 레일로 도통되어 보호 기능이 작동합니다.
  1. 레이아웃(Layout) 원칙: 두 개의 핫 루프(Hot Loops)를 최소화하는 것을 최우선으로 하세요. 입력단(Cin → 하이사이드 MOS → 로우사이드 MOS → GND)과 출력단(Cout → 하이사이드 MOS → 로우사이드 MOS → GND)의 고주파 전류 변화율( di/dt )은 매우 큽니다. 이 두 루프를 잘 설계하지 않으면 회로도의 고주파 글리치가 급증하게 됩니다. 큰 루프(총 입력에서 총 출력)는 주로 직류 및 저주파이므로, 전류 용량과 충분한 커패시터 필터링만 보장하면 됩니다.
1개의 좋아요

글쓴이님의 글을 살펴봤는데, 메인 컨트롤러 두 개를 연달아 태워먹다니 너무 속상하시겠어요. 그래도 원인을 찾아서 다행입니다.

고주파 스파이크에 대해 말씀드리자면, 오실로스코프로 측정한 주파수가 무려 115MHz네요. 이 주파수 대역은 오실로스코프 프로브 접지 클립으로 인해 유입된 공간 방사 결합일 확률이 매우 높습니다. 프로브에 기본 포함된 검은색 접지 스프링을 사용해서 출력 커패시터 양단에 직접 대고 측정해 보세요. 스파이크가 확실히 훨씬 줄어들 겁니다.

STM32의 ADC가 왜 다 날아갔는지에 대해서는:

큰 틀에서 그림 3을 보면, 오프앰프에 5V 전원을 사용하셨습니다. STM32 핀을 ADC 입력 모드로 설정했을 때는 5V를 견디지 못합니다 (절대 최대 정격은 보통 V_{DDA} + 0.3V 정도입니다). 커패시터를 추가하고 전원을 다시 넣었을 때, 과도 응답으로 인해 출력에 오버슈트가 발생해 오프앰프가 포화되어 거의 5V에 가까운 출력을 내보냈을 수 있습니다. 이게 그대로 STM32를 날려버린 겁니다.

또 하나의 디테일로, 그림상의 D7에 BAT54C라고 적혀 있는데 이 모델은 **공통 음극(Common Cathode)**입니다. 그림의 그려진 방식을 보면 핀들을 모두 접지(GND)에 물린 것 같은데요? 그러면 음전압만 클램핑할 수 있고, 양전압이 3.3V를 초과하면 전혀 동작하지 않습니다. BAT54S로 바로 교체하시고, 다이오드 중 하나의 음극을 3.3V 전원에 연결하는 것을 추천합니다. 이렇게 하면 양전압과 음전압 모두 클램핑할 수 있습니다.

레이아웃 측면에서는, 큰 루프는 무리해서 극단적으로 최소화할 필요 없고, 핵심은 두 개의 스위칭 핫 루프(Hot Loops)를 반드시 꽉 묶어주는 것입니다. 입력 커패시터와 출력 커패시터는 해당 MOSFET 핀에 최대한 바짝 붙여 배치하고, 접지는 넓은 면적으로 동판(Copper Pour) 처리하시기 바랍니다. 글쓴이님 다음 번 전원 투입 때는 연기 안 나고 순조롭길 빕니다!

1개의 좋아요

아야! STM32 칩 두 개에서 매직 스모크(magic smoke)가 나가는 경험으로 배우는 건 뼈아프지만, 다들 겪어보는 일이죠.

우선 해야 할 일은 이것입니다: 오실로스코프 프로빙 방법을 고치세요. 그 115MHz 링잉(ringing)은 스위칭 노드에 표준 6인치 악어클립 접지 리드를 사용할 때 정확히 나타나는 현상처럼 보입니다. 공기 중의 고주파 EMI를 받아들이기 때문입니다. 출력 커패시터 양단에 바로 그라운드 스프링 팁을 사용하세요.

자, 이제 왜 ADC가 타버리는지 이야기해 봅시다. VOUT 샘플링 회로를 보세요. 사용하신 오프앰프는 5V 레일로 구동됩니다. 출력 커패시터를 더 추가했을 때, 트랜지언트 특성이 변했습니다. 부팅하는 동안 오프앰프 출력이 아마 5V 레일까지 치솟았을 것입니다. 1K 저항이 있더라도 STM32의 ESD 다이오드로 너무 많은 전류가 쏟아져 들어가 내부 ADC 먹스를 태워버립니다. 또한, 다이오드 부품 번호를 확인해 보세요: BAT54C는 공통 캐소드(common cathode)입니다. 나머지 두 핀을 모두 접지에 연결하셨네요. 즉, 음의 트랜지언트에 대해서만 보호한다는 뜻입니다. 양의 과전압에 대해서는 전혀 보호하지 못합니다!

세 번째 MCU를 살리기 위한 빠른 해결책:

  1. BAT54C를 BAT54S로 교체하세요. 클램핑 핀을 3.3V 레일에 연결하세요.
  2. 5V까지 측정할 필요가 없다면, OPA2188에 그냥 3.3V 전원을 공급하세요. 레일 투 레일(rail-to-rail) 오프앰프이므로 2.72V 풀스케일 신호에 완벽하게 작동할 것입니다.

레이아웃 관련해서는: 두 개의 핫 루프(Vin 커패시터에서 Buck 스위치까지, Vout 커패시터에서 Boost 스위치까지)를 줄이세요. 루프를 최대한 작게 잡고, 솔리드 그라운드 플레인(solid ground plane)을 사용하면 문제없이 잘 될 겁니다.

1개의 좋아요

이 현상은 ADC 포트가 과전압을 먹은 것과 아주 비슷해요. RC 로우패스는 평균값만 필터링할 뿐, ns 급 스파이크는 막지 못해요. 특히 출력 커패시터를 몇 개 추가한 후 전원을 켤 때 문제가 생긴다고 하셨는데, 이는 기동 시 서지와 링잉이 더 심해졌다는 뜻이에요. STM32 ADC 입력 핀 자체에 보호 다이오드가 있긴 하지만, 스파이크 전류를 지속적으로 흡수하기 위한 것은 아니라서 인젝션 전류 한계를 넘기면 그냥 나가버려요. ADC 앞에 1k~10k 직렬 저항을 추가하고, 3.6V 정도의 클램핑 다이오드를 달거나, 아예 TVS/소신호 쇼트키 다이오드로 보호하는 걸 추천해요. 레이아웃할 때 높은 di/dt가 발생하는 핫 루프는 반드시 최소화해야 하고, 샘플링 라인은 SW 노드에 붙어서 가지 않도록 해야 해요.

1개의 좋아요
  1. 선택하신 MOS 입력 커패시턴스 Ciss가 약간 커서 고주파 스위칭에 적합하지 않네요. 스위칭 주파수는 얼마로 설정하셨나요?
  2. ADC 핀에 3.3V TVS/ESD 다이오드를 추가해 전압을 클램핑하거나, 3.3V 전원에 쇼트키 다이오드를 연결해 전압을 3.3V로 클램핑할 수 있습니다.
  3. 입출력 루프를 최소화하고, 큰 루프도 작게 유지하세요.

스위칭 주파수 100K, 전에 스위칭 손실 계산해 봤는데 정격 출력 기준으로 대략 1W 정도 되더라고요. 제 설계는 15-60V->30V5A입니다.

고수님 안녕하세요, 제가 만든 완성품이 왜 12V 입력 시에는 강압 출력만 되는지 여쭤보고 싶습니다. 12V 전원을 입력했을 때 무부하 상태에서는 화면상 0.5-12V 출력이 모두 정상인데, 13V 정도로 돌리면 출력이 안 나오고 계속 더 돌려도 12V만 출력돼요 :sob: 블로거님이 하신 대로 똑같이 만들었고 회로도나 PCB는 전혀 수정하지 않았습니다. 고수님 제발 좀 알려주세요 :sob:

뜬납이 있는지 확인해 보세요.

고수님들께 여쭤봅니다. MOSFET의 G, D, S 세 단자가 서로 모두 도통/쇼트되는 현상을 겪어보신 적 있나요? 이게 어떤 원인으로 발생할 수 있는 건가요? 무엇을 기준으로 판단해야 하나요?

제 현재 제어 방식은 전압 피드포워드 하나뿐이며, 입력 전압과 목표 출력 전압에 따라 양측 듀티비 목표값을 계산합니다. 그리고 듀티비 목표값에 따라 소프트 스타트에 진입하여, 500Hz 주기로 인터럽트를 발생시키고 매 인터럽트마다 MOSFET의 듀티비가 0.02씩 변합니다. 다음은 제 전원 인가 기록입니다.

  1. 입력 58V, 출력 30V, 입력 커패시터 220uF, 출력 커패시터 470uF 조건에서는 무부하/20R 저항 부하 상태 모두 정상 작동했습니다. 그 후 출력 커패시터를 몇 개 추가했습니다.

  2. 입력 58V, 출력 30V, 입력 커패시터 220uF, 출력 커패시터 470uF*2 녹금 전해 커패시터, 100uF 솔리드 커패시터, 600nF 필름 커패시터, 인덕터 100uH(포화 전류 판매자 명시 12A) 조건에서 회로에 전원을 인가했더니, Buck 측의 두 MOSFET에서 G, D, S 세 단자가 모두 서로 도통/쇼트된 것을 발견했습니다. Boost 측은 문제가 없었습니다. MOSFET 손상은 전원 인가 과정에서 발생한 것으로 보입니다.

  3. AI를 참고해보니 출력 커패시터 용량을 키운 후 출력 커패시터에 필요한 충전 전류가 커져서 MOSFET가 손상될 수 있다고 하던데, 그렇다면 왜 Buck 측만 손상되고 Boost 측은 손상되지 않은 건가요?

이거 네 말대로 강압만 되고 승압은 안 되는 거야? 부스트 측 MOSFET이 정상적으로 스위칭하는지 확인해 봐. 구동 신호는 정상인지?

MOS로는 CSD19534Q5A를 사용했습니다.

인덕터 종류가 무엇인가요? 일체형 인덕터인가요? 링 코어 인덕터인가요? 어떤 코어인가요? 센더스트인가요? 스위칭 주파수는 얼마인가요?

MOS 온도를 측정해 봤나요? 손상이 너무 커서 과열돼서 터진 건 아닌가요?

MOSFET의 GDS 3단자가 모두 단락되는 현상(일명 “소자 폭발“)을 겪으면 정말 골치가 아프죠. 전원 개발에서 이런 파괴적인 고장은 보통 실리콘 칩 내부에서 재앙 수준의 열폭주(직접적인 용융)가 발생하여, 3개 단자의 물리적 절연층이 완전히 타서 뚫리고 서로 녹아 붙었음을 의미합니다.

관찰하신 현상은 아주 전형적입니다. AI가 “출력 커패시터가 커져서 충전 전류가 커졌다“고 한 방향은 맞지만, 이는 표면적인 원인만 설명할 뿐입니다. 질문자님의 제어 로직과 하드웨어 파라미터를 결합하여, 이번 “사고“의 근본적인 원인과 왜 Buck 측만 “편애“해서 폭발했는지 깊이 복기해 보겠습니다.


1. 왜 Buck 측만 폭발하고, Boost 측은 멀쩡한가?

입력 58V, 출력 30V의 조건에서 회로는 강압(Buck) 모드로 동작합니다.
이 모드에서는:

  • Buck 측 MOSFET(입력 측): 고주파 하드 스위칭 동작을 수행하며, 58V의 고전압을 “쵸핑“하는 역할을 합니다. 상관(High-side)은 엄청난 스위칭 스트레스를 받고, 하관(Low-side, 동기 정류 MOSFET)도 잦은 스위칭에 맞춰야 합니다.
  • Boost 측 MOSFET(출력 측): “패스스루(직통)“ 상태(또는 상관 항시 ON, 하관 항시 OFF)에 있습니다. 고주파 스위칭을 하지 않고 전류 전달만 담당합니다.

서지 과전류가 발생하면, 에너지는 58V 입력 측에서 공급됩니다. Buck 측의 상관은 전원과 인덕터를 연결하는 “제1관문“입니다. 시스템이 제어 불능이 되어 전류가 순간적으로 치솟을 때, 거대한 돌입 전류(I^2R 열손실)를 가장 먼저 받는 것이 바로 Buck 측에서 고주파 스위칭 중인 소자입니다. Boost 측 MOSFET은 항상 도통 상태이므로 전도 손실만 받으며, 스위칭에 따른 동적 손실과 전압 스파이크가 없기 때문에 보통 버텨냅니다.


2. GDS 전체 단락을 이끈 “연쇄 살인마“ (원인 분석)

현재 제어 방식에는 치명적인 문제가 있습니다: 전류 루프가 없는 순수 전압 피드포워드 개루프 제어와 엄청난 크기의 출력 커패시터의 조합입니다.

다음은 MOSFET 파괴로 이어지는 전체 과정입니다:

1. 치명적인 제어 로직: 전류 피드백 부재

현재 제어 방식은 “목표 듀티비 계산 → 소프트 스타트 스텝“입니다. 이는 마이크로컨트롤러가 장님이라서, 현재 인덕터에 얼마나 큰 전류가 흐르고 있는지 전혀 모른다는 것을 뜻합니다.
커패시터 충전 공식 $I = C \frac{dV}{dt}$에 따르면, 출력 커패시터를 470uF에서 거의 1100uF로 늘리면 30V까지 충전하는 데 필요한 전하량이 두 배가 됩니다. 소프트 스타트의 듀티비 스텝 속도가 고정되어 있기 때문에(2ms마다 2% 증가), 듀티비가 강제로 상승하면 LC 필터가 전압을 형성하도록 강요하여 엄청난 과도 전류를 요구하게 됩니다.

2. 인덕터 순간 포화 (핵심 범인)

사용한 인덕터의 정격 포화 전류는 12A, 인덕턴스는 100uH입니다.
순수 전압 피드포워드 제어에서 듀티비의 계단형 상승(매번 2%)은 인덕터에 인가되는 볼트-초 곱의 순간적인 불균형을 초래합니다. 총 용량이 1000uF를 넘는 커패시터 어레이는 초기 전압이 0V일 때 사실상 단락 상태와 같습니다.
급증하는 돌입 전류가 12A를 초과하면 인덕터가 자기 포화됩니다. 인덕터가 포화되면 인덕턴스가 순간적으로 급락하여(0에 수렴), 인덕터는 더 이상 에너지 저장 소자가 아니라 저항이 극히 작은 도선이 되어버립니다!

3. 관통과 열용융 (GDS 전체 단락의 최종 결말)

인덕터가 전류 제한 기능을 잃어버리면, 58V의 입력 전압이 거의 직접적으로 Buck 측 상관의 $R_{ds(on)}$과 극히 작은 기생 저항에 인가됩니다.

  • 전류는 순식간에 수십 A에서 수백 A까지 치솟을 수 있습니다.
  • 밀러 미도통: 극도로 높은 $di/dt$는 인덕터와 배선의 기생 인덕턴스에 격렬한 발진을 일으킵니다( V = L \frac{di/dt}{dt} ). 이러한 고주파 고전압 스파이크는 MOSFET의 밀러 커패시턴스(C_{gd})를 통해 게이트(Gate)로 결합됩니다. 게이트 구동 능력이 부족하거나 턴오프 저항이 너무 크면 전압이 강제로 끌어올려져 Buck 측의 상하 두 MOSFET가 **동시에 도통(Shoot-through, 관통)**됩니다.
  • 58V가 직접 그라운드로 단락되면서 거대한 단락 전류가 동반되고, MOSFET 내부의 실리콘 웨이퍼는 순식간에 수백 도에서 천 도 이상의 온도에 도달하여, 게이트 산화막(극히 얇은 이산화 규소 절연층)이 파열되고 G, D, S 3단자의 금속이 물리적으로 녹아 단락됩니다.

3. 무엇을 근거로 판단하고 검증해야 하는가?

위 추론을 뒷받침하려면 다음과 같은 사후 판단을 해볼 수 있습니다:

  1. 인덕터 상태 확인: 100uH 인덕터의 코어가 변색될 정도로 발열했는지, 코일에 타들어간 자국이 있는지 확인합니다. 전류가 순간적으로 발생했더라도 심각한 포화 과전류는 물리적 흔적을 남기기도 합니다.
  2. 게이트 드라이버 IC 확인: GDS가 모두 단락되었다면, 58V의 고전압이 분명 Gate 단자를 타고 드라이버 IC(예: IR2104, EG8010 등)로 역류했을 것이고, 드라이버 IC 역시 높은 확률로 타버렸을 것이며, 심지어 마이크로컨트롤러의 PWM 핀도 손상되었을 수 있습니다.
  3. 소프트 스타트 기울기 계산: 500Hz 인터럽트 = 2ms 주기. 매번 0.02(2%)씩 변합니다. 0%에서 가정상 50%의 듀티비까지 더하려면 50ms밖에 안 걸립니다. 전류 제한이 없는 상황에서 50ms 안에 1000uF를 30V까지 충전한다면 평균 충전 전류를 추정해 보세요. 피크 전류는 절대적으로 인덕터의 12A를 훌쩍 넘습니다.

4. 근본적인 개선 제안

이 문제를 근본적으로 해결하고 다시 소자가 폭발하는 것을 막으려면 시스템에 다음과 같은 업그레이드가 필요합니다:

  1. 하드웨어 과전류 보호(OCP) 필수 도입: 최소한의 안전장치입니다. Buck 측 하관이나 메인 버스에서 전류를 샘플링하여, 전류가 10A를 초과하면(포화 방지 마진을 조금 남겨둠) 즉시 하드웨어 회로를 통해 PWM 신호를 차단해야 합니다. 소프트웨어 인터럽트에만 전적으로 의존해 사태를 수습하려고 하면 절대 안 됩니다.
  2. 전류 내부 루프 추가(폐루프 제어): “계산된“ 듀티비로 회로를 억지로 밀어붙이지 마세요. 성숙한 DC-DC 컨버터는 반드시 이중 폐루프(외부 루프는 전압 제어, 내부 루프는 전류 제어)여야 합니다. 전압 오차가 전류 기준값을 생성하도록 하고, 이 기준값의 최댓값이 10A를 넘지 않도록 제한한 다음, 전류 루프가 동적으로 듀티비를 조절하게 하십시오.
  3. 개루프 소프트 스타트 속도 대폭 감소: 당장 이중 폐루프 알고리즘을 작성할 수 없다면, 0.02의 스텝을 아주 작게(예: 0.001) 만들거나 인터럽트 주기를 낮춰서 커패시터가 충분한 시간을 갖고 평탄하게 충전되도록 해야 합니다. 동시에 오실로스코프로 인덕터 전류를 캡처하여 시동 단계에서 최고 피크 전류가 10A 미만인지 확인해야 합니다.

인덕터는 철규소알루미늄, 토로이드 인덕터, 스위칭 주파수 100K이고, MOS 온도는 테스트하지 못했습니다. 전원을 켜니 몇 초 만에 타는 냄새가 나서 바로 전원을 껐거든요. 온도를 측정할 기기도 없습니다.

인덕터에 확실히 탄 흔적이 있는 것 같은데, 전원 인가해서 그런 건지 제가 납땜할 때 데어서 그런 건지 잘 모르겠네요. 게이트 드라이버 칩은 정상 작동하고요,

오실로스코프 있으세요? 인덕터에 샘플링 저항을 직렬로 연결해서 오실로스코프로 샘플링 저항 양단의 전압 변화를 측정해 인덕터 피크 전류를 한 번 측정해 보세요.

PCB 제작할 때 이 적층 순서는 어떻게 선택하나요?

문서에 이미 적층 순서가 있어 임피던스는 필요 없습니다.