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).
Làm xong được cái này sẽ giỏi, nên các em cố gắng nhé
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ị.
Làm xong được cái này sẽ giỏi, nên các em cố gắng nhé