デジタルTSic温度センサー:アドレス、パスワード、外観

さまざまなセンサーと敏感な要素の使用の特徴に関する一連の資料を続けています。



今日の記事の主人公は、一見したところ、特別なものではありません。デジタル温度センサーの数はわかりません。 ただし、TSicシリーズには、非常に高い精度(古いモデルでは最大±0.07°C)とあまり知られていないZACwire単線インターフェースという2つの異常な特性があります。



ネコの下で、標準のTSicセンサーとカスタムソリューションの命名法を詳細に説明し、通信プロトコルの機能を理解し、MKのプログラムの例を参照します。 一言で言えば、我々は尊敬する読者にTSicセンサーにはお金の価値があると確信させるためにあらゆることをしている。



TSicは一連のデジタル温度センサーで、過去にはZMDIブランドで製造されていましたが、現在はスイスのIST AGに属しています。



センサーの敏感な要素は、温度比例出力を備えた高精度の基準電圧源です(PTAT(絶対温度に比例)のバンドギャップ基準。TSicは、他の内蔵温度センサーと同様に、ADC、信号処理回路、キャリブレーションデータ付きEEPROMおよび出力インターフェース。



標準的なTSicセンサーモデルは、動作温度範囲、精度、出力信号の種類、およびハウジングが異なります。







動作温度範囲と精度


TSic 20xおよびTSic 30xセンサーの動作温度範囲は-50〜+ 150°Cで、3つの「精度ゾーン」があります。 グラフは、さまざまな温度範囲でのセンサーの最大誤差を示しています。







TSic 50xセンサーは、-10〜+ 60°Cの狭い温度範囲向けに設計されています。 40度幅の精密セクションでは、TSic 50xセンサーは±0.1°Cの精度を提供し、その他の範囲では±0.2°Cの精度を提供します。







最も高価な高精度TSicセンサーはTSic 716です。狭い20度のセクションでは、この要素は±0.07°Cを提供します。







TSic 716センサーの違いは、より高い解像度(解像度)でもあります。 TSic 206、TSic 306、およびTSic 506センサーに11ビットADCがある場合、TSic 716には14ビットコンバーターがあります。

したがって、TSic 206およびTSic 306センサーの解像度は  frac50+150[°C]2110.1[°C]

TSic 506の解像度は  frac10+50[°C]2110.034[°C]

TSic 716解像度は  frac10+50[°C]2140.004[°C]



カスタムキャリブレーション



TSicセンサーの標準バージョンについては上記で説明していますが、エレメントの生産中に、TSicセンサーの精度を高める範囲を「シフト」できます。 たとえば、TSic 50xセンサーは、-10〜30°Cまたは13〜53°Cの範囲で精度が向上した要求に応じて利用可能です。 他のTSicモデルについても同様です。







本体


TSicシリーズのセンサーはSOP-8およびTO92パッケージで入手でき、ピン配列はドキュメントで入手できます







さらに、あらゆる種類のケーブル、コネクタ、パッドなどを備えた非標準のケースでTSicセンサーを提供することが可能です。 ここではすべて個別に説明しますが、すぐにこの機能を使用するために、年間数百のセンサー用のプロジェクトを用意する必要はまったくないと言います。







センサー接続


TSicモデルを接続するには、電源とグランドの接続、および1本の信号線が必要です。







センサーの動作電圧は3〜5.5Vです。 多くの場合、GPIOコントローラーの1つからセンサーに電力を供給する方が便利です。 第一に、これにより、測定サイクルの外でセンサーのエネルギー消費をゼロに減らすことができます。第二に、デジタル出力のTSicセンサーを使用すると、パッケージの開始を検出しやすくなります。



コントローラーのフットからセンサーに電力を供給する場合、製造業者は、ノイズの影響を除去し、電力線にRCチェーンを追加することをお勧めします。



出力信号


TSic 20x、TSic 30x、およびTSic 50xセンサーには、アナログ、レシオメトリック、またはデジタル出力があります。 最初のケースでは、出力電圧は媒体の温度に比例して0〜1 Vに変化し、2番目のケースでは、供給電圧の10〜90%に変化します。 デジタル出力を備えたセンサーはZACWireプロトコルを使用します。これについては、後で詳しく説明します。



3つの場合すべてで、出力信号は温度に比例します。 単純な式を使用して温度を計算します。



アナログ出力を備えたTSicセンサーの場合:





T=VoutThTl+Tl







レシオメトリック出力を備えたTSicセンサーの場合:





T= frac fracVoutV+0.10.8ThTl+Tl







デジタル出力を備えたTSicセンサーの場合:





T= fracDS211ThTl+Tl





または





T= fracDS214ThTl+Tl







どこで





TSicセンサーの出力での信号の例を表に示します。

TSic 20x / TSic 30xセンサーの場合
測定温度、°C アナログ出力 レシオメトリック出力 デジタル出力
-50 0.000V 10%V +

(V + = 5Vで0.5V)
0x000
-10 0.200V 26%V +

(V + = 5Vで1.3V)
0x199
0 0.250V 30%V +

(V + = 5Vで1.5V)
0x200
+25 0.375V 40%V +

(V + = 5Vで2.0V)
0x2FF
+60 0.550V 54%V +

(V + = 5Vで2.7V)
0x465
+125 0.875V 80%V +

(V + = 5Vで4.0V)
0x6FE
+150 1.000V 90%V +

(V + = 5Vで4.5V)
0x7FF
TSic 50xF / TSic 716センサー用
11ビット

(TSic 506F)
14ビット

(TSic 716)
-10 0.000V 10%V +

(V + = 5Vで0.5V)
0x000 0x0000
0 0.143V 21.4%V +

(V + = 5Vで1.07V)
0x124 0x0924
+25 0.500V 50%V +

(V + = 5Vで2.5V)
0x3FF 0x01FF
+60 1.000V 90%V +

(V + = 5Vで4.5V)
0x7FF 0x3FFF


ただし、ほとんどの場合、彼らはデジタル出力のセンサーを選択します。これにより、測定精度に対するアナログ信号処理回路の影響について考える必要がなくなります。 同時に、TSicデジタルセンサーは、アナログセンサーと同じ数のMKレッグを使用し、さらにわずかに安価です。



デジタル出力を備えたTSicセンサーの明らかなマイナス点は、非標準のインターフェイスであり、MKにはまだ既製のライブラリがありません。 明らかなプラス-このインターフェイスは非常にシンプルです。



ZACWireプロトコル


ZACWireは、マンチェスターを連想させるエンコーディングを使用する単線プロトコルです。



所定の周波数のセンサーが温度データを送信します-2つの8ビットデータパケット。 各パケットは、スタートビットで始まり、パリティビットで終わります。 センサーモデルに応じて、各区画には11ビットまたは14ビットの有効ビットがあり、最上位ビットが最初になります。







データラインのパッシブ状態は高レベルです。 TSic送信の各ビットは、信号の減衰から始まり、125マイクロ秒かかります。 データラインのステータスはこのインターバルの途中で固定されます-ラインへの信号ドロップから62.5μs後に高レベルがある場合、論理「1」、低であれば論理「0」を書き込みます。 最初の場合の充填率は75%、2番目の場合-25%です。







ZACWire通信インターフェイスは個別のクロック信号を使用しないため、クロックはマイクロコントローラーの側でカウントされます。



開始ビットも信号の低下から始まりますが、デューティサイクルは50%です。 開始ビットは、送信の開始を検出するためと、前もってわかっていない場合はビートの持続時間を測定するための両方に使用できます。フォールオフと開始ビットのエッジの間の期間はT ストローブ -次のビットを読み取るときにラインの状態を確認する必要がある時間です



一方、標準のTSicセンサーの場合、T ストロボ値は事前にわかっています

125/2 = 62.5μsに等しいため、実際にはスタートビットが検出されて渡されます。







パリティビットは、データビットと同じ方法でデコードされます。 外部干渉がなく、接続長が短い(最大2メートル)場合、通常、整合性の監視は必要ありません。 最初のパケットの終わりと2番目の開始ビットの間で、回線に高レベルが設定されます。



最終的に明確にするために、TSic 306センサーデータパケットの波形を検討します。







送信は開始ビットで始まり、常に「0」に等しい重要でないデータビットがあり、次に「011」、次に「0」に等しいパリティビットがあります。 2番目のパケットは1周期後に開始し(T ストローブ * 2)、開始ビット、8つの最下位データビット「00011000」、および「0」に等しいパリティビットを含みます。







その結果、出力01100011000bin = 792decで取得し、上記の式に従って温度値を計算します。



T= fracDS211ThTl+Tl= frac79221115050+50=27.3°C



TSicセンサーがそのようなデータパッケージを送信する頻度について話す場合、コンポーネントの生産中にインストールされ、センサーの使用中に変更することはできません。 モデルTSic 206、TSic 306、TSic 506の場合、周波数は10 Hzで、TSic 716の場合は1 Hzです。 非標準の測定周波数-250、10、1、0.1 Hzのセンサーは、ご要望に応じてご利用いただけます。



タスクで可能な限り高い周波数でセンサーをポーリングする必要がなく、マイクロコントローラーに空き回線がある場合は、この回線を使用してセンサーに電力を供給するのが理にかなっています。 したがって、センサーからデータを取得する必要があるたびに、センサーに電力を供給し、データライン(最初のパケットの開始ビット)の低下を期待できます。 TSicに電源を投入してからパッケージを送信するまでに85マイクロ秒未満が経過し、2つのデータパケットを受信した後、センサーの電源をオフにすることができます。



これは、謙虚な使用人がセンサーを使用した方法です。



実験として、2つの標準モデルTSic 306 TO92およびTSic 506 TO92をEFM32ZG-STK3200デバッグボードに接続します。 ボタンを押すと、センサーが作動し、温度データを含む1つのパッケージが受信され、データが処理され、結果がボードに取り付けられたLCDディスプレイに表示され、その後センサーが電源から切断されます。



EFM32ZG-STK3200デバッグボードは、Silicon Labs(SiLabs)が製造しています。

EFM32 Zero Geckoマイクロコントローラーを使用するため。



EFM32 Zero Gecko-EFM32ファミリーの最年少シリーズ。 これらのマイクロコントローラーは、ARM Cortex-M0 +コアに基づいており、統合された周辺機器の標準セットと、コントローラーの消費電力を削減するさまざまな興味深いモジュールを備えています。 このプラットフォームの機能とEFM32 Zero Geckoのデバッグツールに関する詳細な記事を既にhabrで公開しています。


今日、エネルギー消費を制御および削減するために設計されたEFM32の特定のソフトウェアおよびハードウェアコンポーネントについては触れません。 代わりに、最も基本的なコンポーネントとその動作モードを使用するため、結果のアルゴリズムは、他のマイクロコントローラープラットフォーム移植するために、ゴッドレスSTMに簡単に転送できます。



だから、MKから必要





デバッグボードでは、それぞれ、









そのため、ボタンからの中断により、センサーに電源を供給し、パッケージを受け入れて電源をオフにします。 データの受信中にエラーが発生した場合は、対応するメッセージを発行します。それ以外の場合は、温度を摂氏で計算し、結果をLCDに表示します。



void ReceiveTempAndShowIt(void) { GPIO_PinOutSet(TSIC_VDD_PORT, TSIC_VDD_PIN); int8_t TSic_result = receiveTSicData(); GPIO_PinOutClear(TSIC_VDD_PORT, TSIC_VDD_PIN); if (TSic_result == TSIC_IS_OK) { float temperatureCelsius = calculateCelsius(fullTSicTransmission); Display_ShowTemperature(temperatureCelsius); } else if (TSic_result == TSIC_PARITY_ERROR) { Display_ShowParityError(); } else if (TSic_result == TSIC_TIMING_ERROR) { Display_ShowTimingError(); } }
      
      





重要!



ここで、この記事で検討したコードが完全に最適ではないことに注意してください。 つまり、絶対に完全に最適ではありません。 以下では、whileを使用して信号のエッジとエッジを検出する方法、割り込みを使用せずに時間間隔をカウントする方法などを確認できます。



このアプローチの理由は、特定のマイクロコントローラーに固有の機能がまったく使用されない最も単純で最も理解しやすい例を検討することです。


したがって、データ受信機能receiveTSicData()は、2つのデータパケットの受信、それぞれからのパリティビットの分離、および両方のパケットの整合性チェックです。



 int8_t receiveTSicData(void) { uint16_t firstTSicPacket = 0; uint16_t secondTSicPacket = 0; bool firstParityBit = 0; bool secondParityBit = 0; /* Time critical section [all interrupts disable]: * Receive two data packets from TSic sensor */ INT_Disable(); if (readTSicPacket(1) == PACKAGE_READING_OK) { firstTSicPacket = currentTSicPacket; } else { INT_Enable(); return TSIC_TIMING_ERROR; } if (readTSicPacket(0) == PACKAGE_READING_OK) { secondTSicPacket = currentTSicPacket; } else { INT_Enable(); return TSIC_TIMING_ERROR; } INT_Enable(); /* Decode received packets */ /* Get parity bit from first packet */ firstParityBit = firstTSicPacket & 0x01; /* Get 3 data bits from first packet */ firstTSicPacket = firstTSicPacket & 0x0007; /* Delete first parity bit */ firstTSicPacket >>= 1; /* Get parity bit from second packet */ secondParityBit = secondTSicPacket & 0x01; /* Delete second parity bit */ secondTSicPacket >>= 1; /* Check parity errors and assemble full temperature transmission from TSic */ if (checkParity(firstTSicPacket, firstParityBit) == PARITY_OK && checkParity(secondTSicPacket, secondParityBit) == PARITY_OK) { fullTSicTransmission = (firstTSicPacket << 8) + secondTSicPacket; return TSIC_IS_OK; } else { return TSIC_PARITY_ERROR; } }
      
      





currentTSicPacketを返すreadTSicPacket()関数は次のようになります。



 int8_t readTSicPacket(bool isTheFirstPacket) { currentTSicPacket = 0; /* Wait until start bit occurs, return error if it takes too long */ if (isTheFirstPacket) { /* If we are waiting after powering up the sensor */ myTIMER_Start(PRESCALER_1024); while (TSIC_DATA_HIGH) { if (TIMER_COUNTER >= WAITING90MS_TICKS) { return NO_SIGNAL_OCCURS; } } myTIMER_Stop(); } else { /* If we are waiting just for time between first and second packet */ myTIMER_Start(NO_PRESCALER); while (TSIC_DATA_HIGH) { if (TIMER_COUNTER >= TSTROBE_TICKS * 4) { return NO_SECOND_PACKAGE; } } myTIMER_Stop(); } /* Check if start bit has occurred: * * As Tstrobe = 125 us / 2 = 62.5 us, we need to check if the signal is * low for about Tstrobe time and then goes high for about Tstrobe time. */ myTIMER_Start(NO_PRESCALER); while (TSIC_DATA_LOW) { if (TIMER_COUNTER >= TSTROBE_TICKS * 1,1) { return START_BIT_ERROR; } } while (TSIC_DATA_HIGH) { if (TIMER_COUNTER >= TSTROBE_TICKS * 2,2) { return START_BIT_ERROR; } } if (TIMER_COUNTER <= TSTROBE_TICKS * 1,8) { return START_BIT_ERROR; } myTIMER_Stop(); /* * Receive 8 data bits + 1 parity bit */ for (uint8_t i = 0; i <= 8; i++) { /* Wait for exact Tstrobe time to check the line state */ myTIMER_Start(NO_PRESCALER); while (TIMER_COUNTER < TSTROBE_TICKS) { } myTIMER_Stop(); /* Read bit */ currentTSicPacket <<= 1; if (TSIC_DATA_HIGH) { currentTSicPacket |= 1; } /* Wait until the end of one-bit-timeframe. */ if (TSIC_DATA_LOW) { myTIMER_Start(NO_PRESCALER); while (TSIC_DATA_LOW) { if (TIMER_COUNTER >= TSTROBE_TICKS * 0,6) { return PACKAGE_TIMING_ERROR; } } myTIMER_Stop(); } /* Last bit (parity bit) doesn't end up with falling edge so we should * wait for the next falling edge just for data bits. */ if (i != 8) { myTIMER_Start(NO_PRESCALER); while (TSIC_DATA_HIGH) { if (TIMER_COUNTER >= TSTROBE_TICKS * 1,1) { return PACKAGE_TIMING_ERROR; } } myTIMER_Stop(); } } return PACKAGE_READING_OK; }
      
      





マイクロコントローラー自体とタイマーの設定は、センサーに関する記事のテキストでそれらを使用するために使用されるプラットフォームに大きく依存します。



整合性をチェックし、温度を摂氏で計算する機能も、目立ったものではありません。



TSicパッケージ整合性チェッカー
 int8_t checkParity(uint16_t package, bool parity) { uint8_t parityCounter = 0; for (uint8_t i = 0; i <= 7; i++) { if (package & (1 << i)) { parityCounter++; } } if (parityCounter % 2 == parity) { return PARITY_OK; } else { return PARITY_ERROR; } }
      
      





TSic 206、TSic 306、TSic 506センサーの摂氏温度計算機能
 float calculateCelsius(uint16_t transmissionData) { /* TSic20x / 30x sensors: LT = -50, HT = 150, Digital output 11 bit */ //float celsius = ((float) transmissionData * 200 / 2047) - 50; /* TSic50x sensors: LT = -10, HT = 60, Digital output 11 bit */ float celsius = ((float) transmissionData * 70 / 2047) - 10; return celsius; }
      
      





コード全体はこちらから入手できます



参照資料






おわりに


結論として、私は伝統的に読者の注意に感謝し、Habréについて書いている製品の使用に関する質問は、私のプロフィールで指定されたメールアドレスにも送信できることを思い出させます。



All Articles