RX24TでA/D変換テスト

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では、別に定義する必要がある。

A/D 変換サンプル