これは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を比較するだけでもいいです
しっかし ソースコードに全角文字って気持ち悪いね
「全角使える環境ならヘタに変数名考えるより漢字割り当てたほうが楽」
ってことで試してみたけど