Nguồn điện số Buck-Boost chỉnh lưu đồng bộ dựa trên STM32, mã nguồn mở

Tại sao cả CC1 và CC2 của usb2 đều không nối điện trở kéo xuống, và gnd của usb2 lại nối với vin- thay vì mass hệ thống? Liệu như vậy cổng nối tiếp có bị không ổn định không, và có ảnh hưởng đến việc lấy mẫu adc không?

Nối với VIN- là để dòng điện đầu vào đi qua điện trở lấy mẫu, nhờ đó ngay cả khi chỉ kết nối USB2 vẫn có thể lấy mẫu được dòng điện đầu vào.

Chào tác giả, xin hỏi tại sao điện áp đầu ra lại cao hơn điện áp cài đặt vậy?

Chủ blog, khi viết phần mềm bạn có sử dụng sự kiện fault của HRTIM không? Tôi sử dụng comparator để khi dòng cuộn cảm lớn hơn ngưỡng cài đặt của mình, MOSFET sẽ bị cắt trực tiếp bằng phần cứng, nhưng trong quá trình khởi động mềm, tôi thấy ngõ ra PWM của mình dường như bị tắt, tôi nghĩ là do dòng nạp tụ quá lớn, dẫn đến việc chạm ngưỡng cài đặt của tôi, khiến ngõ ra PWM bị tắt, tôi muốn biết cách cấu hình HRTIM của STM32 để thực hiện Cycle-by-Cycle, tức là trong giai đoạn khởi động mềm, nếu chạm đến giá trị dòng cuộn cảm tối đa mà tôi đã cài đặt, ngõ ra PWM sẽ lập tức tắt, nhưng ở chu kỳ tiếp theo ngõ ra PWM sẽ tự động mở,

Bạn đã hiệu chuẩn mạch đo của mình chưa? Bo mạch bạn vẽ sẽ có nhiều thông số ký sinh, dẫn đến một số thay đổi nhỏ về độ khuếch đại của mạch đo, cần phải được hiệu chuẩn thì mới có thể xuất ra giá trị đúng với độ chính xác tương đối.

Phần mềm có thay đổi gì không, kiểm tra mạch lấy mẫu xem có vấn đề gì không.

Bác ạ, em đã thêm bảo vệ quá dòng phần cứng (giới hạn dòng từng chu kỳ), và cũng làm chậm quá trình khởi động mềm vòng hở (hiện tại 500Hz, bước nhảy 0.001), em chưa thêm vòng dòng trong vì em nghĩ nên hoàn thành xong vòng hở trước rồi mới thêm vòng kín,

  1. Khi em test trên mạch, em phát hiện ở trạng thái không tải thì mạch hoạt động bình thường, nhưng sau khi em thêm tải 20R (điện áp ra Vo đặt ở 30V) thì MOS lại bị hỏng, nguyên nhân có thể là gì?

  2. Mạch và code giữa lúc không tải và có tải là hoàn toàn giống nhau, tại sao lại xảy ra tình trạng MOS bị hỏng?

  3. Bước tiếp theo nên làm thế nào? Có phải là giảm tụ đầu ra không? Vì trước đây khi tụ đầu ra của em khá nhỏ thì mạch có tải vẫn hoạt động bình thường, nhưng sau khi em thêm tụ đầu ra rồi cấp nguồn lại thì MOS bị hỏng. Nếu em giảm tụ đầu ra thì mạch có thể hoạt động bình thường không? Tại sao lại như vậy?

Vấn đề này rất điển hình, dòng xung kích khi sạc tụ đầu ra trong quá trình khởi động mềm rất dễ kích hoạt nhầm bảo vệ quá dòng. Nếu bạn đang dùng Chế độ khóa HRTIM Fault (Latched), thì một khi đã kích hoạt, nó sẽ đóng cắt cho đến khi phần mềm xóa thủ công, đây chính là hiện tượng “PWM đóng hoàn toàn” mà bạn thấy.

Để thực hiện Cycle-by-Cycle (giới hạn dòng từng chu kỳ), tư duy cốt lõi là: Fault chỉ đóng cắt chu kỳ hiện tại, chu kỳ tiếp theo tự động khôi phục. Về mặt phần cứng, HRTIM hoàn toàn hỗ trợ chức năng này, không cần phần mềm phải xóa cờ (flag) thủ công ở mỗi chu kỳ.

Dưới đây là một số điểm chính về cấu hình, bạn cứ cấu hình trực tiếp theo thanh ghi hoặc HAL:


1. Cấu hình nguồn Fault ở chế độ “tự động khôi phục”

Trong HRTIM_FLTINR1/2, tìm kênh Fault kết nối với bộ so sánh của bạn (ví dụ Fault1), tập trung vào hai bit sau:

  • FLTxP[1:0] (Fault Polarity): Cấu hình theo cực tính đầu ra của bộ so sánh, thường là active ở mức cao.
  • FLTxSRC[1:0] (Fault Source): Chọn đầu vào ngoài (COMPx_OUT hoặc chân ngoài).
  • FLTxF[3:0] (Fault Filter): Nên thêm bộ lọc vài ns để tránh xung nhiễu (glitch) từ bộ so sánh gây kích hoạt nhầm.

Quan trọng nhất là FLTxRSM (Fault Reset Mode) trong thanh ghi HRTIM_FLTxR:

  • Cấu hình thành 0: Immediate —— Sau khi tín hiệu Fault biến mất, PWM sẽ khôi phục ngay lập tức.
  • Đừng cấu hình thành Latched (khóa), cái đó dùng để bảo vệ lỗi, không phải để giới hạn dòng từng chu kỳ.

2. Cấu hình phản hồi Fault cấp Timer

Trong thanh ghi HRTIM_TIMxFLTR (x tương ứng với Timer của bạn, ví dụ TIMA/B/C/D):

  • FLTxEN: Kích hoạt kênh Fault tương ứng.
  • FLTLCK: Trong giai đoạn khởi động mềm, không nên khóa trước, hãy giữ tự động khôi phục.
  • Trạng thái đầu ra bảo vệ Fault: Cấu hình thành “mức đầu ra không hoạt động” (Trạng thái Active đóng cắt MOS), cụ thể tùy thuộc vào việc driver MOS trên/dưới của bạn là active cao hay active thấp. Đầu ra Fault của HRTIM có thể cấu hình trạng thái Set/Reset độc lập.

3. Điểm mấu chốt: Blanking hoặc tạm thời tăng ngưỡng trong quá trình khởi động mềm

Khi khởi động mềm, dòng sạc tụ rỗng I = C × dV/dt, nếu độ rộng xung tăng quá nhanh, dòng xung kích này rất dễ vượt qua điểm giới hạn dòng hoạt động bình thường của bạn. Ngoài việc thay đổi chế độ HRTIM, nên kết hợp ở cấp hệ thống:

Phương án A: Thêm blanking dòng điện (Current Blanking) trong lúc khởi động mềm
Bản thân HRTIM hỗ trợ Fault Blanking Window, nó che chắn đầu vào Fault trong một khoảng thời gian sau khi PWM mở. Nhưng cái này phù hợp hơn để che chắn nhiễu chuyển mạch, không đủ dùng cho quá trình sạc dài hàng chục ms trong lúc khởi động mềm.

Phương án B: Giới hạn dòng theo từng giai đoạn khi khởi động mềm (Khuyến nghị)

  • Trong 50ms~100ms đầu khởi động mềm, hãy tăng tạm thời ngưỡng bộ so sánh (ví dụ giới hạn dòng bình thường là 10A, trong lúc khởi động mềm đặt là 15A hoặc 20A).
  • Đợi điện áp đầu ra lên tới khoảng 80% giá trị đặt, rồi chuyển lại về ngưỡng giới hạn dòng từng chu kỳ bình thường.
  • Việc chuyển đổi này có thể dùng liên kết DMA của HRTIM, hoặc dùng bộ đếm thời gian phần mềm, không chiếm chu kỳ CPU.

Phương án C: Dùng chế độ Delayed Protection của HRTIM
Nếu bạn dùng HRTIM của G474, Timer hỗ trợ Delayed Protection (cấu hình trong HRTIM_OUTxR), có thể cài đặt sao cho khi Fault kích hoạt sẽ không đóng toàn bộ ngay lập tức, mà chỉ hạn chế độ rộng xung, nhưng cái này phù hợp với chế độ Hiccup hơn, không phải là Cycle-by-Cycle nghiêm ngặt.


4. Ví dụ HAL ở cấp mã nguồn (tham khảo ý tưởng)

// Giả sử dùng Fault1, nối COMP1_OUT, active ở mức cao
HRTIM_FaultCfgTypeDef pFaultCfg = {0};

pFaultCfg.Source = HRTIM_FAULTSOURCE_DIGITALINPUT;
pFaultCfg.Polarity = HRTIM_FAULTPOLARITY_HIGH;
pFaultCfg.Filter = HRTIM_FAULTFILTER_NONE;  // Hoặc thêm bộ lọc 2-3 clock
pFaultCfg.Lock = HRTIM_FAULTLOCK_READWRITE; // Không khóa chết

HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULT_1, &pFaultCfg);

// Quan trọng: cấu hình chế độ tự động khôi phục
HAL_HRTIM_FaultResetConfig(&hhrtim, HRTIM_FAULT_1, HRTIM_FAULTRESETMODE_IMMEDIATE);

// Timer A kích hoạt phản hồi Fault1
HAL_HRTIM_TimerFaultConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_FAULT_1, HRTIM_TIMFAULTENABLE_FAULT1);

Sau đó, trong ngắt (nếu dùng ngắt) hoặc vòng lặp chính, không cần phải xóa cờ Fault thủ công, phần cứng sẽ tự động khôi phục PWM sau khi đầu ra bộ so sánh chuyển xuống mức thấp. Điều duy nhất bạn cần lưu ý là: nếu Fault kích hoạt liên tục trong N chu kỳ, điều đó chứng tỏ đã thực sự quá dòng, lúc này phần mềm mới can thiệp để giảm độ rộng xung hoặc đóng cắt.


5. Gợi ý gỡ lỗi

Dùng oscilloscope để chụp và so sánh ba dạng sóng sau:

  1. Dòng điện cảm (hoặc điện áp điện trở lấy mẫu)
  2. Đầu ra bộ so sánh (nhìn trực tiếp chân HRTIM Fault)
  3. Đầu ra HRTIM PWM

Nếu sau khi PWM đóng cắt, đầu ra bộ so sánh đã chuyển xuống mức thấp, nhưng PWM không khôi phục → Điều này chứng tỏ FLTxRSM chưa được cấu hình thành Immediate, mà vẫn đang ở Latched.
Nếu PWM mỗi chu kỳ đều đóng cắt rồi lại mở → Điều này chứng tỏ Cycle-by-Cycle đã có tác dụng, chỉ là dòng khởi động mềm thực sự quá lớn, cần kết hợp phương án B để tăng ngưỡng tạm thời.


Tóm lại: Cycle-by-Cycle mà bạn muốn chính là Chế độ tự động khôi phục Fault + Không khóa (Latched), phần cứng HRTIM hỗ trợ nguyên bản. Đối với vấn đề kích hoạt nhầm khi khởi động mềm, khuyến nghị là kết hợp điều chỉnh động ngưỡng bộ so sánh trong giai đoạn khởi động mềm để giải quyết, cách này đáng tin cậy hơn so với việc chỉ thay đổi HRTIM.

Vấn đề của bạn rất điển hình, chạy không tải thì sống, mang tải là nổ, điều này cho thấy khởi động mềm vòng hở của bạn hoàn toàn chưa vượt qua được bài toán «ứng suất dòng điện».

Trước tiên trả lời thẳng 3 câu hỏi của bạn:

  1. Chạy không tải được, mang 20R là nổ, là vì khi khởi động có tải, dòng điện cảm = dòng sạc tụ đầu ra + dòng tải. Khi không tải, cảm chỉ cần sạc cho tụ, dòng điện nhỏ; khi mang tải 20R (1.5A), cùng một bước tỷ lệ xung như vậy, cảm phải gánh thêm thành phần một chiều 1.5A này, dòng đỉnh rất dễ xuyên qua điểm bão hòa 12A của cuộn cảm. Cuộn cảm vừa bão hòa thì coi như một sợi dây dẫn, 58V ép thẳng lên Rds(on) của MOS và điện trở mạch, dòng điện tức thì lên tới hàng chục ampe. Cái «giới hạn dòng từng chu kỳ» của bạn hoặc là điểm lấy mẫu không đúng, hoặc là tốc độ đáp ứng không theo kịp độ dốc tăng dòng sau khi bão hòa, căn bản là không bảo vệ được gì.

  2. Code giống nhau nhưng điều kiện vận hành thì khác xa trời đất. Điều khiển vòng hở như người mù, nó không quan tâm phía sau là không tải hay đầy tải, đều đẩy tỷ lệ xung theo bước cố định. Khởi động không tải là «đi dạo», khởi động có tải là «vác nặng leo núi», bạn bắt mạch chạy bằng cùng một nhịp, dòng đỉnh của cảm khi có tải có thể gấp vài lần lúc không tải, không nổ mới lạ.

  3. Giảm tụ đầu ra quả thật có thể tạm thời không nổ, vì lượng điện tích sạc cần thiết ở thời điểm khởi động ít đi, dòng đỉnh của cảm giảm, cách xa điểm bão hòa hơn. Nhưng đây chỉ là lắm le tự dối mình — bạn không thể sau này sản phẩm chỉ dùng tụ nhỏ được chứ? Nguyên nhân gốc rễ là phần điều khiển của bạn không giới hạn dòng điện. Bước tiếp theo đáng làm nhất không phải là chỉnh tụ, mà là lập tức ghép nối tiếp một điện trở lấy mẫu (hoặc đầu dò dòng) vào mạch cuộn cảm, dùng máy hiện sóng chụp một pha dạng sóng dòng điện khi khởi động có tải, xem dòng đỉnh rốt cuộc đã chạy đến bao nhiêu.


Phân tích cụ thể và đề xuất:

Hiện tại bạn đang tương đương với «chạy nửa trần» — có OCP phần cứng nhưng không có vòng kín dòng điện, bước khởi động mềm 0.001 nghe thì có vẻ nhẹ nhàng, nhưng khi khởi động với tụ lớn + tải, dòng đỉnh của cảm đã sớm vượt quá 12A rồi. Mặc dù CSD19534Q5A chịu được dòng xung 100A, nhưng đó là dựa trên tiền đề cuộn cảm chưa bão hòa và dòng điện được kiểm soát. Cuộn cảm vừa bão hòa, dòng điện mất kiểm soát, con MOS trong vài micro-giây sẽ nóng chảy thủng tấm silicon, GDS chập hoàn toàn.

Tại sao chỉ nổ bên Buck?
Ở chế độ Buck, MOS cao bên Buck là công tắc chính, trực tiếp đối mặt với đầu vào 58V và trạng thái «gần như ngắn mạch» của cuộn cảm bão hòa. MOS cao bên Boost thì luôn dẫn, chỉ cho dòng tải tương đối ổn định chạy qua, không chịu cảnh đóng cắt cứng tần số cao + xung kích bão hòa đôi công như MOS cao Buck. Năng lượng đi từ đầu vào, MOS cao Buck là cửa ải đầu tiên, nó chết trước là chuyện bình thường.

Bạn nên làm gì tiếp theo (theo mức độ ưu tiên):

  1. Chụp dạng sóng xác định nguyên nhân chết: Giảm tụ đầu ra về lại 470uF, mang tải 20R, nối tiếp một điện trở lấy mẫu 0.1Ω vào cuộn cảm (hoặc dùng đầu dò dòng trực tiếp), dùng máy hiện sóng xem dòng khởi động. Tôi cá là dòng đỉnh khởi động của bạn vượt quá 15A. Nếu giảm tụ mà dòng đỉnh hạ xuống dưới 10A và khởi động bình thường được, thì chứng tỏ là do bão hòa dòng khởi động dẫn đến nổ MOS.

  2. Kiểm tra OCP phần cứng của bạn: Điểm lấy mẫu của giới hạn dòng từng chu kỳ ở đâu? Nếu là lấy mẫu dòng điện của MOS thấp Buck (giai đoạn tự lưu), thì gai dòng điện trong thời kỳ MOS cao dẫn bạn hoàn toàn không thấy được, có vùng tối thiểu là 1 chu kỳ đóng cắt. Cuộn cảm bão hòa thường xảy ra trong thời kỳ MOS cao dẫn, đợi đến khi MOS thấp dẫn phát hiện quá dòng, thì MOS cao đã hóa thành tro bụi từ đời nào. Đề xuất:

    • Đặt điểm giới hạn dòng ở mức 8~9A (chừa dự phòng trên 3A, đừng đặt sát 12A)
    • Đảm bảo độ trễ tổng cộng từ lúc phát hiện quá dòng đến lúc ngắt PWM <500ns
    • Nếu đang dùng lấy mẫu phía thấp, hãy cân nhắc đổi sang lấy mẫu phía cao của bus điện hoặc cuộn cảm, hoặc ít nhất thêm một bộ so sánh làm ngắt nhanh bằng phần cứng
  3. Đừng cố bám lấy vòng hở nữa: Bạn đã hai lần chứng minh khởi động có tải bằng vòng hở là không khả thi. Lập tức thêm vòng trong dòng điện, cho dù là giới hạn dòng đỉnh thô sơ nhất — thêm một bộ giới hạn ở sau đầu ra vòng điện áp, kẹp giá trị đặt dòng điện trong phạm vi 10A, vượt quá là khóa PWM ngay. Cách này hiệu quả hơn bất kỳ bước khởi động mềm nào. Vòng kín kép (vòng ngoài điện áp + vòng trong dòng điện) là yêu cầu tối thiểu của Buck-Boost, không phải là tùy chọn.

  4. Cuộn cảm đã vứt đi rồi: Bạn nói cuộn cảm có vết cháy xém, thế thì cuộn cảm này đã không còn đáng tin cậy nữa. Lõi vòng từ sắt-silíc-nhôm (Sendust) một khi bị quá bão hòa, độ từ thẩm sẽ suy giảm vĩnh viễn, lần sau có thể 8A là bão hòa. Đề nghị đổi sang cuộn cảm có dòng bão hòa trên 20A, hoặc ít nhất cũng đổi một cuộn cùng loại mới tinh. Đừng tiếc tiền món này, nổ MOS thêm một lần lại càng đắt.

  5. Tụ đầu ra có thể tăng, nhưng khi khởi động phải giới hạn dòng: Tụ lớn không thành vấn đề, nhưng lúc khởi động phải sạc dòng không đổi. Các giải pháp ổn định đều giới hạn dòng cảm trước (ví dụ 5A), đợi điện áp đầu ra tăng lên gần giá trị mục tiêu rồi mới chuyển sang vòng kín điện áp không đổi. Khởi động mềm vòng hở của bạn hiện tại bản chất là đang «giữ tỷ lệ xung cố định mà đâm đầu bừa bãi», đụng trúng thì sống, đâm mạnh thì nổ.

Tóm lại: Giảm tụ đầu ra có thể giúp bạn tạm thời chạy được để làm thí nghiệm, nhưng chừng nào bạn còn khởi động vòng hở + tải lớn, nổ MOS chỉ là vấn đề thời gian. Việc cấp bách nhất hiện nay là chụp dạng sóng dòng điện để xác nhận điểm bão hòa, sau đó đưa vòng trong dòng điện vào. Đừng có bận tâm quá nhiều vào dung lượng tụ nữa, đó chỉ là hiện tượng bề nổi, khâu điều khiển bị thiếu mới là căn bệnh gốc rễ.

Tôi đã vẽ lại một phiên bản, kết quả là chân SW ở phía buck lại bị thế này (đường màu vàng), tôi cũng đã test lại sóng điều khiển high-side (đường màu đỏ). Tôi nên chỉnh sửa ở đâu? Tụ bootstrap? Hay bộ phận nào khác? Những phiên bản trước tôi không gặp vấn đề này, vấn đề này là do nguyên nhân nào gây ra?

Đã sửa chỗ nào?
Xem thử layout

Mặt sau là driver MOS, mình đã thay điện trở bằng 8R nhưng hiện tượng vẫn không đổi (trước đó mình dùng 4R)

RC và diode mắc song song với MOS đều chưa được hàn

Hình đầu tiên là sơ đồ nguyên lý của mình, hình thứ hai là điện áp VS phía BUCK so với mass và dạng sóng dòng điện cuộn cảm khi mình đo ở trên 20V, hình thứ ba là phóng to của hình thứ hai, hình thứ tư là VS và dòng điện cuộn cảm khi ở dưới 20V. PWM của mình là 100K, duty cycle cố định 0.5

  1. Tại sao khi mình tăng điện áp đầu vào, tần số gợn dòng điện cuộn cảm lại giảm xuống, và tại sao khi MOS mở lần thứ hai thì VS lại biến thành dạng sóng rất nhọn thay vì sóng vuông?

  2. Mình nên giải quyết vấn đề này như thế nào?

Xin hỏi ở chế độ điện áp không đổi, đầu ra 5V: khi tải điện tử chưa bật, điện áp đầu ra = 5V; khi bật tải điện tử lên 0.5A, tải điện tử hiển thị điện áp đầu ra thành 4.91V; khi bật tải điện tử lên 1.5A, tải điện tử hiển thị điện áp đầu ra thành 4.74V; khi bật tải điện tử lên 2.5A, tải điện tử hiển thị điện áp đầu ra thành 4.56V; nhưng trong các trường hợp trên, điện áp đầu ra lấy mẫu bởi vi điều khiển đều là 5V, xin hỏi nguyên nhân là do đâu?

Sụt áp do tổn hao dây, dây kết nối tải điện tử của bạn có phải quá nhỏ không?

Đúng là có liên quan đến tổn hao dây rồi, mình đang dùng dây cỡ 14awg. Mình thấy trong video minh họa của bạn dường như không bị ảnh hưởng bởi tổn hao dây, bạn đã làm như thế nào vậy?

Vậy bạn đo thử điện áp ở chấu kết nối trên bo mạch nguồn xem có bị sụt áp không.

Anh bạn, xem sơ đồ nguyên lý và dạng sóng bạn gửi rồi, hiện tượng này cực kỳ kinh điển khi làm nguồn điện kỹ thuật số STM32 (đặc biệt là mạch Buck-Boost dùng driver rời tự lắp).

既然 bạn đã hardcode duty cycle PWM ở mức 50% (0.5) trong code, thì lý thuyết MCU phải xuất ra sóng vuông đều đặn như bàn thạch. Hiện tượng „một rộng một hẹp“, „tần số ripple dòng cuộn cảm bị loạn (Pulse Skipping / sóng lớn nhỏ)“ và „nút VS xuất hiện xung gai cực hẹp“ mà bạn thấy ở Hình 3 (>20V), về bản chất là tín hiệu điều khiển của chu kỳ này đã bị cắt ngắn bất thường.

Dựa trên kinh nghiệm của mình, mình sẽ giúp bạn phân tích nguyên nhân và hướng xử lý nhé:

1. Sao lại xuất hiện hiện tượng này khi điện áp tăng lên?

Khi điện áp đầu vào tăng từ <20V lên >20V, thay đổi trực quan nhất là dv/dt và di/dt lúc linh kiện đóng cắt tăng lên rõ rệt, điều này sẽ gây ra một vài phản ứng dây chuyền chí mạng:

  • Nhiễu/Ground Bounce làm rối loạn MCU hoặc logic điều khiển: Sau khi điện áp tăng, nhiễu tần số cao (EMI) lúc đóng cắt sẽ mạnh lên. Các nhiễu này rất dễ ghép vào đường mạch PWM của MCU, hoặc gây ra dao động mạnh mức điện áp mass tham chiếu. Nếu đầu vào logic của IC driver đọc được một glitch, hoặc timer của vi điều khiển bị nhiễu, nó sẽ khiến PWM đáng lẽ phải kéo dài nửa chu kỳ bị tắt sớm, tạo thành „xung gai“ mà bạn nhìn thấy.

  • Mạch bootstrap bị lỗi hoặc áp âm VS quá lớn: Trong sơ đồ nguyên lý của bạn dùng sơ đồ điều khiển high-side/low-side có tụ bootstrap (C25, C27, nhìn hiện tại là 100nF). Khi điện áp tăng, dòng điện cảm tiếp diễn (freewheeling) trong thời gian dead time sẽ khiến nút VS xuất hiện ringing áp âm rất sâu (thấp hơn PGND). Nếu áp âm quá sâu, nó sẽ hút cạn điện tích trong tụ bootstrap ngay lập tức, hoặc kích hoạt bảo vệ điện áp thấp (UVLO) bên trong IC driver. Điện áp bootstrap vừa tụt, MOSFET high-side lập tức ngừng chạy và tắt, biến thành xung gai cực hẹp.

  • Bảo vệ phần cứng kích hoạt nhầm (nếu có): Nếu trên mạch của bạn có bảo vệ quá dòng phần cứng dựa trên lấy mẫu dòng điện (ví dụ như điện trở 5mΩ R27, R28 trong hình) hoặc op-amp so sánh, sau khi điện áp tăng, „Leading Edge Spike“ lúc đóng cắt cũng sẽ lớn hơn, cực kỳ dễ làm comparator đảo trạng thái nhầm, ép tắt xung PWM hiện tại.

  • Cuộn cảm có xu hướng bão hòa: Dù chưa chắc là nguyên nhân chính, nhưng điện áp tăng làm dòng điện đỉnh tăng lên, nếu dự trữ của cuộn cảm không đủ, xung gai do dòng điện tăng vọt sẽ làm trầm trọng thêm nhiễu nói trên.

2. Cách xử lý và khắc phục?

Đừng vội sửa board lớn, làm nguồn kỹ thuật số sửa Bug cần phải „truy vết theo đầu mối“, khuyên bạn nên làm theo các bước sau:

Bước 1: Định vị „thủ phạm“ thực sự là ai (quan trọng nhất!)

Hiện tại bạn mới chỉ đo nút VS. Bạn cần lấy 2 kênh của máy hiện sóng, đo đồng thời chân xuất PWM của STM32 và nút VS (hoặc chân Gate của MOSFET high-side).

  • Trường hợp A: Nếu dạng sóng đo ở chân vi điều khiển đã bị một rộng một hẹp, lung tung hết cả rồi, chứng tỏ phần công suất đang nhiễu MCU. Bạn cần kiểm tra nguồn cấp cho STM32 có ổn không, mass của phần công suất và phần tín hiệu có đổ đồng tốt/chung mass 1 điểm chưa, hoặc thử thêm một mạch lọc RC nhỏ ở gần IC driver phía PWM (ví dụ nối tiếp điện trở vài chục ohm, ghép với tụ 22pF xuống mass).

  • Trường hợp B: Nếu chân vi điều khiển xuất ra sóng vuông 50% hoàn hảo, nhưng đầu VS vẫn là xung gai, thì chứng tỏ tầng driver đang có vấn đề, tập trung kiểm tra Bước 2 dưới đây.

Bước 2: Tối ưu hóa tầng driver

Nếu là vấn đề ở phía driver, đa phần là do bootstrap hoặc tốc độ đóng cắt quá nhanh gây ra:

  1. Tăng tụ bootstrap: C25, C27 hiện tại của bạn là 100nF, chạy tần số 100k ở tải nặng hoặc điện áp cao có thể hơi yếu. Khuyến nghị nối thêm một tụ MLCC 1uF song song, đảm bảo MOSFET high-side có đủ điện tích để duy trì dẫn.

  2. Ép ringing của nút đóng cắt (trọng điểm): Dùng máy hiện sóng phóng to nhìn sườn xuống của dạng sóng, xem nút VS có chìm xuống -2V hay thậm chí thấp hơn không? Nếu có, khuyến nghị thêm RC Snubber (mạch hấp thụ RC) từ VS1 xuống mass, VS2 xuống mass, ví dụ nối tiếp một điện trở vài ohm và tụ vài trăm pF để triệt tiêu ringing.

  3. Làm chậm tốc độ đóng cắt một chút: Có thể nối tiếp một điện trở nhỏ vào chân Gate của MOSFET high-side (nếu còn chỗ trên board, nhìn sơ đồ nguyên lý có vẻ nối thẳng), hy sinh một chút tổn thất đóng cắt, giảm dv/dt xuống, toàn bộ hệ thống sẽ ổn định hơn rất nhiều.

  4. Kiểm tra phục hồi ngược của diode: Diode bootstrap của bạn dùng SS14 (Schottky), chịu áp 40V, lúc đầu vào >20V nếu cộng thêm ringing, chịu áp ngược có vẻ hơi căng, khuyến nghị đổi sang diode chịu áp cao hơn, phục hồi cực nhanh, và nối thêm một điện trở nhỏ khoảng 2.2Ω nối tiếp để giới hạn dòng điện đỉnh sạc.

Đi đo nguồn PWM ở chân vi điều khiển trước đã, xác định được là nguồn bị nhiễu hay tầng driver không chịu nổi thì mới đối chứng xuống thuốc được. Chúc sửa bug thành công!

Nhìn vào waveform và sơ đồ nguyên lý của bạn, hiện tượng này khá điển hình, nguyên nhân cốt lõi là sau khi điện áp đầu vào tăng lên, cuộn cảm đã bước vào chế độ dẫn gián đoạn (DCM).

1. Tại sao tăng điện áp đầu vào, ripple „tần số giảm", lần bật VS thứ hai là xung nhọn thay vì sóng vuông?

Tần số PWM thực ra không đổi, vẫn là 100K, đây là hiệu ứng thị giác do dạng sóng dòng điện bị biến dạng gây ra.

Bạn hiện đang chạy open-loop với duty cycle cố định 50%, ở chế độ Buck thuần thì đầu ra xấp xỉ bằng một nửa đầu vào. Khi điện áp đầu vào tăng lên, ripple dòng điện cuộn cảm ΔI = (Vin-Vout)×D/(L×f) sẽ tăng tuyến tính. Khi giá trị đỉnh-đỉnh của ripple vượt quá hai lần dòng đầu ra trung bình, giá trị đáy của dòng điện sẽ chạm thẳng xuống 0, tức là từ CCM đã rơi sang DCM.

Sau khi bước vào DCM:

  • Ở giai đoạn tắt, dòng điện cuộn cảm nhanh chóng giảm về 0, freewheeling diode ngưng dẫn, nút VS trở thành trạng thái trở kháng cao, do LC ký sinh tự cộng hưởng nên không còn bị kẹp (clamp) thành sóng vuông nữa.
  • Khi MOS mở lại ở chu kỳ tiếp theo, dòng điện cuộn cảm bằng 0, tương đương với hard switching — MOS trực tiếp sạc/xả điện dung ký sinh ở switching node, di/dt cực lớn, tạo ra một xung điện áp rất nhọn. Nhưng do không có dòng điện cuộn cảm duy trì liên tục, đỉnh xung nhanh chóng xả mất, nên trông nó là xung hẹp chứ không phải mặt bằng của sóng vuông.
  • Cái gọi là „ripple tần số giảm", thực ra là do dòng điện bám sát mức 0 trong hơn nửa chu kỳ (chỉ có dao động cộng hưởng rất nhỏ), phần sóng tam giác thực tế chỉ chiếm một đoạn ngắn, thị giác thấy như tần số bị giảm; nghiêm trọng hơn còn xuất hiện hiện tượng pulse skipping (nhảy xung), cách một chu kỳ mới truyền năng lượng một lần.

Ngoài ra, đây là NMOS cạnh cao (high-side) dùng driver bootstrap, ở chế độ DCM thì VS lâu không xuống mass, tụ bootstrap C7 không sạc được vào, khả năng drive sẽ giảm, waveform lúc mở chỉ có càng xấu đi —— trên sơ đồ nguyên lý của bạn C7 ghi 100pF, giá trị này cũng hơi nhỏ, tụ bootstrap thường bắt đầu từ vài trăm nF.

2. Làm sao để giải quyết?

Vài hướng đi, sắp xếp theo mức độ ưu tiên:

① Quay lại CCM (trị tận gốc)

  • Đổi cuộn cảm có giá trị lớn hơn: Tính toán theo điện áp đầu vào lớn nhất, đảm bảo giá trị đỉnh-đỉnh của ripple không vượt quá 30%~40% dòng điện trung bình, chừa đủ dư lượng. Đây là cách trực tiếp nhất.
  • Tăng tải: Tăng dòng đầu ra trung bình, „nâng" dòng điện đáy ra khỏi điểm 0, có thể nhanh chóng xác minh xem có phải do vấn đề DCM hay không.
  • Giảm tần số chuyển mạch cũng có thể giảm ripple, nhưng 100K là khá hợp lý rồi, không khuyến nghị can thiệp từ tần số.

② Ức chế spike và ringing (cải thiện điện ứng suất và EMI)

  • Thêm một RCD snubber từ nút VS xuống mass (ví dụ điện trở 100Ω + tụ 1nF + fast recovery diode), hoặc một RC snubber đơn giản (vài chục Ω + vài trăm pF), có thể đè spike và ringing xuống rõ rệt.
  • Về layout, diện tích mảng đồng ở switching node phải càng nhỏ càng tốt, driver loop đi đường ngắn nhất, nhằm giảm thông số ký sinh.

③ Cải thiện phương thức điều khiển

  • Bản thân open-loop với duty cycle cố định không quá phù hợp với topology Buck-Boost như vậy. Khuyến nghị đổi sang closed-loop điện áp, khi đầu vào thay đổi thì duty cycle sẽ tự động điều chỉnh, vừa ổn định điện áp lại vừa giải quyết được vấn đề DCM.
  • Nếu nhất định phải chạy open-loop, thì hãy thiết kế lại thông số cuộn cảm theo điện áp đầu vào lớn nhất của bạn, đảm bảo hoạt động ở chế độ CCM trên toàn dải.

Tóm lại một câu: Bản chất là do điện áp cao tải nhẹ nên rơi vào DCM, spike là sản phẩm của zero-current hard switching. Bạn có thể thử tạm gắn thêm một tải nặng, nếu waveform khôi phục lại thành sóng vuông + sóng tam giác giống như lúc điện áp thấp, thì xác nhận được là do vấn đề DCM, sau đó thay cuộn cảm lớn hơn là xong.

Đo bằng đồng hồ vạn năng thì điện áp cũng có sụt, không phải đúng 5V, nhưng dùng đồng hồ vạn năng đo trở kháng dây thì ở khoảng 180 mΩ, khớp với mức sụt áp khi tăng dòng điện.