サーミスタの温度計算テンプレートを実装してみた。
このような簡単なテンプレートクラスを書くのは、程よい難しさもあり、パズル的
要素があって意外に楽しい。
クラスのプロトタイプは以下のようになっている。
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief NTCTH テンプレートクラス
@param[in] ADNUM A/D 変換値の量子化最大値
@param[in] THM サーミスタの型
@param[in] REFR 分圧抵抗値
@param[in] thup サーミスタが VCC 側の場合「true」、GND 側の場合「false」
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
template <uint32_t ADNUM, thermistor THM, uint32_t REFR, bool thup>
class NTCTH {
使い方:
#include "chip/NTCTH.hpp" ・・・ // A/D: 12 bits, NT103, 分圧抵抗: 10K オーム、サーミスタ: VCC側 typedef chip::NTCTH<4095, chip::thermistor::HX103_3380, 10000, true> THERMISTOR; THERMISTOR thermistor_;
・「NTCTH.hpp」をインクルードする。
・テンプレートパラメーターを typedef しておく。
※A/D 変換の分解能(この場合は12ビット)
※NT103 型サーミスタ(B定数などの定義は、「NTCTH.hpp」にある)
※分圧抵抗の値(10000オーム)
※サーミスタが、VCC側か、GND側にあるのか定義
auto v = get_adc(6); // CH6
utils::format("温度: %5.2f [度]") % thermistor_(v);
クラスに、A/D変換値を入れて、呼ぶと温度が返ってくる。
※サーミスタの抵抗値が「0」になる場合は抵抗計算が成立しなくなるが、実際には、
そのようねケースは起こらないので、「良し」としとく。
テンプレート化している事で、不必要な比較的要素(サーミスタがVCC側かGND側)
かで別れる計算過程などがコンパイル時に決定されるので、条件分岐は無くなり、最適化
も十分行われる。
※対数計算があるので、数学ライブラリ「libm」をインクルードする必要がある。
※サーミスタは種類が多く特性が違うので、新たなサーミスタを使う場合は、テンプレー
トに定義を追加する必要がある。
・「thermistor」型の定義
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief サーミスタ型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class thermistor {
NT103_34G, ///< THB:3435, TR25:10K
NT103_41G, ///< THB:4126, TR25:10K
HX103_3380, ///< THB:3380, TR25:10K (25C to 50C)
};
・「パラメーターの取得関数」
static void get_para_(float& THB, float& TR25)
{
switch(THM) {
case thermistor::NT103_34G:
THB = 3435.0f; ///< サーミスタB定数
TR25 = 10e3; ///< R25 サーミスタ25℃基準抵抗値
break;
case thermistor::NT103_41G:
THB = 4126.0f; ///< サーミスタB定数
TR25 = 10e3; ///< R25 サーミスタ25℃基準抵抗値
break;
case thermistor::HX103_3380:
THB = 3380.0f; ///< サーミスタB定数
TR25 = 10e3; ///< R25 サーミスタ25℃基準抵抗値
break;
default:
break;
}
-----
100円マイコン、R8Cでも、問題なく動作した。
・NTCサーミスタ(NCP18XH103F03RB)

※将来的にR8Cで温度制御に使う予定。
サーミスタの温度表示サンプル、R8Cでのバイナリーサイズ:
※log 計算や float の計算が含まれるので、確認
m32c-elf-size thm_sample.elf text data bss dec hex filename 24580 296 76 24952 6178 thm_sample.elf
R8C/M120AN でのバイナリーサイズ