トップページ >
dsPIC入門 >
dsPICでAD変換(3)
AD変換の初期設定
AD変換モジュールは、いろいろ大変…?
前回の簡単なソースコードにおいても、初期設定は煩雑な感じがしました。AD変換モジュールについては、
UARTと同様に多機能な分だけ理解しておくべきポイントが増えてしまいます…。
本家であるMicrochip社が配布しているデータシートでは、AD変換機の説明のために10ページも使われています。
しかし、ムズカシイとは言っても少しずつ噛み砕いていけばきっと分かる(はず)なので、ちょっと
頑張ってみることにします。完全にわからなくても、既に動作確認済みのコンフィグをコピペして
使えば良いので電子工作には支障ないと思いますが。。。
内容としては本家データシートの単なる和訳に過ぎないかもしれませんが、
備忘録としては役に立つと思います…(汗)
ここでは、dsPICにおけるAD変換回路の中で最重要なポイントに絞って見ていくことにします。
また、デバイスはdsPIC30Fファミリに限定することにします。特に、今回使用している
dsPIC30F4012に関する内容となりますので、了承ください…。
AD変換モジュールの内部構成
OpenADC10()関数
void OpenADC10(config1,config2,config3,configPort,configScan)
AD変換を使うために、初期設定をする関数です。引数が5個と、たくさんあります。
この1つ1つの引数に、タイマーやUARTの時と同じ用にCコンパイラ側で用意されたマクロを
入れていく形となります。なお、前回のサンプルコードのように最初に変数を宣言してやる場合は、
マクロを入れる変数はunsigned int型となります。
config1 : AD変換の基本設定
AD変換モジュールのON・OFF
- ADC_MODULE_ON : AD変換モジュールON
- ADC_MODULE_OFF : AD変換モジュールOFF
アイドルモードにおける動作
- ADC_IDLE_CONTINUE : 継続動作
- ADC_IDLE_STOP : 動作停止
出力データ形式
「10ビットAD変換モジュール」という名前からして、AD変換の精度は10ビットです。
ただし、これを読みだす場合は16ビットデータとして扱われているようです。以下の図参照ですが、
単にビット・シフトしたり符号ビットを複数並べてみたり…とデータ量そのものは変化していません。
厳密に値を計測するプログラム中では、注意が必要だと思います。
- ADC_FORMAT_SIGN_INTG : 符号あり整数
- ADC_FORMAT_INTG : 符号なし整数
- ADC_FORMAT_SIGN_FRACT : 符号あり小数
- ADC_FORMAT_FRACT : 符号なし小数
変換開始のタイミング設定
「変換開始」というのは、ハードウェアがAD変換をする・しないを決定するパラメータで
あって、その値をデータ用変数内に確保(変数領域のレジスタへ移動)するかどうかは
別の話です。最速のAD変換を実現するのは、以下のADC_CLK_AUTOを指定して常に
ハードウェアがAD変換を繰り返す状態にしておき、必要な時にAD変換出力を
変数へ保存する…という方法だそうです。
- ADC_CLK_AUTO : AD変換モジュール内のクロックに合わせて常に自動で開始
- ADC_CLK_TMR : タイマー3からの割り込みで開始
- ADC_CLK_INT0 : 外部割り込みピンからのハードウェア的割り込みで開始
- ADC_CLK_MPWM : PWMモジュールからの割り込みで開始
- ADC_CLK_MANUAL : ソフトウェア内で指定して開始
データサンプリングの設定
AD変換モジュールの信号処理の流れは、「データを入力ピンから取得(サンプリング)」→「AD変換実行」…となっています。
このサンプリングを自動で行うか、手動で行うかの設定パラメーターがこれです。ただし、
データを手動でサンプルする場合は「AD変換モジュール制御レジスタ」の特定のビット(SAMPビット)を“1”に
して行うのですが、レジスタをビット単位でいじるのはC言語ではなくアセンブラの仕事のように思われます。
C言語用の関数も用意されていないようですし、無理やりアクセスしようとしても不具合が生じているようです。
ここは、無難に“ADC_AUTO_SAMPLING_ON”を指定して自動でやってもらうのがお勧めです。
- ADC_AUTO_SAMPLING_ON : AD変換完了後、自動でサンプリング開始
- ADC_AUTO_SAMPLING_OFF : 手動でサンプリング開始
同時サンプリング設定
これは、AD変換モジュールの回路構成をある程度理解していたほうがイメージしやすい
パラメーターだと思われます。入力用サンプル&ホールド回路の使い方に関する設定です。
- ADC_SAMPLE_SIMULTANEOUS : 同時サンプリング
- ADC_SAMPLE_INDIVIDUAL : 個別サンプリング
サンプル手動制御
通常これはOFFに設定の上、自動サンプリングを有効にして使います…。
- ADC_SAMP_ON : 手動サンプル有効
- ADC_SAMP_OFF : 手動サンプル無効
config2 : AD変換の付加機能設定
config3 : AD変換の入力切り替え設定
configPort : AD変換の入力ポートに関する設定
configScan : スキャン方法に関する設定
SetChanADC10()関数
ConfigIntADC10()関数