Thực hành hiệu chuẩn thước điện trở bằng căn mẫu với ADS1115, ESP32: đo tỉ lệ, độ tuyến tính, độ trễ

Hiệu chuẩn thước điện trở 50 mm bằng chồng căn mẫu: ADS1115 đo tỉ lệ, ESP32 ghi điểm đi lên và đi xuống, khớp đa thức, tính sai số tuyến tính, độ trễ và độ không đảm bảo.

Phần thực hành của nhóm bài chuyển vị: hiệu chuẩn một thước điện trở (biến trở thẳng) hành trình 50 mm bằng chồng căn mẫu trên bàn đá, đọc bằng ADC 16 bit ADS1115 và ESP32. Chương trình trong bài đo theo kiểu tỉ lệ để không phụ thuộc nguồn 3,3 V, ghi các điểm theo chiều cao căn mẫu cả khi đi lên và đi xuống, khớp đa thức bậc 1 và bậc 2 bằng bình phương tối thiểu, tính sai số tuyến tính theo phần trăm toàn thang và lưu hệ số vào bộ nhớ. Cuối bài là cách đọc phần dư để thấy độ cong và độ trễ, và ngân sách độ không đảm bảo của phép đo vị trí sau hiệu chuẩn.

1. Chuẩn bị

Căn mẫu là chuẩn của phép hiệu chuẩn: sai số của căn mẫu cấp 1 cỡ một micromét, nhỏ hơn hàng chục lần so với sai số của thước điện trở, đúng nguyên tắc chuẩn phải tốt hơn nhiều so với thiết bị được hiệu chuẩn.

2. Nối dây và gá

Sơ đồ thước điện trở kẹp thẳng đứng trên giá, cần đẩy tì lên chồng căn mẫu đặt trên bàn đá; dây vàng con trượt vào AIN0, dây đỏ đầu 3V3 vào AIN1 và nối chung VDD, dây đen vào GND; ADS1115 nối ESP32 qua VDD 3V3, GND, SCL GPIO22, SDA GPIO21, ADDR nối GND
Gá thước trên bàn đá và sơ đồ nối ADS1115, ESP32 (hình tự vẽ).
TừNối tới
Thước: đầu 1GND
Thước: đầu 23V3, và AIN1 của ADS1115
Thước: con trượtAIN0 của ADS1115
ADS1115 VDD, GNDESP32 3V3, GND
ADS1115 SCL, SDAESP32 GPIO22, GPIO21
ADS1115 ADDRGND (địa chỉ 0x48)

Đo tỉ lệ: thước là bộ chia áp, điện áp con trượt tỉ lệ với cả vị trí lẫn điện áp nguồn. Chương trình đo cả con trượt (AIN0) lẫn chính điện áp đặt lên thước (AIN1) rồi lấy tỉ số, nên nguồn 3,3 V dao động không làm sai vị trí.

Gá: kẹp thước vuông góc với bàn đá, cần đẩy thẳng đứng; nếu cần đẩy nghiêng, mỗi chồng căn mẫu sẽ bị đo thành hình chiếu (sai số cosin). Đầu cần đẩy tì vào giữa mặt căn mẫu.

3. Chương trình

Chương trình đọc ADS1115 trực tiếp qua thanh ghi bằng thư viện Wire, lưu hệ số bằng Preferences; cả hai có sẵn trong gói esp32, không cần thư viện ngoài. Lệnh gõ trong Serial Monitor (115200 baud, kiểu xuống dòng Newline):

LệnhViệc làm
d20Ghi một điểm khi cần đẩy đang tì trên chồng căn mẫu cao 20 mm (32 lần đọc tỉ số)
lLiệt kê các điểm đã ghi
xXóa các điểm
kKhớp bậc 1, bậc 2, in phần dư, sai số tuyến tính, chọn bậc và lưu
mBật hoặc tắt chế độ đo vị trí liên tục
/*
  PYWORLD.VN - Thực hành hiệu chuẩn thước điện trở bằng căn mẫu: ADS1115 đo tỉ lệ, ESP32 khớp đa thức và tính độ tuyến tính
  Thước: một đầu GND, đầu kia 3V3, con trượt vào AIN0; 3V3 nối thêm AIN1. ADS1115: SDA GPIO21, SCL GPIO22, ADDR nối GND
  Lệnh Serial: d<mm> ghi điểm theo chiều cao căn mẫu, l liệt kê, x xóa điểm, k khớp và lưu, m bật/tắt đo
*/

#include <Wire.h>
#include <Preferences.h>

#define CHAN_SDA 21
#define CHAN_SCL 22
#define SO_DIEM_TOI_DA 12
#define SO_MAU_DIEM 32                    // Số lần đọc tỉ số cho mỗi điểm hiệu chuẩn

const uint8_t DIA_CHI_ADS = 0x48;
const uint8_t THANH_GHI_KET_QUA = 0x00;
const uint8_t THANH_GHI_CAU_HINH = 0x01;
// Đo một lần, dải ±4,096 V, 128 mẫu/s, tắt bộ so sánh: AIN0 so với GND (con trượt) và AIN1 so với GND (nguồn)
const uint16_t CAU_HINH_AIN0 = 0xC383;
const uint16_t CAU_HINH_AIN1 = 0xD383;

Preferences boNho;
float viTriDiem[SO_DIEM_TOI_DA];          // Chiều cao căn mẫu của từng điểm, mm
double tiSoDiem[SO_DIEM_TOI_DA];          // Tỉ số Vcon trượt / Vnguồn trung bình
double lechChuanDiem[SO_DIEM_TOI_DA];
int soDiem = 0;
double heSo[3] = {0.0, 50.0, 0.0};        // mm = a0 + a1*r + a2*r*r; giá trị đầu gần đúng cho thước 50 mm
int bacDaThuc = 1;
bool dangDo = false;

int16_t docAds(uint16_t cauHinh) {
  Wire.beginTransmission(DIA_CHI_ADS);
  Wire.write(THANH_GHI_CAU_HINH);
  Wire.write(cauHinh >> 8);
  Wire.write(cauHinh & 0xFF);
  Wire.endTransmission();
  delay(9);                               // Một lần chuyển đổi ở 128 mẫu/s mất khoảng 7,8 ms
  Wire.beginTransmission(DIA_CHI_ADS);
  Wire.write(THANH_GHI_KET_QUA);
  Wire.endTransmission();
  if (Wire.requestFrom(DIA_CHI_ADS, (uint8_t)2) != 2) {
    return 0;
  }
  uint8_t cao = Wire.read();
  uint8_t thap = Wire.read();
  return (int16_t)((cao << 8) | thap);
}

// Tỉ số con trượt / nguồn: nguồn 3V3 dao động thì cả hai cùng đổi, tỉ số giữ nguyên
bool docTiSo(double *tiSo) {
  int16_t conTruot = docAds(CAU_HINH_AIN0);
  int16_t nguon = docAds(CAU_HINH_AIN1);
  if (nguon < 1000) {
    return false;                         // Không có nguồn ở AIN1 hoặc mất kết nối I2C
  }
  *tiSo = (double)conTruot / nguon;
  return true;
}

bool docNhieuMau(int n, double *trungBinh, double *lechChuan) {
  double tong = 0, tongBinhPhuong = 0;
  for (int i = 0; i < n; i++) {
    double r;
    if (!docTiSo(&r)) {
      return false;
    }
    tong += r;
    tongBinhPhuong += r * r;
  }
  *trungBinh = tong / n;
  double phuongSai = (tongBinhPhuong - tong * tong / n) / (n - 1);
  *lechChuan = phuongSai > 0 ? sqrt(phuongSai) : 0;
  return true;
}

// Khử Gauss có chọn phần tử trụ cho hệ n ẩn (n ≤ 3)
bool giaiHe(double a[3][4], int n, double nghiem[3]) {
  for (int cot = 0; cot < n; cot++) {
    int hangTru = cot;
    for (int h = cot + 1; h < n; h++) {
      if (fabs(a[h][cot]) > fabs(a[hangTru][cot])) {
        hangTru = h;
      }
    }
    if (fabs(a[hangTru][cot]) < 1e-12) {
      return false;
    }
    for (int k = 0; k <= n; k++) {
      double tam = a[cot][k];
      a[cot][k] = a[hangTru][k];
      a[hangTru][k] = tam;
    }
    for (int h = 0; h < n; h++) {
      if (h != cot) {
        double f = a[h][cot] / a[cot][cot];
        for (int k = cot; k <= n; k++) {
          a[h][k] -= f * a[cot][k];
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {
    nghiem[i] = a[i][n] / a[i][i];
  }
  return true;
}

// Bình phương tối thiểu: vị trí theo tỉ số, đa thức bậc 1 hoặc 2
bool khopDaThuc(int bac, double c[3]) {
  int n = bac + 1;
  double a[3][4] = {{0}};
  for (int i = 0; i < soDiem; i++) {
    double r = tiSoDiem[i];
    double luyThua[5] = {1, r, r * r, r * r * r, r * r * r * r};
    for (int h = 0; h < n; h++) {
      for (int k = 0; k < n; k++) {
        a[h][k] += luyThua[h + k];
      }
      a[h][n] += luyThua[h] * viTriDiem[i];
    }
  }
  c[2] = 0;
  return giaiHe(a, n, c);
}

double tinhViTri(double r, const double c[3]) {
  return c[0] + c[1] * r + c[2] * r * r;
}

void luuHeSo() {
  boNho.begin("thuocdientro", false);
  boNho.putBytes("heso", heSo, sizeof(heSo));
  boNho.putInt("bac", bacDaThuc);
  boNho.end();
}

void napHeSo() {
  boNho.begin("thuocdientro", true);
  if (boNho.getBytesLength("heso") == sizeof(heSo)) {
    boNho.getBytes("heso", heSo, sizeof(heSo));
    bacDaThuc = boNho.getInt("bac", 1);
    Serial.println("Da nap he so hieu chuan da luu");
  } else {
    Serial.println("Chua co he so luu: can hieu chuan bang can mau");
  }
  boNho.end();
}

void lenhGhiDiem(float mm) {
  if (soDiem >= SO_DIEM_TOI_DA) {
    Serial.println("Da du so diem toi da");
    return;
  }
  double tb, s;
  if (!docNhieuMau(SO_MAU_DIEM, &tb, &s)) {
    Serial.println("Khong doc duoc ADS1115 hoac thieu nguon o AIN1");
    return;
  }
  viTriDiem[soDiem] = mm;
  tiSoDiem[soDiem] = tb;
  lechChuanDiem[soDiem] = s;
  soDiem++;
  Serial.printf("Diem %d: %.3f mm -> ti so %.6f (s = %.6f)\n", soDiem, mm, tb, s);
}

void lenhLietKe() {
  for (int i = 0; i < soDiem; i++) {
    Serial.printf("Diem %d: %.3f mm -> ti so %.6f (s = %.6f)\n", i + 1, viTriDiem[i], tiSoDiem[i], lechChuanDiem[i]);
  }
  Serial.printf("Tong %d diem\n", soDiem);
}

void lenhKhop() {
  if (soDiem < 3) {
    Serial.println("Can it nhat 3 diem, nen phu ca hanh trinh");
    return;
  }
  double c1[3], c2[3];
  if (!khopDaThuc(1, c1)) {
    Serial.println("Khong khop duoc: kiem tra cac diem");
    return;
  }
  bool coBac2 = soDiem >= 4 && khopDaThuc(2, c2);
  double tong1 = 0, tong2 = 0, nhoNhat = viTriDiem[0], lonNhat = viTriDiem[0];
  Serial.println("Diem | Can mau (mm) | Ti so    | Du bac 1 (mm) | Du bac 2 (mm)");
  for (int i = 0; i < soDiem; i++) {
    double du1 = viTriDiem[i] - tinhViTri(tiSoDiem[i], c1);
    double du2 = coBac2 ? viTriDiem[i] - tinhViTri(tiSoDiem[i], c2) : 0;
    tong1 += du1 * du1;
    tong2 += du2 * du2;
    if (viTriDiem[i] < nhoNhat) {
      nhoNhat = viTriDiem[i];
    }
    if (viTriDiem[i] > lonNhat) {
      lonNhat = viTriDiem[i];
    }
    Serial.printf("%4d | %12.3f | %8.6f | %13.4f | %13.4f\n", i + 1, viTriDiem[i], tiSoDiem[i], du1, du2);
  }
  double s1 = sqrt(tong1 / (soDiem - 2));
  double s2 = coBac2 ? sqrt(tong2 / (soDiem - 3)) : 0;
  Serial.printf("Do lech chuan phan du: bac 1 = %.4f mm, bac 2 = %.4f mm\n", s1, s2);
  // Bậc 2 chỉ dùng khi giảm phần dư rõ rệt, tránh khớp theo nhiễu và độ trễ
  bacDaThuc = (coBac2 && s2 < 0.5 * s1) ? 2 : 1;
  double duLonNhat = 0;
  for (int k = 0; k < 3; k++) {
    heSo[k] = bacDaThuc == 2 ? c2[k] : c1[k];
  }
  for (int i = 0; i < soDiem; i++) {
    double du = fabs(viTriDiem[i] - tinhViTri(tiSoDiem[i], heSo));
    if (du > duLonNhat) {
      duLonNhat = du;
    }
  }
  Serial.printf("Sai so tuyen tinh lon nhat: %.3f %% toan thang (%.2f mm)\n", duLonNhat / (lonNhat - nhoNhat) * 100, lonNhat - nhoNhat);
  luuHeSo();
  Serial.printf("Chon bac %d: a0 = %.4f mm, a1 = %.4f mm, a2 = %.4f mm (da luu)\n", bacDaThuc, heSo[0], heSo[1], heSo[2]);
}

void inHuongDan() {
  Serial.println("Lenh: d<mm> ghi diem | l liet ke | x xoa diem | k khop va luu | m bat/tat do");
}

void xuLyLenh() {
  if (!Serial.available()) {
    return;
  }
  String lenh = Serial.readStringUntil('\n');
  lenh.trim();
  if (lenh.length() == 0) {
    return;
  }
  char ma = lenh.charAt(0);
  String thamSo = lenh.substring(1);
  thamSo.trim();
  if (ma == 'd') {
    lenhGhiDiem(thamSo.toFloat());
  } else if (ma == 'l') {
    lenhLietKe();
  } else if (ma == 'x') {
    soDiem = 0;
    Serial.println("Da xoa cac diem");
  } else if (ma == 'k') {
    lenhKhop();
  } else if (ma == 'm') {
    dangDo = !dangDo;
    Serial.println(dangDo ? "Bat che do do" : "Tat che do do");
  } else {
    inHuongDan();
  }
}

void setup() {
  Serial.begin(115200);
  Wire.begin(CHAN_SDA, CHAN_SCL, 400000);
  delay(200);
  Serial.println();
  Wire.beginTransmission(DIA_CHI_ADS);
  if (Wire.endTransmission() != 0) {
    Serial.println("Khong thay ADS1115 o dia chi 0x48: kiem tra SDA, SCL va chan ADDR");
  }
  napHeSo();
  inHuongDan();
}

void loop() {
  xuLyLenh();
  if (!dangDo) {
    return;
  }
  double tb, s;
  if (!docNhieuMau(8, &tb, &s)) {
    Serial.println("Khong doc duoc ADS1115 hoac thieu nguon o AIN1");
    delay(1000);
    return;
  }
  Serial.printf("Ti so %.6f | Vi tri %.3f mm\n", tb, tinhViTri(tb, heSo));
  delay(200);
}
  • Thanh ghi cấu hình 0xC383 và 0xD383: đo một lần, AIN0 hoặc AIN1 so với GND, dải ±4,096 V, 128 mẫu/giây. Mỗi lần chuyển đổi khoảng 7,8 ms nên chương trình chờ 9 ms rồi đọc.
  • Khớp vị trí theo tỉ số: vị trí = a₀ + a₁·r + a₂·r². Tỉ số nằm trong khoảng 0–1 nên hệ phương trình không bị lệch thang.
  • Sai số tuyến tính in theo phần trăm của khoảng đã hiệu chuẩn (từ điểm thấp nhất tới cao nhất), cùng cách nhà sản xuất công bố độ tuyến tính của thước.

4. Trình tự hiệu chuẩn

Sáu thẻ bước: gá và ổn định nhiệt; điểm 0 khi cần đẩy tì lên bàn đá; đi lên với chồng căn mẫu 10 đến 50 mm; đi xuống 40 đến 0 mm để có độ trễ; khớp và lưu bằng lệnh k; kiểm tra bằng chồng 25 mm không dùng khi khớp
Sáu bước hiệu chuẩn với chương trình trong bài (hình tự vẽ).
  1. Gá và ổn định: để căn mẫu, thước và giá cân bằng nhiệt với phòng; dùng găng hoặc kẹp khi cầm căn mẫu.
  2. Điểm 0: cần đẩy tì thẳng lên bàn đá, gõ d0. Mọi chiều cao căn mẫu tính từ mặt bàn này.
  3. Đi lên: ghép chồng căn mẫu 10, 20, 30, 40, 50 mm (dùng ít miếng nhất), nâng cần đẩy, đặt chồng vào, hạ cần đẩy nhẹ nhàng, chờ vài giây, gõ d kèm chiều cao.
  4. Đi xuống: lặp lại 40, 30, 20, 10, 0 mm. So sánh hai chiều cho biết độ trễ của thước.
  5. Khớp và lưu: gõ k.
  6. Kiểm tra: gõ m, đặt chồng 25 mm (20 + 5 mm) không dùng khi khớp, so số đọc với 25,000 mm.

5. Kết quả mong đợi

Hai khung Serial Monitor: khung trên là 11 điểm hiệu chuẩn đi lên từ 0 đến 50 mm và đi xuống về 0 với tỉ số từ 0,020003 đến 0,979996; khung dưới là bảng phần dư bậc 1 và bậc 2, độ lệch chuẩn phần dư 0,0351 và 0,0065 mm, sai số tuyến tính 0,016 phần trăm toàn thang, chọn bậc 2, rồi đo chồng 25 mm được 24,995 mm
Kết quả trên Serial Monitor theo đúng định dạng của chương trình; tỉ số đo được là ví dụ (hình minh họa).
Đồ thị phần dư theo chiều cao căn mẫu từ 0 đến 50 mm: phần dư bậc 1 hình vòm từ cộng 0,04 xuống âm 0,04 rồi lên cộng 0,06 mm; phần dư bậc 2 nằm trong khoảng cộng trừ 0,008 mm, các điểm đi lên dương nhẹ và đi xuống âm nhẹ cho thấy độ trễ
Phần dư bậc 1 cho thấy độ cong; sau khi khớp bậc 2, phần còn lại chủ yếu là độ trễ (hình tự vẽ, số liệu ví dụ).
  • Phần dư bậc 1 có dạng vòm: thước không hoàn toàn thẳng, hai đầu và giữa lệch khoảng 0,04–0,06 mm. Khớp bậc 2 giảm độ lệch chuẩn phần dư từ 0,035 mm xuống 0,0065 mm, nên chương trình chọn bậc 2.
  • Sau khi khớp bậc 2, các điểm đi lên lệch dương nhẹ, đi xuống lệch âm nhẹ: đó là độ trễ khoảng 0,013 mm, do ma sát con trượt và khe hở cơ khí. Bậc đa thức nào cũng không bỏ được trễ.
  • Sai số tuyến tính sau hiệu chính chỉ khoảng 0,016 % toàn thang; chồng 25 mm đọc được 24,995 mm.

6. Độ không đảm bảo sau hiệu chuẩn

Bảng ngân sách độ không đảm bảo khi đo vị trí sau hiệu chuẩn: chồng căn mẫu 0,0006 mm, phần dư khớp bậc 2 0,0065 mm, trễ 0,0038 mm, lặp lại 0,0002 mm, độ phân giải ADS1115 0,0006 mm, nhiệt độ 0,0058 mm, cần đẩy lệch và tiếp xúc con trượt 0,0058 mm; kết hợp 0,0111 mm, mở rộng 0,022 mm
Ước lượng độ không đảm bảo của phép đo vị trí (hình tự vẽ; các mức nhiệt độ, lệch trục là ước lượng).

Độ không đảm bảo mở rộng khoảng 0,02 mm trên hành trình 50 mm. Căn mẫu chỉ góp phần không đáng kể; các nguồn chính là phần dư còn lại, nhiệt độ, độ trễ và tiếp xúc của con trượt. Thước điện trở dùng một chiều (ví dụ chỉ đo khi đẩy vào) và trong phòng ổn định nhiệt sẽ có độ không đảm bảo nhỏ hơn. Cũng nên nhớ: thước điện trở mòn dần ở đoạn hay dùng, nên hiệu chuẩn lại định kỳ và sau khi thấy số đọc nhảy.

7. Xử lý lỗi

Hiện tượngNguyên nhânCách xử lý
Khong thay ADS1115 o dia chi 0x48Sai SDA, SCL, ADDR chưa nối GNDKiểm tra dây GPIO21, GPIO22 và chân ADDR
Khong doc duoc ADS1115 hoac thieu nguon o AIN1Chưa nối đầu 3V3 của thước vào AIN1Nối AIN1 với đầu 3V3 của thước
Tỉ số giảm khi cần đẩy đi lênĐảo hai đầu thướcĐổi chỗ hai đầu, hoặc để nguyên vì phép khớp vẫn đúng
s của mỗi điểm lớn, số nhảyCon trượt bẩn, mòn, dây lỏngVệ sinh, dây ngắn, thay thước nếu mòn
Phần dư lớn ở một điểmNhập sai chiều cao, bụi dưới căn mẫuLau căn mẫu và bàn đá, ghi lại điểm đó

8. Xem thêm


Tin tức liên quan

Cấp nguồn ESP32 bằng pin 18650 sạc qua jack Type-C tích hợp mạch sạc
Cấp nguồn ESP32 bằng pin 18650 sạc qua jack Type-C tích hợp mạch sạc

Sơ đồ nguồn cho ESP32 chạy pin 18650, sạc qua jack Type-C trên vỏ hộp: vì sao cần mạch đổi áp, chọn tăng áp 5 V hay ổn áp 3,3 V, ước tính thời gian chạy pin, đo mức pin và các lỗi nguồn thường gặp.

Chu kỳ hiệu chuẩn và kiểm tra giữa kỳ: ai quyết định, dùng lịch sử độ trôi và biểu đồ kiểm soát
Chu kỳ hiệu chuẩn và kiểm tra giữa kỳ: ai quyết định, dùng lịch sử độ trôi và biểu đồ kiểm soát

Chu kỳ hiệu chuẩn do ai quyết định, các yếu tố cần xét, dùng lịch sử độ trôi, phương pháp theo ILAC-G24/OIML D 10, kiểm tra giữa kỳ bằng biểu đồ kiểm soát cho lực, chuyển vị, áp suất, rung.

Chuẩn lực: máy tải trọng chết, đòn bẩy, khuếch đại thủy lực, máy so sánh và gia tốc trọng trường
Chuẩn lực: máy tải trọng chết, đòn bẩy, khuếch đại thủy lực, máy so sánh và gia tốc trọng trường

Bốn kiểu máy chuẩn lực: tải trọng chết, đòn bẩy, khuếch đại thủy lực, máy so sánh; cách tính lực từ quả cân, vì sao g tại Việt Nam lệch 0,25 % và chuỗi liên kết chuẩn lực.

Quy tắc quyết định và tỉ số TUR: khi nào được kết luận đạt, dải bảo vệ và rủi ro chấp nhận sai
Quy tắc quyết định và tỉ số TUR: khi nào được kết luận đạt, dải bảo vệ và rủi ro chấp nhận sai

Quy tắc quyết định theo ISO/IEC 17025 và ILAC-G8: bốn trường hợp kết quả sát giới hạn, chấp nhận đơn giản và dải bảo vệ, rủi ro chấp nhận sai, tỉ số TUR 4:1 và cách chọn quy tắc.

Cảm biến mô men xoắn: cấu tạo, nguyên lý strain gauge 45°, cách chế tạo và bàn thử công suất
Cảm biến mô men xoắn: cấu tạo, nguyên lý strain gauge 45°, cách chế tạo và bàn thử công suất

Cảm biến mô men xoắn hoạt động thế nào: strain gauge xiên 45° trên trục, vành trượt, biến áp quay, đo góc xoắn, từ giảo, cách chế tạo và bàn thử mô men, công suất với ESP32.

RS-485 là gì: cặp dây vi sai, điện trở đầu cuối và cách dùng module MAX485 với ESP32
RS-485 là gì: cặp dây vi sai, điện trở đầu cuối và cách dùng module MAX485 với ESP32

Giải thích chuẩn RS-485: tín hiệu vi sai trên hai dây A, B, điện trở đầu cuối 120 Ω, truyền bán song công với chân DE, RE. Kèm sơ đồ nối module MAX485 và chương trình hỏi đáp giữa hai mạch ESP32.

Độ không đảm bảo đo theo GUM: sáu bước tính, loại A, loại B và ví dụ ngân sách hiệu chuẩn áp kế
Độ không đảm bảo đo theo GUM: sáu bước tính, loại A, loại B và ví dụ ngân sách hiệu chuẩn áp kế

Cách tính độ không đảm bảo đo theo GUM: sáu bước, đánh giá loại A và loại B, phân bố chuẩn, chữ nhật, tam giác, ví dụ ngân sách hiệu chuẩn áp kế, cách làm tròn và lỗi hay gặp.

Tổng quan các chuẩn giao tiếp cho vi điều khiển: UART, I2C, SPI, RS-485, CAN và cách chọn
Tổng quan các chuẩn giao tiếp cho vi điều khiển: UART, I2C, SPI, RS-485, CAN và cách chọn

So sánh các chuẩn giao tiếp thường gặp với vi điều khiển: UART, I2C, SPI, 1-Wire, RS-485, CAN, Ethernet và không dây. Giải thích tín hiệu vi sai, ba lớp của một hệ giao tiếp và cách chọn chuẩn theo nhu cầu.


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