Một chức năng rất quan trọng tiếp theo cần tìm hiểu với bất kì dòng vi điều khiển nào là cách đọc giá trị analog. Với ESP32 đọc giá trị Analog rất hữu ích để đọc các giá trị thay đổi như biến trở hoặc các loại cảm biến. Với việc dùng Arduino IDE thì chuyện này trở nên rất dễ dàng.

Analog Inputs (ADC)

ADC tức là Analog-to-Digital Converter (tức là bộ chuyển đổi tín hiệu Analog (tương tự) ra tín hiệu Digital (số)). Và tín hiệu tương tự ở đây là tín hiệu điện, là sự thay đổi theo thời gian của điện thế (Volt) hoặc cường độ (Ampe) của dòng điện.

Để dễ hình dung xem nó hoạt động như thế nào mình sẽ sử dụng hình bên trên. Bạn thấy có một trục là trục điện áp (nằm ngang) một trục là trục tín hiệu số (thẳng đứng). Nhìn vào trục thẳng đứng thấy là các số nhị phân là các số 3 bít tức là có 8 giá trị từ 000 tới 111. Mức điện áp được chia đều ra làm 8 phần. Tức là mỗi phần có độ rộng là:

(1.0 – 0.0)/8 = 0.125 V.

Vậy 0.125V có giá trị 3 bit biểu diễn là 000, 0.25V có giá trị 3 bit là 001. Đây cũng chính là độ phân giải của bộ ADC trong trường hợp này sẽ là 3 bit.

  • Đọc giá trị Analog với ESP32 có nghĩa là bạn có thể đo các mức điện áp khác nhau giữa 0 V và 3,3 V.
  • Điện áp đo được sau đó được gán cho giá trị từ 0 đến 4095(12 bit), trong đó 0 V tương ứng với 0 và 3,3 V tương ứng với 4095.
  • Bất kỳ điện áp nào từ 0 V đến 3,3 V sẽ nhận giá trị tương ứng độ chia ở giữa.

Mặc dù tương ứng với giải giá trị trên chúng ta sẽ nghĩ ADC là một giá trị tuyến tính biến đổi theo đường thẳng nhưng điều đó lại không xảy ra và ADC là phi tuyến.

Nếu như bạn có giá trị 3.3 V hoặc 3.2 V thì giá trị analog thu được đều là 4095 hoặc với 0V và 0.1V thì giá trị analog là 0. Và bộ ADC trên các vi điều khiển tất nhiên cũng có sai số.

Hàm analogRead()

Với Arduino IDE mọi thứ trở nên rất đơn giản. Sử dụng hàm analogRead() trả về cho bạn giá trị Analog và bạn chỉ cần truyền vào chân GPIO bạn muốn đọc giá trị:

analogRead(GPIO);

analogRead() luôn trả về 1 số nguyên nằm trong khoảng từ 0 đến 4095 tương ứng với thang điện áp từ 0 đến 3.3V. Bạn có thể điều chỉnh thang điện áp này bằng hàm analogReference(). Hàm analogRead() cần 100 µs để thực hiện.

Lưu ý: ESP32 hỗ trợ các phép đo ở 18 kênh khác nhau. Trong board DEVKIT V1 (phiên bản có 30 GPIO) thì chỉ có 15. Mặc dù đã viết phần tổng quan nhưng mình vẫn sẽ nhắc lại “Không thể sử dụng chân ADC2 khi sử dụng Wi-Fi”

Vì vậy, nếu bạn đang sử dụng Wi-Fi và gặp sự cố khi nhận giá trị từ ADC2 GPIO, hãy tránh những sai lầm làm mất nhiều thời gian của các bạn.

Một số Function có thể sử dụng:

  • analogReadResolution(resolution): thiết lập các bit mẫu và độ phân giải Mặc định là độ phân giải 12-bit. Ví dụ: resolution = 9 thì độ phân giải là 9 bit (0 – 511).
  • analogSetWidth(): thiết lập các bit mẫu và độ phân giải.
  • analogSetCycles(): đặt số chu kỳ cho mỗi mẫu. Mặc định là 8 (1 đến 255)
  • adcAttachPin(): Gán chân ADC (xóa bất kì chế độ Analog nào khác được bật). Trả về kết quả True False.

Đọc giá trị biến trở

Để dễ hình dung ra chức năng ADC, chúng ta sẽ đọc giá trị của biến trở được nối vào chân GPIO 34 của ESP.

const int potPin = 34;
      // Khởi tạo biến để lưu trữ giá trị ADC(giá trị biến trở)int potValue = 0;
      void setup() {
        Serial.begin(115200);
        delay(1000);
      }
      void loop() {
        // Đọc giá trị ADC(Giá trị biến trở)
        potValue = analogRead(potPin);
        Serial.println(potValue);
        delay(500);
      }

Hàm analogRead() sẽ trả về giá trị từ 0 đến 4095 sau đó ta sẽ in lên Serial Monitor bằng lệnh Serial.Println(), potValue chính là giá trị mà analogRead trả về. Nạp code và mở Serial Monitor lên rồi xoay biến trở ta sẽ thấy giá trị analog.

Trao đổi học tập

Comments