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 変換サンプル