PIC三昧(19) TEMP、チップの温度をADCで測定、PIC16F18855

Joseph Halfmoon

今回はオンチップの温度を測るTEMPERATURE INDICATOR MODULEです。偉そうなお名前ですが、やっていることは温度依存性がある筈のダイオードの電圧ドロップをADCで測っているだけです。単純明快、な割には制御はフェイント。独立したモジュールというより、2つのモジュールに「間借り」している雰囲気。

※『PIC三昧』PIC関係の記事総目次はこちら

※作業はMicroChip社の統合開発環境 MPLAB X IDEと、その上で走るコンフィギュレーションツールMCC Classic を使用して行っています。ターゲット・マイコンはPIC16F18855です。

TEMPERATURE INDICATOR MODULE

MODULEとは言うものの、電源とGND間に電流源とともにシリアル接続されたダイオードの電圧降下を、ADCモジュールの1入力を借りて測るだけの「モジュール」です。以下TEMPと略称します。チップ上に形成されたダイオードであるので、あくまでチップの温度を測るための仕組みです。

ADC側でTEMPに接続のチャネルを選択して値を読み取れば良いのかと思ったのですが、それだけでは動きませぬ。この回路のON/OFFそして、ダイオードを何段かませるのかの選択がFVRモジュール側に存在するからです。よってFVRとADCと両方を操作することになり、TEMPユニークな設定などはありません。

なおシリアル接続のダイオードは4個か2個か選択可能です。電源電圧が高いとき(3.6V以上)は4個、低いときは2個使え、ということであります。

PIC16F18855の場合、ADCは10ビットであるので、0から1027までの値のどこかが読み取れることになってます。ただしビックリするような値は読み取れません。僅かな範囲です。個別デバイスの特性のバラツキをキャリブレーションかけてやればそれなりに精密な測定もできるみたいですが、今回、キャリブレーションなどはメンドイのでパスです。なお、このモジュールにはMicroChip社の以下のアプリケーションノートが存在します。それを見ればキャリブレーションも思いのまま。知らんけど。

AN1333, “Use and Calibration of the Internal Temperature Indicator” (DS01333)

以下のテーブルは「標準的なデバイス」の特性を示す定数を代入して計算してみたものです。ADCresultTable_STD

ま、フツーに使用する条件下であれば、だいたい600から700くらいの値が読める筈。

MCC Classicでの設定

ADCだけでなくFVRもリソース追加しています。PROJECT_RESOURCES

まずはFVR側の設定です。緑色のところを設定しないと計測できませぬ(最初、設定忘れて何故?となりました。)なお、自動生成される初期化ルーチン内で初期化されます。その後、電気を食わないようにOFFることがなければソフトウエアで制御する必要はありません。FVR

ADCの設定は以下です。緑色のところのInternal Channelの一つにTempが見えるかと思います。ADCC

ここでは特に何も設定しておりません。ADCの読み取りをするときに channel_Tempを読め、と指令するだけでTempの電圧が読み取れます(初期化は自動生成の関数内でやられているので気にせんでよい。)

いつのもように、Printfを標準出力のEUSARTに向けてあるのでEUSARTもリソースに含まれてます。こんな感じ。EUSART

上記のシリアルといつものLチカを含めているのでPin Manegerの設定はこんな感じ。pinMGR

今回実験に使用したソースコード

いつものように手抜きなコードが以下に。main()関数とその直前においた計測用の関数です。

adc_result_t readTEMP()
{
    ADCC_Initialize();   
    ADCC_StartConversion(channel_Temp);
    while(!ADCC_IsConversionDone());
    return ADCC_GetConversionResult();
}

void main(void)
{
    SYSTEM_Initialize();
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    while (1)
    {
        RA0 = 1;
        __delay_ms(1000);
        printf("TEMP CRC=%d\n", readTEMP());
        RA0 = 0;
        __delay_ms(1000);
    }
}
実機動作結果

温度を変えないと何を測っているのか分からないので、まずは「保冷剤」をチップの上に載せてみました。微妙に接触悪くてチップは冷え切らないようす。LowTempResult

それではということで、実験用の小さいドライヤを持ち出して熱風一発。ぐんぐんと数字が上がっていくのが分かりますかな?HotResult

まあ、温度をセンスしているらしいことは分かった。キャリブレーションはしてないケド。

PIC三昧(18) CRC、データ配列のCRC8をハードで計算、PIC16F18855 へ戻る

PIC三昧(20) CLKREF、参照クロックの外部出力、PIC16F18855 へ進む