[Training HW] Bài tập 2 - Close-loop BUCK Regulator

2death

Cố Vấn CLB
Staff member
Bài 2 không khó đâu, các em đừng hoảng, thời gian Tết còn dài để từ từ ngâm cứu.

Tuy bài 2 không khó nhưng mà do các em chưa đụng đến bao giờ nên sẽ có nhiều vấn đề phải tìm hiểu, và chúng ta sẽ phải có nhiều chuyện để tâm sự với nhau trong dịp Tết này.

Bài tập HW2 đồng thời cũng là bài FW1, SW1; được dùng để học tiếp các khóa sau Tết về coding convention, UML, State machine, pseudo code,...
(các khóa training tiếp theo về Firmware, Software).
Các em hứng thú với chủ đề này thì làm luôn bài tập HW2 để học tiếp.

-------------
Đề bài tập 2 như sau:
Thiết kế + lập trình 1 mạch Buck Regulator dùng MSP430 (hoặc MCU nào khác cũng được).
(thống nhất làm mạch BUCK hết cho dễ thảo luận nhé).
Phần công suất mạch Buck tự thiết kế (chọn FET, L, C, Driver,...).
Đo áp Input, Output (có thể dùng Resistor Divider cho rẻ).
Đo dòng Iout (dùng Rshunt).
Lập trình đo đạc, xuất xung, điều khiển điện áp Vout giữ giá trị mong muốn bằng 1 con MCU nào đó.

Mục tiêu: Phối hợp nhuần nhuyễn các kỹ năng HW, FW, SW.
có kiến thức tổng quát về thiết kế mạch bao gồm các thành phần khác nhau: Power Stage, Measurement, Controller, Communication.
Biết cách viết 1 cái firmware đàng hoàng tử tế là như thế nào?
Ôn lại phần Software để lâu không xài sẽ quên.

I/ Hardware

Sơ đồ khối của mạch như sau:


VIN, OUT tự chọn, Dòng tải đạt được từ 5A trở lên tùy khả năng.



II/ Firmware

Sơ đồ điều khiển vòng kín có thể đại khái hóa như sau:


1) Define 1 hằng số tên là INCREMENTAL_BUILD
INCREMENTAL_BUILD = 1 Functional Test
INCREMENTAL_BUILD = 2 Open-Loop Test
INCREMENTAL_BUILD = 3 Close-Loop Test
INCREMENTAL_BUILD = 4 Close-Loop with GUI
//Gợi ý có 4 Build như vậy, các bạn có thể bổ sung.

Code có 4 chế độ chạy tương ứng với INCREMENTAL_BUILD bằng bao nhiêu (chỉ đổi số này ở đầu chương trình rồi rebuilt chứ không đổi code nhé).

Functional Test
+ Không cắm mạch power stage để tránh hư hỏng (ở phần HW phải có công tắc riêng cho phần power stage).

+ Test các chức năng của phần cứng xem chạy được chưa (xuất được PWM, bật được LED, UART, đọc được nút nhấn, ADC... và nói chung bất kì chức năng nào của MCU có trong mạch).

Open-Loop Test
Test vòng hở, không tải: xuất xung PWM với DutyCycle khác nhau để kiểm tra Vout theo công thức Vout=D.Vin
Đọc được Vout, Iout, Vin.
Chức năng bảo vệ quá dòng (Over Current Shutdown).
Các statusLEDs và StartButton hoạt động đúng như mô tả ở phần 2) dưới đây.

Close-Loop Test
Test từ không tải tới có tải, tải từ thấp tới cao.
Vòng điều khiển kín PID (hoặc PI, khâu D có thể không cần thiết).
Khi thay đổi tải mà áp Vout vẫn giữ nguyên giá trị là đạt yêu cầu.

Close-Loop with GUI
Như trên và vẽ được đồ thị lên GUI.

Các biến cần gửi về máy tính:
charSystemStatus // bao gồm START, IDLE, RUNNING, FAULT
intOutputVoltage
intOutputCurrent
intInputVoltage
charSystemBuild // để hiển thị mode test là 1, 2, 3 hay 4

(char, int… là kiểu của biến, ở đây chị để ví dụ, em có thể xài double, long,… gì đó cho phù hợp,
nhưng mà đặt tên biến đúng kiểu như trên).

2) Status LEDs (báo trạng thái hoạt động của hệ thống) + Start Button:

LED1: đỏ
LED2: xanh hoặc vàng.
Start Button: 1 nút nhấn.

Mấy em đừng đổi màu khác cho nó thống nhất với nhau nhé.

Khi đang khởi động: LED 1, LED 2 cùng sáng liên tục báo trạng thái “Start”.

Sau khỉ khởi động xong: LED2 tắt, LED1 chớp tắt chu kỳ 1s, báo trạng thái “Idle”.

Nhấn + giữ button “Start” trong thời gian lớn hơn 1s: Mạch chuyển sang trạng thái “Running” – bắt đầu hoạt động (mode ứng với biến INCREMENTAL_BUILD). LED1 OFF, LED2 ON liên tục.

Khi phát hiện sự cố (quá dòng,…): LED 1, 2 chớp tắt nhanh (0.5s) (mạch ngừng xuất xung cho mạch công suất) à Trạng thái “Fault”.

Sau khi người dùng khắc phục sự cố (ví dụ thay tải), từ trạng thái Fault, nhấn và giữ nút “Start” trong thời gian hơn 1s để mạch trở về trạng thái “Idle”.

3) Các functional code để trong các chương trình con, hoặc viết trong 1 file .c riêng.

Ví dụ:
Chương trình đọc ADC ở các kênh tương ứng với với dòng hay áp ngõ vào hoặc ra; return là giá trị tương ứng mình cần đọc về.
Giả sử viết như sau:

int ADCMeasurement(char ADC_CH)

Trong đó ADC_CH có thể là 1 hằng số được defined ở đầu chương trình ứng với các kênh ADC sẽ được đọc. Ví dụ:

#defined ADC_CH_INVOLT 1
#defined ADC_CH_OUTVOLT 2
#defined ADC_CH_OUTCURR 3

Chương trình đọc ADC return là giá trị lưu vào các biến tương ứng:
intInputVoltage
intOutputCurrent
intOutputVoltage

Tương tự với các chương trình con khác (gửi-nhận UART, xuất PWM, hiển thị status, đọc nút nhấn,…).

III/ Software

GUI C# (hay cái gì cũng được) nhập thông số intSetVoltage (điện áp đặt để điều khiển V_out ngõ ra).
  • Hiển thị giá trị V_set, V_out, I_out, V_in, SystemStatus
  • Vẽ đồ thị.
Chúc các em làm bài tập Tết vui :2cool_burn_joss_stick:
Làm xong được cái này sẽ giỏi, nên các em cố gắng nhé :1cool_byebye:
 

2death

Cố Vấn CLB
Staff member
Trình tự thực hiện:

Thật ra thì phần code và phần mạch hoàn toàn độc lập với nhau, bạn có thể làm cái nào trước cũng được; khi tất cả đều xong ghép lại là nó chạy.

Firm ware: Trong thời gian rảnh: bạn có thể tìm hiểu về pseudo code, state machine.

Cố gắng hiểu ý nghĩa tại sao đề lại cho bạn code phần firmware như trên?

Vẽ sơ đồ trạng thái của hệ thống; tưởng tượng các biến vào ra, chương trình mình cần những biến nào, config những cái gì, có các chương trình con nào,... để ngồi code.

Lưu đồ giải thuật, pseudo code là những cái làm cho bạn nhìn chương trình ở mức system overview, thiết lập những cái này hoàn chỉnh thì đảm bảo bạn code không sai, không thiếu. Phần code chi tiết còn lại chỉ là công việc tay chưn.

Nếu khó tưởng tượng quá thì làm mạch trước, code ráng suy nghĩ sau.

Hardware:

+ Lên sơ đồ khối tổng quát (chi tiết hơn cái chị vẽ trên kia).
+ Xem thiếu sót kiến thức phần nào để bổ sung.
+ Chọn sơ linh kiện (L, C, FET, R,...); tham khảo ý kiến bề trên để hiệu chỉnh.
+ Vẽ schematic lần 1, post lên để xin ý kiến bề trên :brick:
+ Sau khi nhận gạch đá :gach, tiếp tục vẽ schematic rồi lại up lên để nhận tiếp gạch :brick:
+ Sau khi nhận đủ gạch :5cool_beat_plaster: thì tiến hành layout.
+ Lại up layout lên để nhận gạch :whaaat:
+ Vòng lặp tiếp tục cho đến khi tàn tạ :2cool_after_boom:
+ Hoàn chỉnh layout, thi công mạch :2cool_burn_joss_stick:

Nếu chuẩn bị linh kiện trước thì tết bạn đã có mạch để chơi, nếu không để ra Tết hàn board và test.

Trong thời gian rảnh rỗi lại quay về phần code như trên.

GUI) Phần này dễ nhất, làm nhanh nhất :6cool_boss:
 

Vũ Long

Thành Viên PIF
Đã đọc xong đề bài 1 lần và đang đọc lại thêm vài lần nữa để hiểu :))))) em hỏi câu đầu tiên ạ: "Mai em cần đem theo những gì về quê để hoàn thành bài tập tết dễ thương này ạ?"
 

Vũ Long

Thành Viên PIF
Cho em hỏi:
Câu 1:

Sử dụng FET làm công tắc đóng bật thì mình đưa tín hiệu vào chân G của FET là tính hiệu GPIO nhảy lên nhảy xuống theo TIMER được không?
Câu 2:

Cái POWER MOSFET này có thêm cái diode thì nó khác gì so với cái bình thường? Và nên sử dụng cái nào cho mạch?
Câu 3: Em có đang đi đúng hướng :( Hay là bị lệch hướng rồi :(
 

2death

Cố Vấn CLB
Staff member
@Lông Vũ:
Câu 1: Em cho nó nhảy lên nhảy xuống được là hay rồi, theo Timer hay cái giống gì chả được.

Câu 2: FET chỉ cho dòng đi từ D --> S (kênh N), khi có dòng ngược thì nó chạy qua diode. Các loại FET thông thường em mua được (công suất nhỏ và vừa phải) đều có sẵn diode này rồi (nên check lại trong datasheet xem có không cho chắc).

Câu 3: Về mặt giới tính thì có vẻ em hơi bị lệch, hãy là chính mình :1cool_byebye:
 

Vũ Long

Thành Viên PIF
1. Chị ơi cho em hỏi về R shunt, làm thế nào để đo được dòng bằng ADC. R shunt chỉ là mở rộng tầm đo thôi mà?! [Edit: Solved]
2. Lúc Opened-Loop Test thì là hở mạch nên đâu có dòng Iout đâu làm sao đo?
Em đang bị vướng chỗ Iout.

<Phần công suất>


<Phần điều khiển và đọc> - Mấy cái header dạng dán em chế nên hơi xấu.
 

Fujiko

Thành Viên PIF
Em tính dùng con Q2( N mosfet) để kéo xung PWM từ 0-3v3 lên 0-12V để ON/OFF con Q1( POWER MOFET). Anh chị xem thử, trong 2 sơ đồ có cái nào xài đc không ạ? :5cool_sweat:
 

hmtmarconi

Thành Viên PIF
Mọi người cho em hỏi là hôm bữa chị P có nói là khi cấp nguồn cho mạch thì có thể chuyển trung gian qua 1 tầng switching dùng mc34063 để cho con 1117 đở nóng,vậy em dùng con 2596 cũng được phải không ạ
 

2death

Cố Vấn CLB
Staff member
Chú Hứa với chú Thiện, 2 chú design được 50% cái mạch rồi, 2 chú up lên c coi với lại để cho đàn em nó hiểu là nên làm tiếp như thế nào đi.
 

hmtmarconi

Thành Viên PIF
đây là mạch của em,còn thiếu một số chỗ :D với mạch đo IOUT thì nên dùng con opamp như thế nào ạ,chỗ đó e mới vẽ sáng nay thôi nên chắc còn thiếu chút :gach
 

hoangthien94

Ban Chủ Nhiệm
Xin lỗi chị em làm ăn hơi chậm :gach. Em post lên đây trước phần nguồn (gồm cả nguồn cho phần analog và digital của mạch) và các module chính của phần công suất.

1/ Power Supply:

- Input: 24VAC
- Output: VIN (for measurement), 12VDC, 5VDC, 3V3DC (digital +analog)
Requirements:
- Seperate VCC and GND lines for analog and digital components (AVCC + AGND / DVCC + DGND)
- Power rail -> SMPS -> LDO
- ...

2/ Fet Driver + Buck Converter + Opto:

References:
http://www.payitforward.edu.vn/forum/threads/779/
http://www.payitforward.edu.vn/forum/threads/1816/
http://www.payitforward.edu.vn/forum/threads/277/
( hmtmarconi bổ sung nhé)

P/S:
1. Bài khá dài và nhiều chi tiết, hi vọng làm được chạy được :botay:
2. Từ 1. -> bạn nào hỏi về firmware và hardware thì nên lập post riêng để tránh loãng, mọi người cũng dễ xem và comment hơn :1cool_byebye:
 

hoangthien94

Ban Chủ Nhiệm
3/ Voltage and Current Monitor:
- Voltage Sensing: cũng chia áp tương tự như của hmtmarconi, chỉ thêm vào một bộ đệm không đảo (buffer) trước khi đưa tới chân vi điều khiển

Diode Schottky để bảo vệ ngõ vào của opamp nếu Vin/ Vout tăng quá cao. Cũng có thể thay bằng diode Zener 3V mắc song song với trở 3k, nhưng bản thân diode Zener cũng cần dòng Iz để hoạt động nên có thể ảnh hưởng tới opamp.

- Current Sensing: ở đây em chọn cách dùng Rshunt kiểu Highside (ngoài ra còn có kiểu Lowside, kiểu dùng IC như ACS712 v.v...)

Linh kiện chính: INA138 (sample của TI)
Chọn RL=5k, Rs=0.1ohm => Vo = 0.1Is, với Ismax = 5A (mục tiêu: 10A) => Rs = 0.1ohm, 5W

P/S: Tiếp tục nhận gạch nào :gach
 

nguyễn đình huân

Cố Vấn CLB
hoangthien94:
- Nguồn 5V cấp cho opamp thì em dùng LDO luôn cho gọn mà đo đạc thì cần điện áp ổn định nữa.
- Chỗ con IR2184 chân Vs "thả rông" rùi em.:D
- FET kích bằng áp mà R1, R2 em chọn khá lớn còn R3, R4 lại khá nhỏ, đổi giá trị của chúng lại thì phù hợp.
 

Vũ Long

Thành Viên PIF
Giờ em làm riêng phần công suất và đo thành 1 phần giống như booster của KIT Launchpad được không? Như vậy thì đỡ được phần nạp với sử dụng đèn và nút nhấn trên KIT luôn...
 

Vũ Long

Thành Viên PIF
2 anh hmtmarconi với anh hoangthien94 cho em hỏi chỗ Buck converter của mấy anh để con Schottky Diode với con trở để làm gì vậy ạ? Và sau đó có cuộn L để làm gì?
Còn bên phần FET driver có diode với trở nữa để làm gì?
 
Top