Mức logic 3,3 V và 5 V: khi nào cần chuyển mức và cách nối an toàn với ESP32

Giải thích mức logic 3,3 V và 5 V: ngưỡng mức thấp, mức cao của ESP32, Arduino và các họ IC; khi nào nối thẳng được, khi nào cần mạch chia áp hoặc mạch chuyển mức MOSFET. Kèm chương trình đo kiểm tra.

ESP32 làm việc ở 3,3 V, trong khi rất nhiều module, cảm biến và mạch Arduino cũ làm việc ở 5 V. Nối hai loại này với nhau mà không để ý mức điện áp là nguyên nhân phổ biến làm hỏng chân GPIO hoặc làm tín hiệu lúc được lúc mất. Bài viết giải thích mức logic là gì, ngưỡng của các họ linh kiện thường gặp, khi nào nối thẳng được, khi nào phải chia áp hoặc dùng mạch chuyển mức, và dùng chính ESP32 để đo kiểm tra mạch chia áp trước khi nối.

1. Mức logic là gì?

  • Mạch số chỉ phân biệt hai trạng thái: mức thấp (0) và mức cao (1). Mỗi chân vào có hai ngưỡng điện áp để quyết định.
  • Dưới ngưỡng thấp (ký hiệu VIL): chắc chắn được hiểu là 0.
  • Trên ngưỡng cao (ký hiệu VIH): chắc chắn được hiểu là 1.
  • Ở giữa hai ngưỡng: không xác định. Chân có thể đọc ra 0 hoặc 1 tùy lúc, và tín hiệu trở nên chập chờn.
  • Ngoài ra mỗi chân có một điện áp tối đa chịu được. Vượt quá mức này, chân có thể hỏng vĩnh viễn.

2. Ngưỡng của các họ linh kiện thường gặp

Biểu đồ ngưỡng mức thấp và mức cao của chân vào trên ESP32 nguồn 3,3 V, Arduino Uno và Nano nguồn 5 V, IC họ TTL và 74HCT, IC họ 74HC, kèm đường mức cao 3,3 V do ESP32 phát ra và giới hạn 3,6 V của ESP32
Ngưỡng mức thấp, mức cao của bốn loại chân vào; đường nét đứt là mức cao 3,3 V do ESP32 phát ra.
Chân vào củaNguồnMức thấp khi dướiMức cao khi trênNhận mức cao 3,3 V?
ESP323,3 V0,825 V2,475 VĐược
Arduino Uno, Nano (ATmega328P)5 V1,5 V3,0 VĐược, dư ít
IC họ TTL, 74HCT, 74AHCT5 V0,8 V2,0 VĐược
IC họ 74HC, LED WS28125 V1,5 V3,5 VKhông bảo đảm

Chân của ESP32 chỉ chịu được tối đa khoảng 3,6 V. Mức cao 5 V của thiết bị khác đưa thẳng vào sẽ vượt giới hạn này.

3. Xét từng chiều tín hiệu

Ba cách nối giữa mạch 3,3 V và mạch 5 V: nối thẳng khi ESP32 phát, mạch chia áp hai điện trở 2,2 và 3,3 kilôôm khi thiết bị 5 V phát, mạch MOSFET BSS138 với hai điện trở kéo lên cho tín hiệu hai chiều I2C
Nối thẳng, chia áp, hoặc chuyển mức hai chiều bằng MOSFET tùy theo chiều tín hiệu.

ESP32 phát, thiết bị 5 V nhận

  • ESP32 phát mức cao khoảng 3,3 V. Phần lớn chân vào 5 V coi đó là mức cao, nên thường nối thẳng được: chân RX của module UART, chân điều khiển module relay, chân vào của Arduino.
  • Ngoại lệ là các chân vào cần trên 3,5 V như IC họ 74HC hoặc LED WS2812 cấp nguồn 5 V. Khi đó thêm một IC đệm họ 74HCT hoặc 74AHCT cấp nguồn 5 V: IC này nhận 3,3 V là mức cao và phát ra 5 V.

Thiết bị 5 V phát, ESP32 nhận

  • Không nối thẳng. Dùng mạch chia áp gồm hai điện trở: R1 nối từ tín hiệu 5 V tới chân ESP32, R2 nối từ chân ESP32 xuống GND.
  • Với R1 = 2,2 kΩ và R2 = 3,3 kΩ, điện áp ra là 5 × 3,3 / (2,2 + 3,3) = 3,0 V: trên ngưỡng mức cao 2,475 V và dưới giới hạn 3,6 V.
  • Cặp 1 kΩ và 2 kΩ cho 3,33 V cũng dùng được. Điện trở lớn hơn (10 kΩ và 20 kΩ) tốn ít dòng hơn nhưng làm chậm sườn xung, chỉ hợp với tín hiệu chậm.
  • Mạch chia áp chỉ dùng cho một chiều và cho tín hiệu không quá nhanh như UART hoặc mức tĩnh.

Tín hiệu hai chiều trên cùng một dây

  • I2C và 1-Wire truyền hai chiều trên một dây nên không chia áp được. Mạch chuyển mức thông dụng dùng một MOSFET kênh N (thường là BSS138) và hai điện trở kéo lên, một lên 3,3 V, một lên 5 V.
  • Khi một bên kéo dây xuống thấp, MOSFET dẫn và bên kia cũng xuống thấp. Khi cả hai bên nhả, mỗi bên được kéo lên mức riêng của mình.
  • Module chuyển mức 4 kênh bán sẵn chính là bốn mạch như vậy. Mạch này hợp với I2C và tín hiệu chậm, không hợp với SPI tốc độ cao.

4. Các tình huống hay gặp

Tình huốngCách nối
Module UART 5 V (GPS, Bluetooth đời cũ) với ESP32TX của ESP32 nối thẳng RX của module; TX của module qua mạch chia áp rồi mới vào RX của ESP32
Module I2C có điện trở kéo lên, cấp nguồn 5 VĐiện trở kéo SDA, SCL lên 5 V: không nối thẳng. Cấp nguồn 3,3 V cho module nếu module cho phép, hoặc dùng mạch chuyển mức MOSFET
Module relay 5 VChân IN thường nối thẳng được; xem bài ESP32 điều khiển module relay
Module thẻ nhớ có IC ổn áp và IC đệmNối thẳng: tín hiệu trên module đã ở mức 3,3 V dù cấp nguồn 5 V
Cảm biến có ngõ ra số 5 V (ví dụ module thu hồng ngoại, cảm biến siêu âm đo khoảng cách)Ngõ ra qua mạch chia áp rồi mới vào ESP32
Nối ESP32 với Arduino Uno qua UARTTX của ESP32 nối thẳng RX của Uno; TX của Uno qua mạch chia áp

Cách ít rủi ro nhất là tránh phải chuyển mức: chọn module chạy được ở 3,3 V và cấp nguồn 3,3 V cho module. Khi không chắc mức ngõ ra của một module, đo bằng đồng hồ hoặc bằng chương trình dưới đây trước khi nối.

5. Chuẩn bị

6. Mạch thử

Sơ đồ mạch thử chia áp với ESP32 DevKit V1: điện trở 2,2 kilôôm nối từ chân VIN 5 V tới điểm giữa, điện trở 3,3 kilôôm nối từ điểm giữa xuống GND, điểm giữa nối vào chân D34
Chân VIN (5 V) đóng vai tín hiệu 5 V; điểm giữa của mạch chia áp nối vào D34.

Lắp đủ hai điện trở trước, kiểm tra lại, rồi mới nối điểm giữa vào D34. Không nối thẳng VIN vào bất kỳ chân GPIO nào.

7. Chương trình đo mức logic

Chương trình đo điện áp tại D34 bằng ADC và so với hai ngưỡng của ESP32, giống một đồng hồ đo đơn giản cho biết điện áp đó sẽ được hiểu là mức gì.

/*
  PYWORLD.VN - Mức logic 3,3 V và 5 V: dùng ESP32 đo điện áp sau mạch chia áp trước khi nối vào chân số
  Nối điểm giữa của mạch chia áp vào D34; mỗi giây chương trình in điện áp và cho biết ESP32 sẽ hiểu là mức gì
  Ngưỡng của ESP32 ở nguồn 3,3 V: dưới 0,825 V là mức thấp, trên 2,475 V là mức cao
*/

#define CHAN_DO 34

const int NGUON_MV = 3300;
const int NGUONG_THAP_MV = NGUON_MV / 4;        // 0,25 x nguồn: từ đây trở xuống chắc chắn là mức thấp
const int NGUONG_CAO_MV = NGUON_MV * 3 / 4;     // 0,75 x nguồn: từ đây trở lên chắc chắn là mức cao
const int GIOI_HAN_DO_MV = 3100;                // ADC của ESP32 đo không còn chính xác ở sát mức nguồn
const int SO_MAU = 32;

int doDienApMv() {
  uint32_t tong = 0;
  for (int i = 0; i < SO_MAU; i++) {
    tong += analogReadMilliVolts(CHAN_DO);
    delayMicroseconds(200);
  }
  return tong / SO_MAU;
}

void setup() {
  Serial.begin(115200);
  analogSetPinAttenuation(CHAN_DO, ADC_11db);
  Serial.printf("\nNguong muc thap %d mV, nguong muc cao %d mV\n", NGUONG_THAP_MV, NGUONG_CAO_MV);
}

void loop() {
  int dienAp = doDienApMv();

  if (dienAp >= GIOI_HAN_DO_MV) {
    Serial.printf("Dien ap tu %d mV tro len: sat hoac vuot muc nguon 3,3 V, kiem tra lai mach chia ap\n", GIOI_HAN_DO_MV);
  } else if (dienAp >= NGUONG_CAO_MV) {
    Serial.printf("Dien ap %d mV: muc CAO, cao hon nguong %d mV\n", dienAp, dienAp - NGUONG_CAO_MV);
  } else if (dienAp <= NGUONG_THAP_MV) {
    Serial.printf("Dien ap %d mV: muc THAP\n", dienAp);
  } else {
    Serial.printf("Dien ap %d mV: vung khong xac dinh, khong dung lam tin hieu so\n", dienAp);
  }
  delay(1000);
}

ADC của ESP32 đo kém chính xác ở sát mức nguồn, vì vậy chương trình chỉ báo "sát hoặc vượt mức nguồn" khi kết quả từ 3100 mV trở lên. Nền tảng về ADC có trong bài đọc ADC trên ESP32.

8. Kết quả mong đợi

Hình minh họa Serial Monitor của chương trình đo mức logic trên ESP32: điện áp khoảng 2995 mV được báo là mức cao, 1648 mV là vùng không xác định và 4 mV là mức thấp
Kết quả mong đợi trên Serial Monitor (hình minh họa, điện áp là số ví dụ).
  1. Mở Tools > Serial Monitor ở 115200 baud. Với R1 = 2,2 kΩ và R2 = 3,3 kΩ, điện áp ở quanh 3000 mV và được báo là mức cao.
  2. Thử hai điện trở bằng nhau nối từ 3V3 xuống GND: điện áp khoảng 1650 mV, rơi vào vùng không xác định.
  3. Nối D34 xuống GND: báo mức thấp.

9. Xử lý lỗi thường gặp

Hiện tượngNguyên nhân thường gặpCách xử lý
Chương trình báo sát hoặc vượt mức nguồnThiếu điện trở R2, hoặc lắp nhầm vị trí hai điện trởRút dây khỏi D34 ngay; kiểm tra R2 đã nối xuống GND chưa
Điện áp thấp hơn tính toán nhiềuDùng điện trở quá lớn, hoặc "5 V" thực tế thấp hơn 5 VĐo chân VIN (khoảng 4,6 đến 5 V khi cấp qua USB); dùng điện trở cỡ kΩ
Thiết bị 5 V không nhận lệnh từ ESP32Chân vào của thiết bị cần mức cao trên 3,5 VThêm IC đệm họ 74HCT hoặc 74AHCT cấp nguồn 5 V
UART qua mạch chia áp bị lỗi ở tốc độ caoĐiện trở chia áp quá lớn làm sườn xung chậmGiảm xuống cỡ 1 đến 3,3 kΩ, hoặc giảm tốc độ baud
Chân GPIO của ESP32 không còn hoạt độngĐã nhận 5 V trực tiếpChân đó có thể đã hỏng; chuyển sang chân khác và thêm mạch bảo vệ

10. Xem thêm


Tin tức liên quan

Bluetooth Low Energy (BLE) là gì: quảng bá, GATT, dịch vụ, đặc tính và ESP32
Bluetooth Low Energy (BLE) là gì: quảng bá, GATT, dịch vụ, đặc tính và ESP32

Giải thích Bluetooth Low Energy: quảng bá và kết nối, cấu trúc GATT gồm dịch vụ, đặc tính, mô tả, UUID. Hướng dẫn cho ESP32 làm thiết bị BLE có đặc tính đọc, ghi, thông báo và thử bằng điện thoại.

Điều khiển hồng ngoại hoạt động thế nào: sóng mang 38 kHz, giao thức NEC và ESP32
Điều khiển hồng ngoại hoạt động thế nào: sóng mang 38 kHz, giao thức NEC và ESP32

Giải thích điều khiển hồng ngoại: sóng mang 38 kHz, mắt thu và giao thức NEC với khung 32 bit, mã lặp. Hướng dẫn tự giải mã phím điều khiển và tự phát lệnh bằng ESP32, không dùng thư viện ngoài.

RF 433 MHz là gì: điều chế ASK/OOK và tự viết giao thức phát, thu bằng ESP32
RF 433 MHz là gì: điều chế ASK/OOK và tự viết giao thức phát, thu bằng ESP32

Giải thích sóng RF 433 MHz và điều chế ASK/OOK, cách mã hóa bit bằng độ rộng xung và khung tin 24 bit. Hướng dẫn tự viết chương trình phát và thu trên hai mạch ESP32, không dùng thư viện ngoài.

Vòng dòng 4-20 mA là gì và cách đọc cảm biến 4-20 mA bằng ESP32
Vòng dòng 4-20 mA là gì và cách đọc cảm biến 4-20 mA bằng ESP32

Giải thích vòng dòng 4-20 mA: vì sao dùng dòng điện, vì sao bắt đầu từ 4 mA, cách đổi ra giá trị đo và ngưỡng báo lỗi. Hướng dẫn đọc bằng ESP32 qua điện trở shunt 120 Ω, với ADC có sẵn và với ADS1115.

CAN bus (phần 2): bộ lọc nhận, tốc độ bit và xử lý lỗi bus-off trên ESP32
CAN bus (phần 2): bộ lọc nhận, tốc độ bit và xử lý lỗi bus-off trên ESP32

Phần 2 về CAN bus với ESP32: đặt bộ lọc nhận theo mã lọc và mặt nạ, chọn tốc độ bit theo chiều dài dây, hiểu ba trạng thái lỗi của nút và viết chương trình theo dõi bộ đếm lỗi, tự hồi phục sau bus-off.

CAN bus (phần 1): tín hiệu, khung tin, phân xử ưu tiên và gửi nhận bằng ESP32
CAN bus (phần 1): tín hiệu, khung tin, phân xử ưu tiên và gửi nhận bằng ESP32

Giải thích CAN bus: hai dây CAN_H, CAN_L, mức trội và mức lặn, khung tin có ID 11 bit, phân xử ưu tiên, CRC và ACK. Kèm hai chương trình ESP32 dùng bộ điều khiển TWAI: tự kiểm tra và hai nút gửi nhận.

Modbus TCP/IP (phần 2): ESP32 làm máy khách và cổng chuyển đổi Modbus TCP sang RTU
Modbus TCP/IP (phần 2): ESP32 làm máy khách và cổng chuyển đổi Modbus TCP sang RTU

Hướng dẫn dùng ESP32 làm máy khách Modbus TCP đọc thanh ghi của một thiết bị trong mạng, và làm cổng chuyển đổi Modbus TCP sang Modbus RTU qua RS-485: cách đổi khung, mã thiết bị, thời gian chờ, mã lỗi 0x0B.

Modbus TCP/IP (phần 1): phần đầu MBAP và ESP32 làm máy chủ qua Wi-Fi
Modbus TCP/IP (phần 1): phần đầu MBAP và ESP32 làm máy chủ qua Wi-Fi

Giải thích Modbus TCP/IP: phần đầu MBAP, cổng 502, điểm khác với Modbus RTU. Kèm chương trình ESP32 làm máy chủ Modbus TCP qua Wi-Fi với 10 thanh ghi giữ và 8 cuộn, tự phân tích khung, không dùng thư viện.


Bình luận
Đã thêm vào giỏ hàng