Driver DS18B20 (Phần 1)

0 0 0

Người đăng: Nguyễn Đặng Triều

Theo Viblo Asia

I. DS18B20 1-Wire Temperature Sensor

  • Theo kiểu 1-Wire: Chuẩn giao tiếp này cho phép dữ liệu được truyền chỉ với một đường duy nhất, giảm thiểu đáng kể số lượng kết nối.
  • Nhiệt độ đo được: 55°C to +125°C, với độ chính xác ±0.5°C between -10°C and +85°C.
  • Điều chọn độ chính xác bằng cách điều chỉnh độ phân giải: 9, 10, 11 và 12 bits.
  • Điện áp hoạt động: 3.3V - 5V, 1mA.

II. DS18B20 Sensor Pinout!

  • GND
  • DQ là đường truyền dữ liệu. Kết nối vào chân digital của vi điều khiển và yêu cầu một điện trở kéo lên có giá trị là 4.7kΩ.
  • VDD là nguồn của sensor (3.3V - 5V)

III. Driver for DS18B20

Trước tiên mình sẽ nghiên cứu một ví dụ đơn giản trên arduino đi

#include <OneWire.h> //❌ phần này mk chưa từng đọc thư viện này.
#include <DallasTemperature.h> // Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2 // ----- Đây là phần khởi tạo này -------------
// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS); // Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);
// -------------------------------------- void setup(void) { Serial.begin(9600); sensors.begin();
} void loop(void) { // Send the command to get temperatures sensors.requestTemperatures(); // Để lấy dữ liệu nhiệt độ. // ------ Hiển thị dữ liệu nhiệt độ ở °C và °F. ------------ //print the temperature in Celsius Serial.print("Temperature: "); Serial.print(sensors.getTempCByIndex(0)); Serial.print("°C | "); //print the temperature in Fahrenheit Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0); Serial.println("°F"); // ---------------------------- delay(500);
}

👉 Output

IV. Read DS18B20 datasheet

1. Prerequisite

Phần bù 2

Để biểu diễn -1.

  • B1: 0000 0001 -> biểu diễn nhị phân của số 1
  • B2: 1111 1110 -> đảo nhị phân của dương 1.
  • B3: 1111 1110 + 1 => 1111 1111.

Vậy 1111 1111 là biểu diễn nhị phân của -1.

2. Analyze the required data in the datasheet

✅ Operation—Measuring Temperature

Dữ liệu nhiệt độ được lưu trữ trong thanh ghi 16 bit và dạng phần bù 2 (có giá trị âm) có tên là temperature register.

  • Bit 0 - 3: biểu diễn phần thập phân.
  • Bit 4 - 10: data.
  • Bit 11 - 15: positive or negative.

S là biểu thị của số positive or negative.

  • S = 0: positive
  • S = 1: negative

If the DS18B20 is configured ...

  • For 12-bit resolution: Tất cả các bit trong thanh temperature register đều có giá trị.
  • For 11-bit resolution: bit 0 sẽ undefined.
  • For 10-bit resolution: bit 1 và 0 sẽ undefined.
  • For 9-bit resolution: bit 2, 1 và 0 sẽ undefined.

Ví dụ:

✅ Operation—Alarm Signaling

  • Chỉ các bit từ 4 - 11 của thanh ghi temperature register mới được sử dụng trong phép so sánh TH và TL bởi vì TH và TL là thanh ghi 8 bit.
  • Nhiệt độ đo được <= TL or >= TH thì sẽ có báo động và cờ sẽ được set trong DS18B20. Cờ này được cập nhập sau mỗi lần đo nhiệt độ. Nếu trình trạng báo động biến mất thì cờ sẽ tắt.
  • Master(vi điều khiển: STM32, Arduino, ...) có thể gửi lênh 0xEC để kiểm tra xem có DS18B20 nào đang báo động hay không ? Bất kì DS18B20 nào đang trong trạng thái báo động sẽ phản hồi lại lệnh, master có thể xác định chính xác thiết bị DS18B20 nào đang báo động.

❌ Powering the DS18B20

Chưa đọc

64-BIT Lasered ROM code

Mỗi DS18B20 đều chứa 1 mã định danh 64-bit duy nhất, gọi là ROM CODE. Dùng để nhận dạng thiết bị trên bus 1-Wire.

  • 8 bit thấp: 1-Wire family code: 28h.
  • 48 bit: Serial number - mỗi IC là duy nhất.
  • 8 bit cuối: chứa một byte check CRC.

Memory

Memory bao gồm SRAM scratchpad (bộ nhớ tạm thời) +nonvolatile EEPROM ( không bị mất dữ liệu khi mất nguồn).

Note that if the DS18B20 alarm function is not used, the TH and TL registers can serve as general-purpose memory

  • Byte 0 và byte 1: chứa LSB và MSB của thanh ghi temperature register.
  • Byte 2 và byte 3: cung cấp truy cập vào thanh ghi THTL.
  • Byte 4: chứa thanh ghi cấu hình dữ liệu, sẽ được giải thích chi tiết trong phần Configuration Register.
  • Byte 5,6 và 7: không sử dụng.
  • Byte 8: read-only. Chứa code CRC cho các byte 0 -> 7 của scratchpad. Cách mà DS18B20 tạo ra CRC này sẽ được mô tả trong phần CRC Generation.

Dữ liệu đươc ghi vào byte 2, 3 và 4 của scratchpad bằng lệnh Write Scratchpad 4Eh. Dữ liệu được truyền bắt đầu từ bit least của byte 2.

Để xác nhận tính toàn vẹn của data thì sử dụng Read Scratchpad BEh sau khi được ghi. Khi đọc scartchpad dữ liệu sẽ được truyền qua bus 1-Wire bắt đầu bằng bit least của byte 0. Để truyền dữ liệu TH, TL và configuration data từ scratch sang EEPROM. Master cần gửi Copy Scratchpad 48h.

Data trong EEPROM không bị mất khi tắt nguồn. Khi mở nguồn dữ liệu sẽ được tải lại vào các vị trí scratchpad tương ứng. Dữ liệu cũng có thể được tải từ scratchpad vào EEPROM vào bất kì lúc nào bằng Recall E2 B8h. Master có thể cấp các khe thời gian sau lệnh Recall E2 và DS18B20 sẽ chỉ ra trạng thái của Recall E2 bằng cách truyền ...

  • 0 nếu quá trình Recall đang diễn ra.
  • 1 nếu quá trình Recall kết thúc.

Configuration Register

  • Byte 4 trong scratchpad chứa thanh ghi configuration.
  • Bit R0 và R1 để điều chỉnh độ phân giải. Khi mới bật nguồn, default R1 = 1 và R0 = 1 (12 bit resolution).

Note that there is a direct tradeoff between resolution and conversion time - nghĩa là độ phân giải càng cao thì thời gian chuyển đổi càng lâu

CRC Generation

Bình luận