温度センサー技術

STM32 用 DS18B20 デジタル温度センサーの設計

DS18B20 温度感知ワイヤ ステンレス鋼プローブ キット

DS18B20 は、単一バス タイミングを使用してホストと通信するデジタル温度センサーです。. のみ 1 温度データの読み取りを完了するにはワイヤーが必要です;

DS18B20 には、簡単に識別できるように 64 ビットの製品シリアル番号が組み込まれています。. 複数の DS18B20 センサーを接続可能 1 ワイヤー, 64 ビット ID 認証を通じて, さまざまなセンサーから収集された温度情報を個別に読み取ることができます.

DS18B20 温度感知ワイヤ ステンレス鋼プローブ キット

DS18B20 温度感知ワイヤ ステンレス鋼プローブ キット

DS18B20温度センサープローブTPEオーバーモールディングキット

DS18B20温度センサープローブTPEオーバーモールディングキット

1 ワイヤDS18b20温度センサー

1 ワイヤDS18b20温度センサー

DS18B20の紹介
2.1 DS18B20の主な機能
1. 完全なデジタル温度変換と出力.
2. 高度なシングルバスデータ通信.
3. 最大12ビット解像度, 摂氏±0.5度まで精度があります.
4. 12ビット解像度での最大作業サイクルは次のとおりです 750 ミリ秒.
5. 寄生的な作業モードを選択できます.
6. 検出温度範囲は–55°C〜+125°Cです (–67°F〜+257°F).
7. 組み込みeeprom, 温度制限アラーム関数.
8. 64-ビットフォトリソグラフィROM, 組み込み製品のシリアル番号, マルチマシン接続に便利です.
9. さまざまなパッケージングフォーム, さまざまなハードウェアシステムに適応します.

DS18B20チップパッケージ構造

DS18B20チップパッケージ構造

2.2 DS18B20 PIN機能
GND電圧グラウンド;
DQシングルデータバス;
VDD電源電圧;
NC空のピン;

DS18B20チップRAMおよびEEPROM構造図

DS18B20チップRAMおよびEEPROM構造図

2.3 DS18B20作業原則とアプリケーション
DS18B20温度検出とデジタルデータ出力は、1つのチップに完全に統合されています, したがって、干渉防止能力が強くなります. その1つの作業サイクルは2つの部分に分けることができます, つまり、温度検出とデータ処理.

18B20には、3つの形式のメモリリソースがあります. 彼らです: ROM読み取り専用メモリ, DS18B20IDコードの保存に使用されます; 最初 8 ビットはシングルラインシリーズコードです (DS18B20コードは19Hです), 次の 48 ビットは、チップの一意のシリアル番号です; 最後 8 ビットはCRCコードです (冗長チェック) 上記の 56 ビット. データは生産時に設定されており、ユーザーが変更することはできません. DS18B20には合計があります 64 ROMのビット.

RAMデータレジスタ, 内部計算とデータアクセスに使用されます, 停電後にデータが失われます, DS18B20には合計があります 9 ラムのバイト, 各バイトはです 8 ビット. 1番目と2番目のバイトは、温度変換後のデータ値情報です; 3番目と4番目のバイトは、ユーザーのEEPROMの鏡像です (温度アラーム値の保存に一般的に使用されます). 電源がリセットされると、その値は更新されます. 5番目のバイトは、ユーザーの3番目のEEPROMの鏡像です. 6日, 7th, 8番目のバイトはカウントレジスタです, ユーザーがより高い温度解像度を取得できるように設計されています. また、内部温度変換と計算のための一時的なストレージユニットでもあります. 9番目のバイトは、最初のCRCコードです 8 バイト. EEPROMは、長時間保存する必要があるデータを保存するために使用される不揮発性メモリです, 上限および低温アラーム値, および検証データ. DS18B20には合計があります 3 Eepromのビット, そして、ユーザーの操作を容易にするためにRAMに鏡像があります.

DS18B20は、デフォルトで12ビット解像度モードで動作します. 変換後に得られた12ビットデータは、DS18B20の2つの8ビットRAMに保存されます (最初の2バイト). 最初 5 バイナリのビットはサインビットです. 測定された温度がより大きい場合 0, これら 5 ビットはです 0. 測定値を掛けるだけです 0.0625 実際の温度を取得します. 温度が少ない場合 0, これら 5 ビットはです 1. 測定値を反転する必要があります, 追加された 1, そして、それを掛けます 0.0625 実際の温度を取得します. または、ビット操作を使用して温度を抽出します: 小数の場所は下を占有します 4 ビット, そして、上部ビットは整数ビットです (負の数は考慮されません).

2.4 DS18B20チップROM命令テーブル
1. ROMを読んでください [33H] (16進コマンドワードは正方形の括弧内にあります).
このコマンドにより、バスコントローラーはDS18B20の64ビットROMを読み取ることができます. この命令は、バスにDS18b20が1つしかない場合にのみ使用できます. 複数の接続されている場合, 通信中にデータの競合が発生します.

2. atch rom [55H]
この命令の後に、コントローラーが発行した64ビットシリアル番号が続きます. バスにDS18B20が複数ある場合, コントローラーが発行したものと同じシリアル番号を持つチップのみが応答できます, そして他のチップは次のリセットを待ちます. この命令は、シングルチップとマルチチップ接続に適しています.

3. 出荷室 [CCH]
この命令により、チップはROMコードに応答しません. 単一のバスの場合, この命令は、時間を節約するために使用できます. 複数のチップが接続されているときにこの命令を使用する場合, データの競合が発生します, 結果としてエラーが発生します.

4. ROMを検索します [F0H]
チップが初期化された後, 検索命令により、複数のチップがバスに接続されている場合、すべてのデバイスの64ビットROMを除去することで識別できます.

5. アラーム検索 [私]
複数のチップの場合, アラームチップ検索命令は、TLよりも高い温度よりも高い温度のアラーム条件を満たすチップにのみ応答します. チップが電源が切れていない限り, アラーム状態は、温度が再び測定され、アラーム条件に到達しないまで維持されます.

6. スクラッチパッドを書きます [4ええ]
これは、RAMにデータを書くための指示です. 書かれた2バイトのデータは、その後アドレスに保存されます 2 (アラームラムのth) およびアドレス 3 (アラームラムのtl). 書き込みプロセスは、リセット信号によって終了できます.

7. ScratchPadを読んでください (RAMからデータを読んでください) [beh]
この命令はRAMのデータを読み取ります, アドレスから開始 0 そして対処するために 9, RAMデータ全体の読み取りを完了します. チップにより、リセット信号が読み取りプロセスを終了させることができます, あれは, 読み取り時間を短縮するために、その後の不要なバイトを無視できます.

8. ScratchPadをコピーします (RAMデータをEEPROMにコピーします) [48H]
この命令は、RAMのデータをEEPROMに保存して、電源がオフになったときにデータが失われないようにします. チップはEEPROMストレージ処理で忙しいためです, コントローラーが読み取り時間スロットを送信するとき, バスの出力 “0”, そして、ストレージ作業が完了したとき, バスが出力されます “1”.
寄生動作モードで, チップ操作を維持するために、この命令が少なくとも10ミリ秒間発行され、維持された直後に強力なプルアップを使用する必要があります.

9. tを変換します (温度変換) [44H]
この指示を受け取った後, チップは温度変換を実行し、変換された温度値をRAMの1番目と2番目のアドレスに保存します. チップは温度変換処理で忙しいためです, コントローラーが読み取り時間スロットを送信するとき, バスの出力 “0”, そして、ストレージ作業が完了したとき, バスが出力されます “1”. 寄生動作モードで, チップ操作を維持するために、この命令が少なくとも500ミリmで発行および維持された直後に強力なプルアップを使用する必要があります.

10. Eepromを思い出してください (eepromのアラーム値をRAMにコピーします) [B8H]
この命令は、EEPROMのアラーム値をRAMの3番目と4番目のバイトにコピーします. チップは処理のコピーに忙しいためです, コントローラーが読み取り時間スロットを送信するとき, バスの出力 “0”, そして、ストレージ作業が完了したとき, バスの出力 “1”. 加えて, この命令は、チップが電源を入れてリセットすると自動的に実行されます. このようにして, RAMの2つのアラームバイトビットは、常にEEPROMのデータの鏡像になります.

11. 電源を読んでください (ワーキングモードスイッチ) [B4H]
この命令が発行された後, 読み取り時間ギャップが発行されます, そして、チップはその電源ステータスワードを返します. “0” 寄生電力状態です “1” 外部電力状態です.

2.5 DS18B20タイミング図
2.5.1 DS18B20リセットと応答関係図
各通信の前にリセットを実行する必要があります. リセット時間, 待ち時間, そして、応答時間はタイミングに従って厳密にプログラムする必要があります.
DS18B20の読み取りと書き込みの時刻ギャップ: DS18B20データの読み取りと書き込みは、時間ギャップの処理ビットと情報を交換するためのコマンドワードによって確認されます.

DS18B20リセットと応答関係図

DS18B20リセットと応答関係図

2.5.2 データを書き込みます 0 およびデータ 1 DS18b20へ
書き込みデータの時刻ギャップの最初の15USで, バスはコントローラーによって低く引っ張る必要があります, そして、それはバスデータのチップサンプリング時間になります. サンプリング時間は15〜60usです. サンプリング時間中にコントローラーがバスを高く引っ張った場合, それは書くことを意味します “1”, コントローラーがバスを低く引っ張った場合, それは書くことを意味します “0”.
トランスミッションの各ビットには、少なくとも15 usの低レベルのスタートビットが必要です, および後続のデータ “0” または “1” 45US以内に完了する必要があります.
ビット全体の送信時間は60〜120USに保つ必要があります, そうしないと、通常の通信を保証できません.
注記: DS18B20は、低ビットのデータを読み取り、書き込みます.

データを書き込みます 0 およびデータ 1 DS18b20へ

データを書き込みます 0 およびデータ 1 DS18b20へ

2.5.3 データを読む 0 およびデータ 1 DS18B20から
読み取り時間ギャップ中のコントロールのサンプリング時間は、より正確でなければなりません. 読み取りタイムギャップ中, また、ホストは読み取り時間の開始を示すために少なくとも1 usの低レベルを生成する必要があります. それから, バスが解放されてから15 us, DS18B20は、内部データビットを送信します. 現時点では, コントロールがバスが高いことを発見した場合, それは読むことを意味します “1”, バスが低い場合, それはデータを読むことを意味します “0”. 各ビットを読む前に, コントローラーは開始信号を追加します.

データを読む 0 およびデータ 1 DS18B20から

データを読む 0 およびデータ 1 DS18B20から

注記: 正しい通信を確保するために、読み取りギャップの開始から15US以内にデータビットを読み取る必要があります.

コミュニケーション中, 8 のビット “0” または “1” バイトとして使用されます, そして、バイトの読み取りまたは書き込みは低いビットから始まります.

2.5.4 温度を1回読み取ります (バス上のDS18b20のみが1つだけです)

1. リセット信号を送信します
2. 応答信号を検出します
3. 0xccを送信します
4. 0x44を送信します
5. リセット信号を送信します
6. 応答信号を検出します
7. 0xccを書きます
8. 0xbeを書いてください
9. ループ 8 低いバイトの温度を読む時間
10. ループ 8 高いバイトの温度を読む時間
11. 16ビットの温度データとプロセスを合成します

3. ドライバーコード

3.1 DS18B20.C
#含む “DS18B20.H”
/*
関数: DS18B20初期化
ハードウェア接続: PB15
*/
void ds18b20_init(空所)
{
RCC->apb2enr|= 1<<3; //PB
gpiob->CRH&= 0x0fffffff;
gpiob->CRH|= 0x30000000;
gpiob->ODR|= 1<<15; //プルアップ
}

/*
関数: DS18B20デバイスが存在するかどうかを確認してください
返品値: 1 デバイスが存在しないことを意味します 0 デバイスが正常であることを意味します
*/
U8 DS18B20_CHECKDEVICE(空所) //Contains reset pulse, detection pulse
{
DS18B20_OUTPUT_MODE();//Initialize to output mode
DS18B20_OUT=0; //Generate reset pulse
DelayUs(750); //Generate 750us low level
DS18B20_OUT=1; //Release bus
DelayUs(15); //Wait for DS18B20 response
もし(DS18B20_CleckAck())//Detect existence pulse
{
return 1;
}
return 0;
}

/*
関数: Detect existence pulse of DS18B20 device
返品値: 1 indicates error 0 indicates normal
*/
u8 DS18B20_CleckAck(空所)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//Initialize to input mode
その間(DS18B20_IN&&cnt<200) //Wait for DS18B20 response existence pulse
{
DelayUs(1);
cnt++;
}
もし(cnt>=200)return 1; //error

cnt=0;
その間((!DS18B20_IN)&&cnt<240) //wait for DS18B20 to release the bus
{
DelayUs(1);
cnt++;
}
もし(cnt>=240)return 1; //error
return 0;
}

/*
関数: Write a byte
First learn how to write a bit.
*/
void DS18B20_WriteByte(u8 cmd)
{
u8 i;
DS18B20_OUTPUT_MODE(); //Initialize to output mode
のために(i=0;私<8;I ++)
{
DS18B20_OUT=0; //Generate write time gap (write start)
DelayUs(2);
DS18B20_OUT=cmd&0x01; //Send actual data bit
DelayUs(60); //Wait for write completion
DS18B20_OUT=1; //Release the bus and prepare for the next transmission
cmd>>= 1; //Continue to send the next bit of data
}
}

/*
関数: Read a byte
First learn how to read a bit.
*/
u8 DS18B20_ReadByte(空所)
{
u8 i,data=0;
のために(i=0;私<8;I ++)
{
DS18B20_OUTPUT_MODE(); //Initialize to output mode
DS18B20_OUT=0; //読み取りタイムギャップを生成します (スタートを読んでください)
DelayUs(2);
DS18B20_OUT=1; //Release bus
DS18B20_INPUT_MODE(); //Initialize to input mode
DelayUs(8); //DS18B20データ出力を待ちます
データ>>= 1; //高いビットで埋めます 0, デフォルトはです 0
もし(DS18B20_IN) データ|= 0x80;
DelayUs(60);
DS18B20_OUT=1; //Release bus, 次のデータを読むのを待ちます
}
データを返します;
}

/*
関数: DS18b20の温度データを1回読み取ります
返品値: 温度データが読み取られます
考慮された状況: バスに接続されたDS18B20は1つだけです
*/
U16 DS18B20_READTEMP(空所)
{
U16 Temp = 0;
U8 TEMP_H,temp_l;
DS18B20_CHECKDEVICE(); //リセットパルスを送信します, パルスを検出します
DS18B20_WRITEBYTE(0XCC); //ROMシーケンス検出をスキップします
DS18B20_WRITEBYTE(0x44); //温度変換を開始します

//温度変換が完了するのを待ちます
その間(DS18B20_ReadByte()!= 0xff){}

DS18B20_CHECKDEVICE(); //リセットパルスを送信します, パルスを検出します
DS18B20_WRITEBYTE(0XCC); //ROMシーケンス検出をスキップします
DS18B20_WRITEBYTE(0xbe); //温度を読み取ります

temp_l = ds18b20_readbyte(); //低温データを読んでください
temp_h = ds18b20_readbyte(); //高温データを読んでください
temp = temp_l|(temp_h<<8); //合成温度
一時を返します;
}

3.2 DS18B20.H

#IFNDEF DS18B20_H
#DS18B20_Hを定義します
#含む “STM32F10X.H”
#含む “sys.h”
#含む “delay.h”
#含む “DS18B20.H”
#含む “USART.H”

/*パッケージインターフェイス*/

//DS18b20を入力モードに初期化します
#DS18B20_INPUT_MODEを定義します() {gpiob->CRH&= 0x0fffffff;gpiob->CRH|= 0x80000000;}

//DS18b20を初期化して出力モードにします
#DS18b20_output_modeを定義します(){gpiob->CRH&= 0x0fffffff;gpiob->CRH|= 0x30000000;}

//DS18B20 IOポート出力
#DS18b20_out pboutを定義します(15)

//DS18B20 IOポート入力
#DS18B20_IN PBINを定義します(15)

//関数宣言
u8 DS18B20_CleckAck(空所);
U8 DS18B20_CHECKDEVICE(空所);
void ds18b20_init(空所);
U16 DS18B20_READTEMP(空所);
u8 DS18B20_ReadByte(空所);
void DS18B20_WriteByte(u8 cmd);
#endif

poybagdxcawkkmaaaak8rns4s030.png
3.3 遅延機能

/*
関数: 私たちの遅延
*/
遅延が無効(int us)
{
#ifdef _systick_irq_
int i,j;
のために(i=0;ival = 0; //CNTカウンター値
systick->LOAD = 9*US; //9 1usを意味します
systick->Ctrl|= 1<<0; //タイマーを開始します
する
{
TMP = systick->Ctrl; //ステータスを読み取ります
}その間((!(TMP&1<<16))&&(TMP&1<<0));
systick->Val = 0; //CNTカウンター値
systick->Ctrl&=〜(1<<0); //タイマーをオフにします
#endif
};I ++)>

3.4 Main.CはDS18B20に電話して温度を読み取り、シリアルポートに印刷します

#含む “STM32F10X.H”

#含む “DS18B20.H”

U8 DS18B20_ROM[8]; //DS18B20の64ビットROMコードを保存します

int main(空所)
{
U16温度;
USARTX_INIT(USART1,72,115200);//シリアルポートの初期化 1
DS18b20_init(); //DS18B20初期化

/*1. DS18B20の64ビットROMコードを読む
//リセットパルスを送信します, 存在パルスを検出します
その間(DS18B20_CHECKDEVICE())
{
printf(“DS18B20デバイスは存在しません!\n”);
遅延(500);
}
//コマンドを送信して、64ビットROMコードを読み取ります
DS18B20_WRITEBYTE(0x33);

//ループ64ビットROMコードを読み取ります
のために(i=0;私<8;I ++)
{
DS18B20_ROM[私]= ds18b20_readbyte();
printf(“DS18B20_ROM[%d]= 0x%x n”,私,DS18B20_ROM[私]);
}

その間(1)
{
/*2. 同時にバスですべてのDS18B20を操作して温度の変換を開始します*/
DS18B20_CHECKDEVICE(); //リセットパルスを送信します, パルスを検出します
DS18B20_WRITEBYTE(0XCC); //ROMシーケンス検出をスキップします
DS18B20_WRITEBYTE(0x44); //温度変換を開始します (バス上のすべてのDS18b20を温度を変換させます)
遅延(500); //ライン上のすべてのDS18b20温度変換が完了するのを待ちます

/*3. 各ds18b20*の温度の単一の標的読み取り値*/
DS18B20_CHECKDEVICE(); //リセットパルスを送信します, パルスを検出します
DS18B20_WRITEBYTE(0x55); //ROMに合わせてコマンドを送信します
のために(i=0;私<8;I ++) //64ビットコードを送信します
{
DS18B20_WRITEBYTE(DS18B20_ROM[私]);
}
DS18B20_WRITEBYTE(0xbe); //温度を読み取ります
temp = ds18b20_readbyte(); //低次の温度データをお読みください
温度|= ds18b20_readbyte()<<8; //高次の温度データを読んでください
printf(“temp1 =%d。%d n”,温度>>4,温度&0XF);
printf(“temp2 =%f n”,TEMP*0.0625);

遅延(500);
}
}