0

Driver DS18B20

I. DS18B20 One-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. Example 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>  
#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. Đọc và phân tích DS18B20 datasheet

Điều kiện tiên quyết**

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.

1. Overview

a. 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ụ:

b. 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.

c. Powering the DS18B20

Chưa đọc ❌

d. 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.

e. 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.

f. 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

h. CRC Generation

Cả ROM Code và MEMORY đều có chứa một byte (8 - bit) CRC được tạo từ bộ tạo CRC. image.png

Đây là một thanh ghi LSFR.

Byte thấp và bit thấp sẽ được đưa vào xử lí trước tiên rồi tới byte cao và bit cao.

2. One-Wire Bus System

Tham khảo :

Quy trình gửi

  • Bước 1: Khởi tạo
  • Bước 2: ROM Command
  • Bước 3: DS18B20 Function Command.

Tuy nhiên với, Search ROM 0xF0 và Alarm search 0xEC là ngoại lệ với các bước này. Sau khi gửi 1 trong 2 lệnh này, Master cần phải quay lại từ bước 1.

a. Khởi tạo

  • Tất cả các giao tiếp trên bus đều bắt đầu một chuỗi khởi tạo.
  • Chuỗi khởi tạo này bao gồm:
    • Một xung reset được truyền bởi master.
    • Tiếp theo là một or nhiều xung hiện diện được truyền bởi slave => Xung hiện diện để nối cho master biết là có slave (ví dụ: DS18B20) đang ở trên bus và sẵn sàng hoạt động.

b. ROM Commands

Sau khi master xác nhận có slave trên bus, lúc này có thể gửi Rom commands. Các lệnh rom này sẽ hoạt động trên ROM CODE 64-bit riêng biệt của IC.

Tác dụng của lệnh ROM:

  • Xác định số lượng, loại device nào đang có trên bus.
  • Device nào đang có tình trạng báo động.

Có 5 ROM Comands (mỗi lệnh dài 8-bit), master cần phải đưa ra lệnh thích hợp trước khi gửi DS18B20 Function Command.

  • Search ROM 0xF0.
  • Read ROM 0x33.
  • Match ROM 0x55.
  • Skip ROM 0xCC.
  • Alarm Search 0xEC.

Figure 13. ROM Commands Flowchart (Trong datasheet trang 13)

c. DS18B20 Function Commands

Sau khi master sử dụng ROM commands để định vị được device mà nó muốn giao tiếp. theo mong muốn.Bây giờ master có thể gửi những Function Commands dể điều khiển DS18B20

Tác dụng của DS18B20 Function Commands:

  • Cho phép master ghi or đọc dữ liệu từ DS18B20’s scratchpad memory.
  • Khởi tạo quá trình chuyển đổi nhiệt độ, xác định chế độ cấp nguồn (nguồn ngoài hoặc nguồn kí sinh).

Commads.

  • Convert T 0x44.
  • Write Scratchpad 0x4E.
  • Read Scratchpad 0xBE.
  • Copy Scratchpad 0x48.
  • Recall E2 0xB8.
  • Read Power Supply 0xB4.

3. One-Wire Signaling

DS18B20 sử dụng giao thức truyền thông One-Wire nghiêm ngặt để đảm bảo tính toàn vẹn dữ liệu.

Giao thức này định nghĩa một số loại tín hiệu.

  • Xung reset (Reset pulse).
  • Xung hiện diện (Presence pulse).
  • Write 0 or 1 / Read 0 or 1.

a. Initialization Procedure—Reset And Presence Pulses

Tất cả giao tiếp của DS18B20 đều bắt đầu từ một xung reset từ master và sau đó là một xung của DS18B20.

Master cần phải kéo xuống LOW trong khoảng 480µs. Sau khi bus được giải phóng khỏi master, điện trở 5k Om sẽ kèo bus lên mức cao. Khi DS18B20 phát hiện cạnh lên này, nó sẽ đợi từ 15us - 60 us rồi truyền xung hiện diện bằng cách kéo bus xuống mức thấp trong khoảng 60 us đến 240 us.

b. Read/Write Time Slots

  • Bus master ghi dữ liệu vào DS18B20 trong write time slots.
  • Bus master đọc dữ liệu từ DS18B20 trong read time slots
+ Write Time Slots
  • Có 2 loại write time slots: "Write 0" và "Write 1".
    • Bus master sử dụng "Write 0" để ghi 1 bit = 0 tới DS18B20.
    • Bus master sử dụng "Write 1" để ghi 1 bit = 1 tới DS18B20.
  • Write time slots có thời gian tối thiểu là 60 us, với 1 us là thời gian hồi phục tối thiểu giữa các write time slots.
  • Cả 2 loại write time slots đều được khởi tạo khi bus master kéo bus 1-Wire xuống LOW.

Chú thích:

  • (1) 1μs < TREC < ∞ trong "MASTER WRITE '1' SLOT" -TREC (Recovery Time): Là thời gian tối thiểu từ khi master thả đường bus lên HIGH → đến khi bắt đầu slot kế tiếp.
    • Sau khi kết thúc 1 write slot, phải chờ ít nhất 1μs trước khi bắt đầu bit tiếp theo → để bus kịp hồi mức HIGH và slave kịp ổn định.
  • (2) 1μs tại đầu pulse trong MASTER WRITE '1' → Đây là thời gian tối thiểu mà master phải kéo LOW để khởi tạo một write slot.

Tạo Write 1 time slots, sau khi kéo bus 1-wire xuống LOW. Master phải giải phóng bus trong khoảng 15 us. Bus sẽ lên lại mức HIGH nhờ điện trở Pull-up.

Tạo Write 0 time slots, sau khi master kéo bus 1-wire xuống LOW, master cần phải tiếp tục giữ bus ở mức LOW trong suốt khe thời gian (ít nhất là 60 us).

DS18B20 sẽ lấy mẫu trong khoảng thời gian 15 us - 60 us sau khi master khởi tạo write time slots.

  • Nếu bus ở mức HIGH trong thời gian lấy mẫu, giá trị 1 sẽ được ghi vào DS18B20.
  • Nếu bus ở mức LOW trong thời gian lấy mẫu, giá trị 0 sẽ được ghi vào DS18B20.
+ Read Time Slots

  • DS18B20 chỉ có thể gửi data khi master phát ra read time slots. Do đó master cần phải tạo các read time slots sau khi gửi lệnh Read Scratchpad [BEh] or Read Power Supply [B4h]để DS18B20 cung cấp dữ liệu được yêu cầu. Ngoài ra master cũng có thể tạo ra read time slots sau các lệnh Convert T 44h] or Recall E2 [B8h].
  • Read time slots phải có thời gian tối thiểu là 60 us và thời gian tối thiểu giữa các khe thời gian là 1 us.
  • Read time slots được khởi tạo bởi master kéo 1 wire bus xuống LOW tối thiểu là 1 us rồi nhả bus.
  • Sau khi master khởi tạo read time slots thì DS18B20 sẽ bắt đầu gửi 1 or 0 trên bus.
    • DS18B20 truyền 1 bằng cách giữ bus ở mức HIGH và truyền 0 bằng cách kéo bus xuống mức LOW.
    • Lưu ý khi DS18B20 truyền bit 0, DS18B20 sẽ giải phóng bus vào cuối khe thời gian và bus sẽ được kéo lại mức HIGH nhờ điện trở kéo lên.
  • Dữ liệu đầu ra của DS18B20 có giá trị trong khoảng 15 us sau khi cạnh xuống khởi tạo read time slots.

Chú ý:

Hình 17 minh họa rằng tổng TINIT, TRCTSAMPLE phải nhỏ hơn 15µs cho một read time slots.

Hình 18 cho thấy biên độ thời gian hệ thống được tối đa hóa bằng cách giữ TINITTRC càng ngắn càng tốt và bằng cách xác định thời gian lấy mẫu chính trong các khe thời gian đọc gần cuối chu kỳ 15µs.

  • TRC là thời gian phục hồi của mạch RC.

Câu hỏi

1. Làm thế nào để có lấy ROM code của mỗi DS18B20 trên bus ❓

Trường hợp 1: Chỉ có một DS18B20 trên bus 1 - Wire

  • Dùng READ ROM (0x33) để lấy seri number của DS18B20 trong ROM CODE.
  • Sử dụng MATCH ROM (0x55) để có thể khớp với DS18B20.

Trường hợp 2: Nhiều DS18B20 trên bus 1 - Wire

  • Lúc này không thể sử dụng READ ROM (0x33) được nữa.
  • Dùng SEARCH ROM (0xF0) để có thể lấy nhiều seri number của nhiều DS18B20 trên bus.
  • Dùng MATCH ROM (0x55) để xác định DS18B20 nào đang cần giao tiếp.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí