前回からだいぶ間が空きましたが、パルス入力を使った、周波数測定を行ってみました。
タイマーJは、パルス出力と入力の機能があり、パルス幅測定、周期測定、パルスカウント
など沢山の機能があります。
今回は、周期測定機能を使って、周波数測定をしてみました。
サンプルなので、プログラムをあまり複雑にしない為、「単機能」で実装してありますが、
実用的な物にするには、カウンターがオーバーフローした場合にマスタークロックを切り
替えるとか、周波数が高い場合に、単位時間辺りのパルス数計測に切り替えるなどの工夫
を行う必要があると思います。
サンプルでは、シリアル接続したターミナルに、計測した結果を1秒毎に表示します。
ルネサス系では、タイマーJの構成で、良く出来ていると思うのは、割り込みを使わなく
ても、レジスターの状態が保持される為、簡単に厳密な計測が行えます。
このような、細かい点に配慮したハードウェアーの構成は、日本メーカーのマイコンな
らではと思います。
基本的な機能実装は、「common/trj_io.hpp」に集約させていますが、設定が複雑なので、
場合によっては、「trj_io」クラスの機能だけでは不足している場合もあると思います。
又、割り込みを使う場合は、パルス出力と入力で、登録する割り込み関数が違うので、
注意が必要です。
//-----------------------------------------------------------------// /*! @brief パルス計測の開始(TRJIO 端子から、パルスを入力)@n ※VCOUT1 端子から入力する場合は、TRJIOSEL を設定する。 @param[in] measur パルス計測のモード @param[in] s クロック選択(measur::countの場合は無効) @param[in] ir_lvl 割り込みレベル(0の場合割り込みを使用しない) */ //-----------------------------------------------------------------// void pluse_inp(measurement measur, source s, uint8_t ir_lvl = 0) const;
「measurement」型として、
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// /*! @brief パルス計測モード */ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// enum class measurement : uint8_t { low_width, ///< Low レベル幅測定 high_width, ///< High レベル幅測定 count, ///< パルス数測定 freq, ///< 周期測定 };
4つの測定モードがあります。
クロック選択では、
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// /*! @brief カウンターソース */ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// enum class source : uint8_t { f1 = 0, ///< F_CLK f2 = 3, ///< F_CLK / 2 f8 = 1, ///< F_CLK / 8 fHOCO = 2 ///< fHOCO(高速オンチップオシレーター) };
4つの中から選択が出来ます。
詳しい使い方は、「PLUSE_INP_test」を参照して下さい。