Mạch RC: tụ nạp xả, hằng số thời gian và đo điện dung bằng ESP32
Tụ nạp và xả qua điện trở, hằng số thời gian τ = R × C, các mốc 63,2 % và 5τ, ứng dụng lọc thông thấp, lọc PWM, chống dội nút nhấn, thí nghiệm đo τ và điện dung tụ bằng ESP32.
Một điện trở và một tụ điện ghép với nhau tạo thành mạch RC, mạch đơn giản nhưng có mặt ở rất nhiều nơi: làm trễ, lọc nhiễu, biến xung PWM thành điện áp, chống dội nút nhấn, định thời cho IC 555. Tất cả đều dựa trên một hiện tượng: tụ không nạp đầy hay xả hết ngay lập tức mà theo một đường cong, nhanh hay chậm tùy hằng số thời gian τ = R × C. Bài viết giải thích quá trình nạp xả, ý nghĩa của τ, các ứng dụng thường gặp, rồi làm thí nghiệm dùng ESP32 đo đường nạp xả của tụ, tính τ và suy ra điện dung của tụ.
1. Tụ nạp và xả qua điện trở

- Nạp: nối tụ đã xả hết qua điện trở R vào nguồn U. Lúc đầu tụ chưa có điện áp nên toàn bộ U đặt lên điện trở, dòng nạp lớn nhất bằng U / R. Tụ nạp dần, điện áp trên tụ tăng, điện áp còn lại trên R giảm nên dòng nạp giảm dần. Điện áp tụ: u = U × (1 − e−t/τ).
- Xả: nối tụ đầy qua R xuống đất. Dòng xả lớn nhất lúc đầu rồi giảm dần; điện áp tụ: u = U × e−t/τ.
- Hằng số thời gian τ = R × C (ôm nhân fara ra giây). Sau 1τ, tụ nạp được 63,2 % (hoặc xả còn 36,8 %); sau 3τ được 95 %; sau khoảng 5τ coi như nạp đầy hay xả hết.
| R | C | τ = R × C | Hay gặp ở đâu |
|---|---|---|---|
| 10 kΩ | 100 µF | 1 s | Mạch trễ, thí nghiệm trong bài |
| 10 kΩ | 1 µF | 10 ms | Lọc PWM, mạch reset |
| 10 kΩ | 100 nF | 1 ms | Chống dội nút nhấn |
| 1 kΩ | 100 nF | 0,1 ms | Lọc nhiễu tần số cao |
Một cách hiểu trực quan: tụ giống một bình nước được bơm đầy qua một ống hẹp. Lúc bình còn vơi, nước chảy vào mạnh; bình càng đầy, chênh lệch càng ít, nước chảy càng chậm. Ống càng hẹp (R lớn) hay bình càng to (C lớn) thì càng lâu đầy.
2. Các ứng dụng của mạch RC

- Lọc thông thấp: R nối tiếp, C xuống đất. Tín hiệu biến đổi chậm đi qua gần như nguyên vẹn, tín hiệu biến đổi nhanh (nhiễu) bị tụ "nuốt" bớt. Tần số cắt fc = 1 / (2π × R × C); ở tần số này biên độ còn khoảng 70 %. Với 10 kΩ và 1 µF, fc ≈ 15,9 Hz. Đặt một tụ nhỏ trước chân ADC để lọc nhiễu là ứng dụng hay gặp.
- Biến PWM thành điện áp: chân PWM (bật tắt nhanh) qua bộ lọc RC cho ra điện áp gần phẳng bằng độ rộng xung nhân điện áp mức cao: PWM 65 % ở 3,3 V cho khoảng 2,1 V. τ phải lớn hơn chu kỳ PWM nhiều lần để gợn nhỏ; nhưng τ lớn thì điện áp thay đổi chậm.
- Chống dội nút nhấn: tiếp điểm nút nhấn nảy nhiều lần trong vài ms; tụ 100 nF cùng điện trở kéo lên 10 kΩ (τ = 1 ms) làm mượt các xung nảy đó. Trên vi điều khiển cũng có thể chống dội bằng phần mềm.
- Định thời, làm trễ: IC 555, mạch reset khi cấp nguồn, mạch tạo trễ relay đều dựa vào thời gian tụ nạp tới một ngưỡng (bài 25).
3. Thí nghiệm: đo đường nạp xả và tính điện dung bằng ESP32
Chân GPIO26 lần lượt lên 3,3 V (nạp) rồi xuống 0 V (xả) qua điện trở 10 kΩ; chân ADC GPIO34 đo điện áp trên tụ. Chương trình đo thời gian để điện áp đạt 63,2 % (khi nạp) và còn 36,8 % (khi xả), đó chính là τ; chia cho R ra điện dung của tụ.
Chuẩn bị
- ESP32 DevKit V1, breadboard, dây cắm.
- Một điện trở 10 kΩ, một tụ hóa 100 µF (điện áp 10 V trở lên). Có thể thử thêm tụ 47 µF, 220 µF.

Cắm đúng cực tính của tụ hóa: chân dài (+) vào nút đo, chân có dải dấu trừ vào GND. Dòng nạp lớn nhất chỉ 3,3 V / 10 kΩ = 0,33 mA nên an toàn cho chân GPIO.
Chương trình
/*
PYWORLD.VN - Đo đường nạp xả của tụ qua điện trở bằng ESP32, tính hằng số thời gian τ = R × C và suy ra điện dung
Nối: GPIO26 -> R 10 kΩ -> nút đo (GPIO34) -> chân + tụ hóa 100 µF; chân − của tụ -> GND
Mở Serial Monitor 115200, gõ "s" để đo lại
*/
#define CHAN_RA 26
#define CHAN_DO 34
const float R_NAP = 10000.0; // Ôm, điện trở nạp xả (đo lại bằng đồng hồ vạn năng cho chính xác)
const float VCC_MV = 3300.0; // Điện áp chân GPIO ở mức cao; đo chân 3V3 rồi sửa cho đúng
const uint32_t THOI_GIAN_DO_MS = 6000; // Đo trong 6 s, khoảng 6τ với 10 kΩ và 100 µF
const uint32_t KHOANG_IN_MS = 1000; // In một dòng mỗi giây
// Xả hết tụ trước khi đo nạp: đưa GPIO26 xuống thấp và chờ điện áp gần 0
void xaHetTu() {
digitalWrite(CHAN_RA, LOW);
while (analogReadMilliVolts(CHAN_DO) > 15) {
delay(20);
}
delay(300);
}
// Đổi mức GPIO26 rồi theo dõi điện áp tụ; trả về thời gian (giây) để đạt mốc 63,2 % (nạp) hoặc 36,8 % (xả)
float theoDoi(bool nap) {
float nguong = nap ? VCC_MV * 0.632 : VCC_MV * 0.368;
uint32_t tMoc = 0;
uint32_t lanIn = 0;
uint32_t t0 = micros();
digitalWrite(CHAN_RA, nap ? HIGH : LOW);
while (true) {
uint32_t t = micros() - t0;
uint32_t u = analogReadMilliVolts(CHAN_DO);
bool quaMoc = nap ? (u >= nguong) : (u <= nguong);
if (tMoc == 0 && quaMoc) {
tMoc = t;
}
if (t >= lanIn * KHOANG_IN_MS * 1000UL) {
Serial.printf("%5.1f s %4u mV\n", t / 1e6, (unsigned)u);
lanIn++;
}
if (t > THOI_GIAN_DO_MS * 1000UL) {
break;
}
}
return tMoc / 1e6;
}
void doMotLan() {
Serial.println();
Serial.println("Xa het tu...");
xaHetTu();
Serial.println("NAP tu qua R:");
float tauNap = theoDoi(true);
Serial.printf("Moc 63,2%% sau %.3f s -> tau = %.3f s, C = tau / R = %.1f uF\n", tauNap, tauNap, tauNap / R_NAP * 1e6);
Serial.println("XA tu qua R:");
float tauXa = theoDoi(false);
Serial.printf("Moc 36,8%% sau %.3f s -> tau = %.3f s, C = tau / R = %.1f uF\n", tauXa, tauXa, tauXa / R_NAP * 1e6);
}
void setup() {
Serial.begin(115200);
delay(500);
analogReadResolution(12);
pinMode(CHAN_RA, OUTPUT);
doMotLan();
}
void loop() {
if (Serial.available() && Serial.read() == 's') {
doMotLan();
}
}
xaHetTu()đưa GPIO26 xuống thấp và chờ tụ xả gần 0 V, để lần nạp bắt đầu từ 0.theoDoi()đổi mức chân rồi đọc ADC liên tục; ghi lại thời điểm điện áp vượt qua mốc 63,2 % (nạp) hoặc xuống dưới 36,8 % (xả) của 3,3 V, và cứ mỗi giây in một dòng để thấy đường cong.- Thời gian ghi được chính là τ; điện dung C = τ / R. Với R = 10 kΩ, τ = 1 s ứng với 100 µF.
Kết quả mong đợi

- Hai lần đo cho τ gần bằng nhau, khoảng 0,93 s, ứng với tụ khoảng 93 µF. Tụ hóa có sai số ±20 % nên tụ ghi 100 µF đo ra 80–120 µF đều bình thường.
- Khi nạp, các số đo từ 3 s trở đi đứng ở khoảng 3150 mV dù tụ đã gần 3,3 V: ADC của ESP32 không đọc được điện áp sát 3,3 V. Mốc 63,2 % (khoảng 2,09 V) nằm trong vùng đo tốt nên không bị ảnh hưởng.
- Thay tụ 220 µF, τ tăng lên khoảng 2,2 s; khi đó nên tăng
THOI_GIAN_DO_MSlên khoảng 12 000 để kịp nạp đầy trước khi xả.
4. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Kẹt ở "Xa het tu..." | GPIO34 đang hở hoặc nối nhầm vào 3V3, điện áp không về gần 0 | Kiểm tra dây nút đo; tụ có xả qua R về GPIO26 không |
| τ gần bằng 0 | Tụ không được nối, cắm sai hàng breadboard, hoặc tụ hỏng | Kiểm tra tụ; đo điện dung bằng đồng hồ nếu có thang tụ |
| Điện áp nhảy lung tung | Dây lỏng, chân tụ to không chặt vào breadboard | Cắm lại hoặc nối bằng dây cắm |
| Tụ nóng, phồng | Cắm ngược cực tính | Rút điện ngay, thay tụ khác và cắm đúng chiều |
5. Tự kiểm tra
- R = 47 kΩ, C = 10 µF thì τ bằng bao nhiêu và sau bao lâu tụ coi như nạp đầy? (Đáp án: 0,47 s; khoảng 5τ ≈ 2,35 s.)
- Bộ lọc RC 1 kΩ và 100 nF có tần số cắt bao nhiêu? (Đáp án: 1 / (2π × 1000 × 10⁻⁷) ≈ 1,6 kHz.)
- Muốn chống dội nút nhấn với τ khoảng 5 ms và điện trở kéo lên 10 kΩ, chọn tụ nào? (Đáp án: C = 5 ms / 10 kΩ = 0,5 µF, chọn 470 nF.)
6. Xem thêm
- PWM trên ESP32: tín hiệu cần lọc RC để thành điện áp.
- Đọc nút nhấn và chống dội trên ESP32.
- Mạch tạo trễ NE555 có relay: thời gian trễ do mạch RC quyết định.
- Bài tiếp theo của loạt điện tử căn bản: cuộn cảm và biến áp.
Xem thêm