RX24Tは、モーター制御がターゲットだからか、A/D変換関係が、もの
凄く充実した(細かい)造りになっている。
変換時間は1マイクロ秒で、12ビットの精度があり、5チャンネルが2ユニ
ット、12チャネルが1ユニット、計22チャンネルと豪華で、付随する機能
も豊富で複雑だ。
流石、インバーター制御用なので、サンプルホールド回路が複数あったり、
ゲインを制御する機構があったり、モーター制御に必要な機構を網羅している
ようではある。
変換結果を受け取るレジスターも、個別になっているので、変換したいチャネ
ルを選んで、変換を開始するだけで、マネージメントも簡単で、処理負荷も少
なくてすむ。
とりあえず、単に変換するだけの機能を実装してテストしてみた。
他の変換モードは、必要になったら、適宜追加していくようにしたい。
ただ、テンプレートの定義は、複雑だったので、それなりに苦労した。
なるべく、3つのモジュールを同じように扱う事が出来るように工夫した。
チャネルの扱いをどのように扱うか、色々悩んだが、結局、各モジュールの定
義内に、「enum class」を使って、チャネル定義を行った。
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// /*! @brief S12AD1 定義 @param[in] base ベース・アドレス @param[in] t ペリフェラル型 */ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// template <uint32_t base, peripheral t> struct s12ad1_t : public s12ad_t{ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// /*! @brief アナログ入力型 */ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// enum class analog : uint8_t { AIN100, AIN101, AIN102, AIN103, AIN116 = 0x10, }; . . . }; typedef s12ad1_t<0x00089200, peripheral::S12AD1> S12AD1;
ユニット0、1は、チャネル5本で、5番目は、16番から開始する為、定数を16
としている、この値を使ってレジスターアクセスのオフセットとしている。
※ただ、こうすると、ループを回して、設定するような事が出来なくなるのが、痛い
が、アナログチャネルは、通常全て同一に使う事は少ないので、「良し」とする。
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// /*! @brief S12AD2 定義 @param[in] base ベース・アドレス @param[in] t ペリフェラル型 */ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// template <uint32_t base, peripheral t> struct s12ad2_t : public s12ad_t{ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// /*! @brief アナログ入力型 */ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// enum class analog : uint8_t { AIN200, AIN201, AIN202, AIN203, AIN204, AIN205, AIN206, AIN207, AIN208, AIN209, AIN210, AIN211, }; . . . }; typedef s12ad2_t<0x00089400, peripheral::S12AD2> S12AD2;
変換時間は1マイクロ秒と短い時間ではあるけど、80MHzのCPUの場合
では、変換開始から変換終了を待つのでは、十分な実装とは言えないので、割
り込み処理は実装してあり、変換終了時に、何かタスクを実行できるような仕
様としてあるが、どこまで実用的かは多少疑問が残る。
結局、リアルタイムカーネルのようなマルチタスクシステムにしないと真価を
発揮出来ないかもしれない。
RX24TのA/Dユニットの構成は、他のRXマイコンと比較して、汎用的
では無いため、変換操作を行う具体的なクラス「adc_io」は個別に定義した。
RX64Mや、RX63Tでは、別に定義する必要がある。