2012年10月31日水曜日

MAX31855Kの計算

MAXIM製の熱電対IC MAX31855K というICがあります

これはK熱電対の温度を計算してデジタル値で取り出せるというIC
冷接点の計算もおおよそやってくれるので
楽に扱うことができます
I/FはSPIっぽい物(一方通行のSPI)なので
SPIモジュールがあるならそれを使えるし
ない場合でもGPIOを操作するだけでいいので簡単です

ICとしては特にクセは無いようなので
ハードウェアの詳細は省略します
とりあえずCSを立ち下げてクロックを32個送りながら読み取って最後にCS立ち上げれば大丈夫です

スイッチサイエンスやストロベリーリナックスで買うことができますが
スイッチサイエンスで僕が買ったものは良い感じに動いてくれませんでした

ストロベリーリナックスで買った物は正常に動いたので

付属の熱電対の相性や微妙なパターンの違いが影響しているようです


さて、このICは固定小数点で出力されます
なので何らかの方法で計算する必要があります
って別にヘンなフォーマットなわけではないのでどうということも無いですが

とりあえず僕が使ったテストコードを置いておきます
VC++2010で作りました
全角文字使ってるので多くの場合は書き換えが必要です


#include <stdio.h>

int MAX31855K_calc(unsigned int 出力値, double *熱電対, double *冷接点) {
    unsigned int 熱電対値 = (出力値 >> 18) & 0x3FFF;
    unsigned int 冷接点値 = (出力値 >>  4) &  0xFFF;
   
    if (出力値 & 0x10000) { return(出力値 & 0x7); }

    if (熱電対値 & 0x2000)
    { *熱電対 = ((熱電対値 ^ 0x3FFF) + 1) * -0.25; }
    else { *熱電対 = 熱電対値 * 0.25; }

    if (冷接点値 &  0x800)
    { *冷接点 = ((冷接点値 ^  0xFFF) + 1) * -0.0625; }
    else { *冷接点 = 冷接点値 * 0.0625; }

    return(0);
}

int main(void) {
    unsigned int 出力値 = 0xFEA4E670; // ICから読み取った32bitデータ
    double 熱電対 = 0, 冷接点 = 0;
    int s;

    s = MAX31855K_calc(出力値, &熱電対, &冷接点);

    printf("%d:%.2f/%.5f\n", s, 熱電対, 冷接点);

    return(0);
}



ビットシフトやXOR等を使っています
出力に浮動小数点を使ってるので
それなりの環境じゃないと満足な結果は得られません

動作としては
まずFaultBitを確認して エラーが発生していればデータ下位3ビットを返します
障害がなければ熱電対と冷接点の温度を取り出し
符号を確認して必要ならビット反転等を処理してから
適切な値を掛けてポインタで指示された変数に結果を入れます
そして戻り値0で戻るだけ

もしも戻り値が0位外ならばその旨を表示するべきです
戻り値&0b001 != 0なら熱電対を検出できていない
戻り値&0b010 != 0なら熱電対がGNDに短絡している
戻り値&0b100 != 0なら熱電対がVCCに短絡している
という感じになります

これは戻り値を見る必要はなく データの下位3bitを比較するだけでもいいです


しっかし ソースコードに全角文字って気持ち悪いね
「全角使える環境ならヘタに変数名考えるより漢字割り当てたほうが楽」
ってことで試してみたけど


2012年10月17日水曜日

LIS331HHとL3G4200Dのアドレスマップ

STMicro製加速度センサのLIS331HHと
STMicro製角速度センサのL3G4200Dのアドレスマップです

両方共スイッチサイエンスで買うことができます

範囲が広いので様々な用途に使えそうなセンサ


アドレスマップ メモっときます