dsPIC30Fモータ制御用シリーズに内蔵されている10ビットA/Dコンバータの使い方について
説明しています。
【内部構成】
10ビットA/Dコンバータの内部構成は下図のようになっています。
このモジュールの特徴は、A/D変換器そのものは1個なのですが、その前にある
サンプルホールドアンプが4個あるということです。
このサンプルホールドアンプにはコンデンサが内蔵されていて、外部からのアナログ
信号を短時間ですが一定時間保つことができます。
従って、同時に4つのアナログ入力をサンプリングして保持しておき、その後順番に
A/D変換して結果をバッファメモリに保存します。このとき、4回のA/D変換は自動的に
ハードウェアで高速実行され、バッファメモリへの格納も順番に4つの別のエリアに格納
されます。この4回のA/D変換が終了したとき、割り込みを発生させ、プログラムで
結果をバッファメモリから読み出すことになります。
こうして、全く時間的に同時のタイミングで最大4個のアナログ信号をA/D変換することが
可能となります。
ただし、チャネル0のサンプルホールドアンプの入力は、最大16個のどれでも選択
可能ですが、チャネル1,2,3のサンプルホールドアンプの入力は、それぞれ2種類
ずつに限定されていますので、接続の仕方を最初から考えておく必要があります。
さらに、チャネル0のサンプルホールドアンプは、特別に自動スキャン機能があり、
最大16個のアナログ入力を自動的に順番にA/D変換し、結果をバッファメモリに順番
に格納してから1回の割り込みを発生させることができます。
プログラムは割り込みごとにバッファメモリの16個のデータを一気に読み取ります。
これで、多くのアナログ信号の入力を高速で行うことが可能になります。
4つのサンプルホールドアンプの入力については、プラス側とマイナス側の差動入力を
それぞれ選択指定することができるようになっていて、2つのアナログ信号の差分を
A/D変換することもできます。
さらに、この切替マルチプレクサをMUXAとMUXBと2つ持っていて、交互に切り替え
ながら入力することができます。この切り替えは4チャネル全体が一括で切り替えら
れます。
【関連SFR】
上記のように10ビットA/Dコンバータは多様な動作モードを持っているため、設定制御用
のSFRもやや複雑な構成となっていて、下記の6個のSFRとなっています。
(1) ADCON1
A/Dコンバータのイネーブルと変換結果のデータフォーマット指定、サンプリング方法
などの設定を行います。
個別のアナログ入力を行う場合に、SAMPビットの制御でサンプリングの開始と変換の
開始を制御します。
(2) ADCON2
リファレンス電圧指定、使用チャネル指定、バッファの使い方、割り込みタイミング、
チャネル0のスキャン機能などの設定を行います。
(3) ADCON3
アクイジションタイムとA/Dコンバータのクロック設定を行います。
ここでA/Dコンバータの時間設定の仕方を説明します。まず、A/D変換用のクロックはTadで
表現します。 Tadは 最小値が 167nsec となっています。そしてA/D変換完了には
12Tadが必要です。従って最小変換時間は 167×12=2μsec つまり500kspsとなります。
システムクロックを選択した場合、例えばPLLで100MHzクロックでdsPICを動作させた場合、
Tcy=25MHz(40nsec)ということになりますから、ADCS<5:0>は8Tcy以上に設定する必要が
あります。
サンプリングのためのアクイジションタイムは、最短で、0.55μsec となっていますので、
サンプリング開始後、この時間以上待ってからA/D変換をスタートさせる必要があります。
(4) ADCHS
サンプルホールドアンプのMUXA、MUXBそれぞれの入力切替設定を行います。
この設定は全体が一括で切り替わります。
(5) ADPCFG
16個のピンをディジタルで使うかアナログ入力にするかの設定を行います。
この設定は単純でアナログ入力にするピンに対応するビットを0にするだけです。
(6) ADCSSL
チャネル0の自動スキャンに含める入力を指定します。この設定は単純で、含める
入力に相当するビットを1にするだけです。
(7)割り込み
SFRについては、以上の他に割り込みについては他と同じように3つのレジスタで設定
します。
【C言語での使い方】
マイクロチップ社のC30コンパイラでの使い方です。
C30コンパイラのPeripheral Librariesで用意されている10bit A/D Converterの
組み込み関数は下表のようになっています。
下記関数を使うためには、「adc10.h」をインクルードする必要があります。
またプロジェクトにデバイス用のライブラリファイル、例えば「libp30f4012.a」
というライブラリファイルをLIBに追加する必要があります。
関数名 書 式 機 能 OpenADC10() void OpenADC10(
unsigned int config1,
unsigned int config2,
unsigned int config3,
unsigned int configport,
unsigned int configscan);10ビットA/Dコンバータの動作モードを設定する
config1にはADCON1用のパラメータを含む
個々のパラメータを&で接続して使う
(1)ADCモジュールのOn/Off
ADC_MODULE_ON ADC_MODULE_OFF
(2)Idle Mode の動作
ADC_IDLE_CONTINUE
ADC_IDLE_STOP
(3)変換結果のデータ形式
ADC_FORMAT_SIGN_FRACT
ADC_FORMAT_FRACT
ADC_FORMAT_SIGN_INT
ADC_FORMAT_INTG
(4)変換開始トリガ指定
ADC_CLK_AUTO ADC_CLK_MPWM
ADC_CLK_TMR ADC_CLK_INT0
ADC_CLK_MANUAL
(5)自動サンプル指定
ADC_AUTO_SAMPLING_ON
ADC_AUTO_SAMPLING_OFF
(6)同時サンプル指定
ADC_SAMPLE_SIMULTANEOUS
ADC_SAMPLE_INDIVIDUAL
(7)サンプル開始制御
ADC_SAMP_ON
ADC_SAMP_OFF
config2にはADCON2用のパラメータを含む
(1)リファレンス指定
ADC_VREF_AVDD_AVSS
ADC_VREF_EXT_AVSS
ADC_VREF_AVDD_EXT
ADC_VREF_EXT_EXT
(2)CH0のスキャン指定
ADC_SCAN_ON
ADC_SCAN_OFF
(3)使用チャネル指定(説明書と異なる)
ADC_CONVERT_CH_0ABC
ADC_CONVERT_CH_0A
ADC_CONVERT_CH0
(4)割り込みタイミング
ADC_SAMPLES_PER_INT_1
ADC_SAMPLES_PER_INT_2
---
ADC_SAMPLES_PER_INT_15
ADC_SAMPLES_PER_INT_16
(5)バッファモード指定
ADC_ALT_BUF_ON
ADC_ALT_BUF_OFF
(6)交互変換指定
ADC_ALT_INPUT_ON
ADC_ALT_INPUT_OFF
config3にはADCON3用のパラメータを含む
(1)自動サンプル時間指定
ADC_SAMPLE_TIME_0
ADC_SAMPLE_TIME_1
-----
ADC_SAMPLE_TIME_30
ADC_SAMPLE_TIME_31
(2)変換用クロック選択
ADC_CONV_CLK_INTERNAL_RC
ADC_CONV_CLK_SYSTEM
(3)変換クロック選択
ADC_CLOCK_TCY2
ADC_CLOCK_TCY
ADC_CLOCK_3TCY2
---
ADC_CLOCK_32TCY
configportにはADPCFG用のパラメータを設定
ENABLE_ALL_ANA
ENABLE_ALL_DIG
ENABLE_AN0_ANA
ENABLE_AN1_ANA
ENABLE_AN15_ANA
configscanにはADCSSL用のパラメータを含む
SCAN_NONE
SCAN_ALL
SKIP_SCAN_AN0
SKIP_SCAN_AN1
-----
SKIP_SCAN_AN15
CloseADC10() void CloseADC10(void); ADコンバータを停止させ割り込みも禁止する ConfigIntADC10() void ConfigIntADC10(
unsigned int config);10ビットA/Dコンバータの割り込みの条件を設定する
configには下記の2種を指定する
(1)割り込み許可・禁止
ADC_INT_ENABLE
ADC_INT_DISABLE
(2)割り込みレベル
ADC_INT_PRI_m
(mは0〜7のいずれか)
《例》
ConfigIntADC10(ADC_INT_ENABLE &
ADC_INT_PRI_5);
SetChanADC10 void SetChanADC10(
unsigned int channel);サンプルホールドアンプの差動入力をA、Bマルチプレクサごとに指定する
channelには下記パラメータを含む
(1)CH1,2,3のMUXAの−側指定
ADC_CHX_NEG_SAMPLEA_AN9AN10AN11
ADC_CHX_NEG_SAMPLEA_AN6AN7AN8
ADC_CHX_NEG_SAMPLEA_NVREF
(2)CH1,2,3のMUXBの−側指定
ADC_CHX_NEG_SAMPLEB_AN9AN10AN11
ADC_CHX_NEG_SAMPLEB_AN6AN7AN8
ADC_CHX_NEG_SAMPLEB_NVREF
(3)CH1,2,3のMUXAの+側指定
ADC_CHX_POS_SAMPLEA_AN3AN4AN5
ADC_CHX_POS_SAMPLEA_AN0AN1AN2
(4)CH1,2,3のMUXBの+側指定
ADC_CHX_POS_SAMPLEB_AN3AN4AN5
ADC_CHX_POS_SAMPLEB_AN0AN1AN2
(5)CH0のMUXAの+側指定
ADC_CH0_POS_SAMPLEA_AN0
ADC_CH0_POS_SAMPLEA_AN1
-----
ADC_CH0_POS_SAMPLEA_AN15
(6)CH0のMUXAの−側指定
ADC_CH0_NEG_SAMPLEA_AN1
ADC_CH0_NEG_SAMPLEA_NVREF
(7)CH0のMUXBの+側指定
ADC_CH0_POS_SAMPLEB_AN0
ADC_CH0_POS_SAMPLEB_AN1
-----
ADC_CH0_POS_SAMPLEB_AN15
(8)CH0のMUXBの−側指定
ADC_CH0_NEG_SAMPLEB_AN1
ADC_CH0_NEG_SAMPLEB_NVREF
《例》
SetChanADC10(ADC_CH0_POS_SAMPLEA_AN0
& ADC_CH0_NEG_SAMPLEA_NVREF);ConvertADC10() void ConvertADC10(void); A/DコンバータのサンプリングをホールドしてA/D変換を開始させる
《例》
ConvertADC10();ReadADC10() unsigned int ReadADC10(
unsigned char bufIndex);A/D変換結果をバッファメモリから読み出す
bufIndexはバッファのアドレス0〜15の値
《例》
unsigned int result;
result = ReadADC10(3);
【使用例】
実際にdsPIC30F4012を使って、AN0とAN1の2入力のアナログ信号を、約1秒周期で
同時サンプリングして、UART経由PCに送信するプログラムは下記のようになります。
まず、パラメータの設定部です。ここでUARTとA/Dコンバータのパラメータを定義しています。
パラメータ数が多いので長い行になってしまいますので、適当なところで改行します。
次が実際のプログラム部で、ループタイマ関数とメイン関数とで構成されています。
これを実際に実行させたときの、パソコン側のハイパーターミナル画面例です。