サーミスタの温度計算テンプレートを実装してみた。
このような簡単なテンプレートクラスを書くのは、程よい難しさもあり、パズル的
要素があって意外に楽しい。
クラスのプロトタイプは以下のようになっている。
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// /*! @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 でのバイナリーサイズ