Site icon TAPIT

Sử dụng chức năng ADC trên NodeMCU và ESP32 Dev Kit

I. Cơ bản về ADC đối với NodeMCU và ESP32 DEVKIT

ADC – Analog to Digital Converter là một trong những ngoại vi quan trọng của vi điều khiển. Ngày nay đa số các cảm biến thông số môi trường như nhiệt độ, độ ẩm, độ sáng, tốc độ… đều trả về kết quả dưới dạng analog tuy nhiên vi điều khiển không thể xử lý được các dữ liệu ở dạng này vì vậy trong các dòng vi điều khiển thường có bộ chuyển đổi tương tự – số ADC.

Để hiểu về ADC chúng ta cần làm rõ 2 khái niệm chính là độ phân giải và thời gian lấy mẫu:

Hình vẽ trên biểu diễn quá trình xấp xỉ một tín hiệu liên tục (đường màu tím) thành các giá trị rời rạc (đường màu xanh), quá trình này được gọi là lượng tử hóa tín hiệu. Dễ dàng nhận ra rằng ở hình vẽ trên sử dụng 8 mức rời rạc khác nhau để lượng tử hóa tín hiệu màu tím và để biểu diễn được 8 mức này phải dùng 3 bit nhị phân, vì vậy ta nói bộ ADC có độ phân giải 3 bit. Từ đây cũng cho thấy một vấn đề quan trọng là nếu bộ ADC có độ phân giải càng thấp thì số mức để lượng tử hóa tín hiệu đầu vào càng ít dẫn đến tín hiệu đầu ra (tín hiệu sau khi lượng tử hóa) sẽ biến dạng càng nhiều so với tín hiệu đầu vào.

Ví dụ: bộ ADC có độ phân giải 10 bit và điện áp tham chiếu Vref + và Vref – là 5V và 0V. Khi đó giá trị số chuyển đổi sẽ nằm trong dải từ 0 đến 210-1 = 1023. Tức là:

Khi điện áp đầu vào là 0V    -> giá trị số chuyển đổi là 0

                                     5V    -> giá trị số chuyển đổi là 1023

                                     2.5V -> giá trị số chuyển đổi là: (2.5*1023)/5

Với việc Vref + bằng điện áp nguồn của vi điều khiển đã dẫn đến việc Vref + luôn bị thay đổi do sự không ổn định của điện áp nguồn. Vì vậy trên ESP32 và ESP8266 nhà phát hành đã thiết kế một điện áp tham chiếu khác là 1100mV ít chịu ảnh hưởng từ điện áp nguồn hơn.

Sự ảnh hưởng của nhiễu đối với giá trị analog: Khi tín hiệu analog của các cảm biến bị nhiễu tác động vào sẽ làm sai lệch đi giá trị điều này khiến cho việc chuyển đổi ADC trở nên không chính xác vì vậy cần phải có biện pháp để giảm sự ảnh hưởng của nhiễu đối với giá trị ADC. Ở phương diện phần cứng, để giảm nhiễu chúng ta có thể kết nối một tụ điện 0.1uF vào chân ADC input. Ở phương diện phần mềm có thể sử dụng phương pháp đa mẫu (lẫy mẫu liên tục trong một khoảng thời gian sau đó lấy giá trị trung bình của mẫu).

Hình minh họa cho thấy hiệu quả của việc giảm nhiễu bằng hai phương pháp trên:

II. Bộ ADC trong NodeMCU và ESP32 DEVKIT

NodeMCU: ESP8266 hỗ trợ 1 kênh ADC 10bit (chân A0 trên kit NodeMCU) với điện áp vào nằm trong dải từ 0 đến 1.1V (điện áp tham chiếu mặc định là 1.1V). Tuy nhiên bên trong kit NodeMCU đã thiết kế sẵn một cầu phân áp như hình vẽ sau:

Với cầu phân áp này ta có thể đưa điện áp vào tại chân A0 trên NodeMCU tối thiểu 0V và tối đa là 3.3V để không vượt quá ngưỡng giới hạn của bộ ADC trên ESP8266.

ESP32 DEVKIT: hỗ trợ 2 bộ ADC 12bit với tổng cộng 18 kênh.

Tuy nhiên khi sử dụng ADC trên ESP32 cần lưu ý như sau:

Hàm sử dụng trong lập trình chức năng đọcADC:  

analogRead(ADC_pin);

Ví dụ: Sử dụng NodeMCU đọc giá trị điện áp của biến trở, nếu điện áp lớn hơn hoặc bằng 2V thì sáng LED GPIO16, ngược lại tắt LED GPIO16

Xem thêm:  Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32

Nhóm TAPIT IoTs