Trung bình8 phút đọc28/10/2026

Hiệu chuẩn cảm biến analog: nội suy 2 điểm và lưu hệ số vào EEPROM

Đọc xong bạn biết cách hiệu chuẩn cảm biến analog bằng 2 điểm chuẩn, tính hệ số gain-offset và lưu bền trong EEPROM/Flash để bù sai số sản xuất.

Hiệu chuẩn cảm biến analog: nội suy 2 điểm và lưu hệ số vào EEPROM
Mục lục bài viết9 ▼
  1. Vì sao cảm biến analog cần hiệu chuẩn tại nhà máy
  2. Nguyên lý nội suy 2 điểm (gain-offset)
  3. Quy trình hiệu chuẩn tại xưởng
  4. Lưu hệ số vào EEPROM/Flash
  5. Áp dụng hệ số khi vận hành thực tế
  6. Lỗi thường gặp khi làm thật
  7. Kiểm tra sau hiệu chuẩn (verification)
  8. Checklist khi thiết kế
  9. Đọc tiếp

Hai board cùng chạy một model cảm biến, cùng firmware, nhưng đọc lệch nhau vài phần trăm ngay khi mới xuất xưởng — đây là tình huống quen thuộc với bất kỳ ai từng làm sản phẩm IoT/đo lường ở quy mô trên vài chục board. Bài này dành cho kỹ sư phần cứng/firmware cần xây quy trình hiệu chuẩn 2 điểm tại xưởng, tính hệ số gain-offset, và lưu bền hệ số đó để mỗi board bù đúng sai số riêng của nó.

#Vì sao cảm biến analog cần hiệu chuẩn tại nhà máy

Mọi cảm biến analog đều có sai số sản xuất: dung sai linh kiện (tolerance) trên chính cảm biến, offset nội tại của ADC, và drift theo lô sản xuất. Hai board dùng cùng model cảm biến, cùng mạch, cùng firmware vẫn có thể đọc lệch nhau đáng kể nếu không hiệu chuẩn — vì sai số này mang tính cá thể từng linh kiện, không thể sửa bằng cách thay đổi thiết kế mạch hay code chung.

Hiệu chuẩn 2 điểm (two-point calibration) giải quyết được cả hai loại lỗi phổ biến nhất trong mối quan hệ tuyến tính gần đúng:

  • Lỗi gain (hệ số nhân sai) — làm đường cong đo bị nghiêng so với đường lý tưởng.
  • Lỗi offset (lệch gốc) — làm đường cong đo bị dịch song song so với đường lý tưởng.

Với một cảm biến tuyến tính trong dải đo quan tâm, chỉ cần 2 điểm chuẩn đã đủ xác định một đường thẳng duy nhất đi qua, từ đó suy ra hệ số bù cho toàn dải.

Việc áp dụng tiêu chuẩn hiệu chuẩn công nghiệp nào (tiêu chuẩn ISO/IEC về năng lực phòng thử nghiệm và hiệu chuẩn, hoặc quy trình nội bộ theo yêu cầu khách hàng) phụ thuộc vào ngành và yêu cầu truy xuất nguồn gốc của sản phẩm, cần xác định theo từng dòng sản phẩm cụ thể.

#Nguyên lý nội suy 2 điểm (gain-offset)

Công thức cơ bản:

giá_trị_thực = gain × giá_trị_đo + offset Với 2 cặp điểm chuẩn đã biết trước — (đo₁, thực₁) và (đo₂, thực₂) — giải hệ 2 phương trình 2 ẩn:

text
gain   = (thực₂ - thực₁) / (đo₂ - đo₁)
offset = thực₁ - gain × đo₁

Ví dụ số: hiệu chuẩn cảm biến nhiệt độ bằng 2 mốc chuẩn 0 °C và 100 °C (ví dụ nước đá tan và nước sôi ở áp suất chuẩn). Giả sử ADC đọc được giá trị số tương ứng:

  • Tại 0 °C thực tế, ADC đọc 102 (lý tưởng là 100)
  • Tại 100 °C thực tế, ADC đọc 1023 (lý tưởng là 1000)
text
gain   = (100 - 0) / (1023 - 102) = 100 / 921 ≈ 0.1086 °C/count
offset = 0 - 0.1086 × 102 ≈ -11.08 °C

Khi đó mọi lần đọc sau chỉ cần áp nhiệt_độ = 0.1086 × ADC_count - 11.08 để ra giá trị đã bù.

Chọn 2 điểm chuẩn cách xa nhau trong dải đo (thường là gần đầu và gần cuối thang đo) giúp giảm sai số khi nội suy ra các điểm trung gian, vì sai số đo tại mỗi mốc chuẩn sẽ bị khuếch đại theo tỷ lệ nghịch với khoảng cách giữa 2 điểm. Giới hạn quan trọng: công thức này chỉ chính xác trong dải đã hiệu chuẩn — ngoại suy ra ngoài dải (extrapolation) có thể sai lớn hơn nhiều so với sai số nội suy.

#Quy trình hiệu chuẩn tại xưởng

Quy trình điển hình gồm 3 bước: chuẩn bị mốc chuẩn, đo và tính hệ số, ghi log.

BướcNội dungGhi chú
1Chuẩn bị 2 mốc chuẩn có độ chính xác đã biết (nguồn điện áp chuẩn, cân chuẩn, hoặc thiết bị đo đối chứng đã được calib)Độ chính xác mốc chuẩn phải tốt hơn yêu cầu độ chính xác sản phẩm ít nhất một cấp
2Đo giá trị ADC/điện áp tại mỗi mốc trên board cần hiệu chuẩnLặp lại vài lần, lấy trung bình để giảm nhiễu đo
3Tính gain/offset theo công thức, ghi vào log theo serial numberDùng để truy xuất lại nếu có khiếu nại sau này
4Ổn định nhiệt trước khi đoThời gian ổn định cần tra theo datasheet của cảm biến cụ thể, thường tính bằng phút sau khi cấp nguồn hoặc thay đổi môi trường

#Lưu hệ số vào EEPROM/Flash

Cấu trúc dữ liệu lưu tối thiểu gồm gain, offset, và một trường kiểm tra tính hợp lệ (checksum/CRC) để phát hiện dữ liệu bị hỏng hoặc chưa từng được ghi.

C
// Minh hoạ, chưa biên dịch — cấu trúc lưu hệ số hiệu chuẩn
typedef struct {
    float gain;      // hệ số nhân
    float offset;    // hệ số lệch gốc
    uint16_t crc16;   // CRC kiểm tra toàn vẹn dữ liệu
} calib_data_t;

// Ghi vào EEPROM nội bộ (ví dụ, API tuỳ MCU thực tế)
void calib_save(const calib_data_t *data) {
    calib_data_t tmp = *data;
    tmp.crc16 = crc16_calc((uint8_t*)&tmp, sizeof(tmp) - sizeof(tmp.crc16));
    eeprom_write(CALIB_ADDR, &tmp, sizeof(tmp)); // API minh hoạ
}

// Đọc và kiểm tra CRC trước khi dùng
bool calib_load(calib_data_t *out) {
    eeprom_read(CALIB_ADDR, out, sizeof(*out)); // API minh hoạ
    uint16_t calc = crc16_calc((uint8_t*)out, sizeof(*out) - sizeof(out->crc16));
    return calc == out->crc16;
}

Về vùng nhớ: có thể dùng EEPROM nội bộ MCU (nếu có) hoặc EEPROM/Flash rời gắn ngoài. Lựa chọn phụ thuộc vào dung lượng cần, và quan trọng là số lần ghi tối đa (endurance cycles) — EEPROM chỉ chịu được một số lần ghi hữu hạn trước khi ô nhớ bắt đầu lỗi. Hiệu chuẩn tại xưởng thường chỉ ghi 1 lần/board nên không phải vấn đề, nhưng nếu thiết kế cho phép hiệu chuẩn lại nhiều lần trong đời sản phẩm, cần tra đúng số chu kỳ ghi theo datasheet linh kiện cụ thể, vì giá trị này khác nhau giữa các dòng EEPROM/Flash.

#Áp dụng hệ số khi vận hành thực tế

Lúc khởi động, firmware đọc gain/offset từ EEPROM vào RAM một lần, sau đó mỗi lần đọc ADC chỉ cần áp công thức nội suy trước khi xuất giá trị ra lớp ứng dụng.

C
// Minh hoạ, chưa biên dịch
calib_data_t g_calib;

void setup_calib(void) {
    if (!calib_load(&g_calib)) {
        // CRC sai hoặc chưa từng hiệu chuẩn -> dùng giá trị mặc định an toàn
        g_calib.gain = 1.0f;
        g_calib.offset = 0.0f;
        log_warning("Calib EEPROM invalid, using default gain=1 offset=0");
    }
}

float read_sensor_calibrated(void) {
    uint16_t raw = adc_read();
    return g_calib.gain * raw + g_calib.offset;
}

Khi EEPROM lỗi hoặc board chưa từng được hiệu chuẩn, nguyên tắc an toàn là dùng gain = 1, offset = 0 (tức không bù gì cả) kèm cảnh báo rõ ràng, thay vì dùng hệ số rác có thể đẩy giá trị đọc ra sai lệch nguy hiểm.

Về định dạng số: MCU có FPU (floating-point unit) dùng float trực tiếp đơn giản hơn; MCU không có FPU (phổ biến ở các dòng 8-bit/16-bit giá rẻ) nên dùng fixed-point để tránh chi phí tính toán float bằng phần mềm (software floating-point), vốn chậm hơn đáng kể.

#Lỗi thường gặp khi làm thật

  • Chọn 2 điểm chuẩn quá gần nhau: mẫu số trong công thức tính gain (đo₂ - đo₁) nhỏ, khiến gain nhạy với sai số đo tại mỗi mốc, dẫn đến sai số bị khuếch đại mạnh ở hai đầu thang đo khi nội suy ra ngoài vùng 2 điểm đã chọn.
  • Không kiểm tra CRC/checksum khi đọc EEPROM: nếu EEPROM chưa từng được ghi (giá trị mặc định là 0xFF hoặc rác) hoặc bị lỗi đọc, firmware sẽ dùng gain/offset ngẫu nhiên mà không biết, dẫn đến giá trị xuất ra sai hoàn toàn nhưng không có cảnh báo.
  • Quên bù trôi nhiệt độ giữa thời điểm hiệu chuẩn (thường ở nhiệt độ phòng ổn định) và lúc vận hành thực tế (có thể nóng/lạnh hơn nhiều) — hệ số gain/offset tính tại một nhiệt độ không còn đúng khi nhiệt độ môi trường thay đổi đáng kể, gây sai số hệ thống kéo dài suốt vòng đời sản phẩm.

#Kiểm tra sau hiệu chuẩn (verification)

Sau khi tính và lưu hệ số, nên đo lại tại một điểm thứ 3 — không dùng để tính hệ số — để xác nhận độ chính xác ngoài 2 điểm chuẩn ban đầu. Sai số còn lại tại điểm này (residual error) là chỉ số thực tế phản ánh chất lượng hiệu chuẩn, nên so sánh với yêu cầu thiết kế để quyết định board đạt/không đạt.

Log hiệu chuẩn nên lưu theo serial number để truy xuất sau này khi có khiếu nại hoặc cần kiểm tra lại:

SerialĐiểm chuẩn 1Điểm chuẩn 2GainOffsetSai số điểm 3Ngày giờ
SN001230 °C → ADC 102100 °C → ADC 10230.1086-11.080.3 °C (ví dụ minh hoạ)2026-xx-xx

#Checklist khi thiết kế

  • Đã xác định dải đo và chọn 2 điểm chuẩn cách xa nhau, phù hợp với toàn dải cần đo chưa?
  • Đã có cơ chế CRC/checksum bảo vệ dữ liệu hiệu chuẩn trong EEPROM chưa?
  • Đã xử lý trường hợp chưa hiệu chuẩn hoặc EEPROM lỗi bằng giá trị mặc định an toàn (gain=1, offset=0) chưa?
  • Đã kiểm tra lại bằng điểm thứ 3 độc lập để xác nhận sai số còn lại chưa?
  • Đã lưu log hiệu chuẩn theo serial number để truy xuất sau này chưa?
  • Đã xác định đúng số lần ghi tối đa của EEPROM/Flash được chọn, phù hợp với số lần hiệu chuẩn dự kiến trong đời sản phẩm chưa?
  • Đã cân nhắc bù trôi nhiệt độ nếu môi trường vận hành khác đáng kể so với lúc hiệu chuẩn chưa?

#Đọc tiếp

Bài tiếp theo trong series: "Chọn và đọc datasheet cảm biến analog: offset, drift, sai số nhiệt" — đi sâu vào cách đọc các thông số sai số gốc trên datasheet để biết trước mức độ cần hiệu chuẩn và bù trôi nhiệt cho từng loại cảm biến.