Translate

15 tháng 4, 2020

[100daysTIL] Day 5 - Lithium-ion Batteries Charging : An Overview

Yo! Lại là mình Hoàng Anh đây. Hôm nay mọi người có khỏe không, có đúc kết được gì cho một ngày của mình chưa? Ngày hôm nay của mình tuy không thật thú vị nhưng mà mình cũng đã hiểu ra được một số vấn đề. Và vấn đề mình muốn nhắc tới ngày hôm nay chính là Pin Lithium-ion, cùng theo dõi với mình nhé =)))

Hình được lấy từ trang web https://www.batteryjunction.com/panasonic-ncr18650b-3400.html
Lithium-ion là loại pin có thể sạc đi sạc lại rất nhiều lần, nó được ứng dụng rộng rãi trong các mạch điện tử điển hình nhất phải kể đến là điện thoại và các dòng máy tính đời đầu. Sở dĩ được ứng dụng rộng rãi như vậy là vì kích thước nhỏ, gọn, dung lượng pin lớn và giá thành phải chăng. Nhưng nó cũng tiềm ẩn nhiều rủi ro khi sử dụng như dễ chập cháy, tuổi thọ pin không cao. Đối với những sinh viên ngành điện tử, không có nhiều kinh phí như mình thì dòng pin này là thích hợp nhất rồi. 
Điện áp của pin bị ảnh hưởng bởi dung lượng của nó, nên chúng ta có thể kiểm tra dung lượng của pin một cách tương đối thông qua điện áp nằm giữa 2 cực của nó. Ví dụ như hình ở trên điện áp bình thường của Pin là 3.7V. Khi sử dụng thì dung lượng pin bị giảm theo thời gian, nên mức điện áp lúc này sẽ nhỏ hơn giá trị 3.7V, nếu giá trị điện áp nhỏ hơn ngưỡng 2,5V thì sẽ không thể sạc được nữa và lúc này pin rơi vào trạng thái over-discharge.

Tổng quan về quá trình sạc pin Lithium

Sạc pin gồm có 3 quá trình chính là: Sạc trước, sạc ổn dòng và sạc ổn áp.

Hình được lấy từ Datasheet của IC sạc MC32BC3770 của hãng NXP Semiconductors

  1. Pre-Charge (Sạc trước)
    Chế độ sạc trước được bật khi điện áp của pin ở ngưỡng điện áp thấp. Lúc này IC sẽ tiến hành sạc chậm để điện áp của pin đạt ngưỡng ~3.5V,  trong giai đoạn này dòng sạc được giữ ổn định. (Trong sơ đồ là 150 - 450mA)
  2. Sạc ổn dòng
    Sạc ổn dòng diễn ra ở đầu chu trình sạc, lúc này điện áp sẽ tăng dần theo thời gian và dòng điện được dữ không đổi ở mức 0.1C đến 0.5C (Trong đó C là dung lượng của pin - Ví dụ trong hình là 100 - 2000mA). Dòng điện càng lớn thì thời gian sạc ổn dòng càng ngắn, pin sẽ nhanh nóng hơn, và thời gian sạc ổn áp được kéo dài lâu hơn. Kết thúc quá trình sạc ổn dòng, dung lượng pin rơi vào khoảng 70%. (Trong sơ đồ là kết thúc quá trình Fast Charge)
  3. Sạc ổn áp
    Trong giai đoạn này điện áp pin được giữ ổn định ở mức 4.2V, và dòng sạc bắt đầu giảm dần. Khi giảm về giá trị nhỏ hơn 3%C, thì chế độ sạc ổn áp chính thức kết thúc (Trong hình trên giá trị kết thúc là 100mA), lúc này IC sẽ tự động ngưng sạc. 
Ngoài ra, IC còn hỗ chợ chế độ Recharge, tức là tái kích hoạt quá trình sạc sau khi điện áp của pin giảm xuống dưới ngưỡng VRCH . Nhờ vậy điện áp pin được giữ ở mức ổn định, tránh được hiện tượng over-charge và giúp kéo dài tuổi thọ của pin.

Tổng quan về Multi-cell và nguyên lý cân bằng pin

Trong các ứng dụng lớn, các pin sẽ không hoạt động tách rời mà thường được ghép song song hoặc nối tiếp với nhau. Và ở đây chúng ta lại phát sinh ra một vấn đề mới đó là cân bằng pin (cell-ballancing technique). Vậy câu hỏi đặt ra là, tại sao lại cần cân bằng pin? Sau đây là một số nguyên nhân dẫn tới vấn đề này như: Thông số các pin do nhà sản xuất cung cấp có sai số nhất định; trong quá trình hoạt động, nhiệt độ ảnh hưởng lên mỗi pin không đều nhau dẫn đến tuổi thọ của các pin không đồng đều, thêm vào đó một số pin sẽ có điện áp cao hơn, và một số thì thấp hơn nên các pin không cân bằng về mặt điện áp.

Điều này sẽ làm nảy sinh vấn đều, pin có điện áp cao hơn sẽ đầy trước trong khi một số pin còn lại chưa đầy. Nếu vẫn tiếp tục sạc, pin đó sẽ bị over-charge khiến nhiệt độ và áp suất tăng cao, làm giảm tuổi thọ của pin, thậm chí phá hỏng pin đó. Ngược lại, trong quá trình xả, pin có điện áp thấp hơn sẽ bị sụt áp nhanh hơn, nếu vẫn tiếp tục xả sâu thì pin đó sẽ bị over-discharge, làm giảm tuổi thọ của pin. Khi một pin bị hỏng, cả bộ pin đó cũng ảnh hưởng theo và phải thay thế hoàn toàn bằng một bộ pin mới.

Để giải quyết vấn đề đó, kỹ thuật cân bằng pin ra đời. Dưới đây là sơ đồ mô tả mạch điện của kỹ thuật cân bằng pin:

Hình được lấy từ bài viết Lithium Cell Charging and Battery Management của tác giả Rod Elliott
Có hai kiểu cân bằng là chủ động và thụ động, trên hình vẽ mô tả cân bằng thụ động. Hệ thống này, khá đơn giản, hoạt động ổn định nhưng bù lại không tối ưu về mặt năng lượng. Thích hợp với các ứng dụng có từ (2 - 5 pin), tuy nhiên lại không thích hợp với các ứng dụng lớn như xe đạp điện và ô tô vì sẽ dẫn tới chi phí cao hơn cho mỗi lần sạc. 
  1. Hệ thống hiển thị trong Hình A sử dụng tín hiệu điều khiển tới các IC sạc để giảm dòng điện ngay sau khi pin đầu tiên trong gói đạt đến điện áp tối đa. Điện trở như được hiển thị có thể cho dòng điện tối đa 75mA đi qua ở mức 4.2V, và bộ sạc không được cung cấp nhiều hơn mức này. Mỗi điện trở sẽ chỉ tiêu tán 315mW, nhưng điều này tăng lên nhanh chóng cho một bộ pin rất lớn và đó là nơi hoạt động cân bằng pin trở nên cực kỳ quan trọng.
  2. Cách thiết kế trong Hình B rất đơn giản, nhưng cũng khá hữu dụng. Ba biến trở 20k được điều chỉnh để cung cấp chính xác 4.2V trên mỗi pin. Khi cân bằng có hiệu lực (ở cuối chu trình sạc), dòng điện từ bộ sạc phải nhỏ hơn 50mA, hoặc các bộ điều chỉnh shunt sẽ không thể giới hạn điện áp pin ở mức 4.2V được nữa.
    Có một hạn chế quan trọng đối với loại cân bằng này - nếu một pin bị "hỏng" (điện áp thấp hoặc bị chập), các pin còn lại sẽ bị quá tải nghiêm trọng!
Trên đây là một số thông tin mình đã tìm hiểu được liên quan tới pin Lithium. Hy vọng nó sẽ hữu ích cho các bạn, và chắc chắn là sẽ hữu ích cho mình rồi. Lời cuối cùng xin cảm ơn các bạn đã đón đọc số hôm nay của mình ^^

14 tháng 4, 2020

[100daysTIL] Day 4 - About C Embedded Language

Logo của group DÂN KỸ THUẬT
Cách đây vài năm, mình có tham gia một group rất hay trên facebook có tên là DÂN KỸ THUẬT. Mục tiêu của mình khi tham gia group này là để nâng cao kiến thức, kỹ năng cũng như học hỏi thêm những điều mới lạ từ các vị tiền bối đi trước. Và may mắn thay, ở đây mình đã tìm được một cuốn sách thật hay về lập trình nhúng. Và mình quý nó như là báu vật vậy, nên bạn bè thân thích gì là mình chia sẻ hết cả. Cuốn sách có tựa đề là "Lập trình nhúng: Chuyện chưa kể" của tác giả Nguyễn Thành Công, xuất bản ngày 15 tháng 7 năm 2018. Hôm nay mình sẽ nói về cuốn sách này, và những điều mình đã học được từ nội dung của cuốn sách. 
Đầu tiên là văn phong của cuốn sách thật sự gần gũi và thân thuộc với độc giả, phù hợp với những cậu sinh viên mới vào nghề như mình. Lối viết dí dỏm và lôi cuốn, thú vị lắm các bạn ạ ^^ Trước hết là khái niệm lập trình nhúng, nghe qua thì có vẻ xa xôi và lạ hoắc nhưng bản chất của nó thì chỉ có một: 
Lập trình nhúng là việc viết các chương chình điều khiển phần cứng, bạn vừa phải biết lập trình, lại vừa phải giỏi về phần cứng. 
Đó là điều kiện cần và đủ để bắt đầu với cái nghề này :v Ngoài ra, trong lập trình nhúng có rất nhiều ngôn ngữ khác nhau như: C, C++, Java và thậm chí có cả Python nữa. Nhưng ngôn ngữ C thì có khả năng tương tác mạnh hơn cả, và nó cũng cung cấp những giải pháp tối ưu về tốc độ cho các ứng dụng nhúng. Hơn nữa C cũng là ngôn ngữ mà tác giả đề cập trong nội dung cuốn sách này. Về cú pháp của C thì nó quanh đi quẩn lại chỉ là khai báo biến, rồi mấy vòng lặp for, while hoặc rẽ nhánh if, else chẳng hạn, nhưng kỹ năng sử dụng C để giải quyết một vấn đề thì cần nhiều bài tập để trau dồi. Giống như tác giả đã nói: 
Bạn không thể đọc sách học bơi là biết bơi, không thể đọc kiếm phổ là thành cao thủ.

 Ngôn ngữ C trong lập trình nhúng

1) Cơ bản về chương trình
Ý nghĩa của việc lập trình là chỉ cho cái máy biết, bạn muốn nó làm cái gì. Để hiểu một chương trình hoạt động ra sao, có 3 thứ mà bạn cần đặc biệt lưu tâm đó là ROM, RAM và CPU. Còn một khái niệm nữa không kém phần quan trọng đó là trình biên dịch, đây là nơi bạn viết và thực thi các dòng lệnh của mình bằng một ngôn ngữ lập trình nhất định. Trình biên dịch sẽ chuyển các dòng lệnh (người hiểu được) sang ngôn ngữ máy (máy hiểu được), và nạp vào ROM. Khi khởi chạy chương trình, CPU sẽ đọc các dữ liệu được lưu trong ROM và thực thi. ROM giống như ông trùm vậy, ra lệnh thế nào thì CPU phải làm thế đó và không được cãi lời. Còn RAM là bộ nhớ được sử dụng để thực hiện chương trình, nên phải đọc và ghi liên tục. CPU được toàn quyền sử dụng bộ nhớ này, giống như việc CPU là trưởng phòng thì RAM là nhân viên ý. 

Tóm lại: 
- ROM (Read only memory): Bộ nhớ chỉ cho phép đọc, khi mất điện dữ liệu vẫn còn đó.
- RAM (Random access memory): Bộ nhớ truy cập ngẫu nhiên, khi mất điện dữ liệu bị xóa hoàn toàn.
- CPU (Control processing unit): Là bộ xử lý chung tâm, chịu trách nhiệm thực thi chương trình.

2) Cách tổ chức bộ nhớ
Thông thường thì đơn vị nhỏ nhất của bộ nhớ là Byte (hay còn gọi là 1 ô nhớ), và ứng với mỗi byte sẽ có một địa chỉ riêng biệt. Mỗi ô nhớ sẽ có 2 thông số mà chúng ta cần quan tâm đó là:  
- Địa chỉ (nó ở đâu, địa chỉ có thể là số 8-bit, 16-bit, 32-bit...)
- Giá trị được lưu (là bao nhiêu, chỉ là số 8-bit (1 byte) thôi)
Dữ liệu trong bộ nhớ

3) Khai báo biến
Các kiểu biến thông thường khi lập trình C là char, int, long, float, double. Nhưng trong lập trình nhúng, tài nguyên bộ nhớ hạn chế nên việc bạn biết các biến chiếm bao nhiêu ô nhớ là điều rất quan trọng. Thông thường, các biến được khai báo dưới dạng uint8_t, int8_t, uint16_t, int16_t... để sử dụng thì bạn cần #include <stdin.h>. Một điểm đặc biệt nữa là kiểu uint8_t thường được dùng để đại diện cho một ô nhớ (8-bit), uint16_t sẽ yêu cầu bộ nhớ cấp 2 ô nhớ liền kề (16 bits), . . . Hãy thường sử dụng các kiểu dữ liệu với bộ nhớ tường minh trên để kiểm soát bộ nhớ chặt chẽ hơn nhé.

4) Kiểu dữ liệu tự định nghĩa (typedef)
Ngôn ngữ C cung cấp cơ chế tự định nghĩa kiểu dữ liệu để việc truy xuất dữ liệu được thuận tiện. Chúng ta sẽ cùng nhau xem xét ví dụ sau để hiểu hơn về vấn đề này nhé :v
typedef struct { 
  int8_t   temp; 
  uint8_t  humi; 
  uint16_t lux ; 
}env_t
Khi bạn tự định nghĩa một kiểu dữ liệu như trên, thực chất là bạn đang tương tác với một vùng nhớ cho trước. Nếu bạn khai báo một biến env_t evn; thì ngay lập tức, nó sẽ cung cấp cho bạn 4 ô nhớ liền nhau. Nếu bạn in địa chỉ của biến evn ra nó sẽ hiển thị địa chỉ ô nhớ đầu tiên của dãy 4 ô nhớ đó. Và kiểu env_t sẽ cho máy tính biết cách truy cập tới 4 ô nhớ đó như thế nào.
Truy cập biến kiểu evn_t
Một điểm cần lưu ý là các máy tính thường có cơ chế làm tròn biên kiểu dữ liệu (data structure alignment). Nếu chúng ta khai báo như sau:
typedef struct { 
  int8_t   temp;
  uint16_t lux ; 
  uint8_t  humi; 
}env_t
Biến lux khai báo ở giữa, thì kiểu dữ liệu env_t giờ đây có độ dài là 6 byte chứ không phải 4!!!. Lúc này cấu trúc của kiểu biến env_t sẽ có dạng như sau:
Truy cập biến kiểu evn_t
Hai ô nhớ tên padding được thêm vào để tăng hiệu suất việc đọc ghi dữ liệu trong máy tính hiện đại. Nếu các bạn quan tâm thì có thể tìm hiểu sâu hơn nhé.

5) Con trỏ
Có thể nói con trỏ là công cụ lợi hại nhất của C, bạn khó mà giỏi C nếu bỏ qua con trỏ được. Bản chất của con trỏ (chưa nói đến con trỏ hàm) là trỏ tới một vùng nhớ nào đó và tương tác với vùng nhớ đó. Một con trỏ cần 2 thông tin sau để có thể hoạt động được: địa chỉkiểu dữ liệu nó sẽ trỏ tới. 2 yếu tố trên giúp bạn có thể đi đến vùng nhớ mà bạn quan tâm sau đó có thể truy cập vùng nhớ đó theo cách bạn muốn. Một lưu ý nữa là ngôn ngữ C đồng nhất giữa mảng và con trỏ. Ví dụ mình khai báo mảng: uint32_t arr[4]; Lúc này ta sẽ có arr là địa chỉ của phần tử đầu tiên của mảng, hay arr = &arr[0] (cùng 1 địa chỉ),  *arr = arr[0] (cùng 1 giá trị).

Trên đây là một số tóm lược của mình về nội dung cuốn sách, cảm ơn các bạn đã đón đọc.