23. A/Dコンバータ(ADC)

23.1 機能

23.2 概要

ATmega48/88/168には、10ビットの逐次変換A/Dコンバータ(ADC)が搭載されています。 ADCには8チャンネルのアナログ・マルチプレクサが接続されており、8つのシングル・エンドのアナログ電圧をポートC端子から入力することができます。シングル・エンドの入力は、0V(GND)に対する電圧となります。

ADCにはサンプル・ホールド回路が搭載されており、変換動作中のADCへの入力電圧が一定値となるように動作します。 ADCのブロック図をFigure23-1(p.244)に示します。

ADCには、専用の電源端子としてAVCCが用意されています。 AVCCは、VCCの電圧に対して± 0.3V以内の範囲でなければなりません。 この端子の接続については、「ADCのノイズ抑制」(p.249)を参照してください。

1.1V出力の内蔵電圧リファレンス、またはAVCCが参照電圧として利用されます。 AREF端子に外付けのデカップリング・コンデンサを接続することで、電圧リファレンスの耐ノイズ特性を改善することができます。

ADCを使用する際には、「消費電力を最小にする」(p.40)に記載されている、ADC電力低減ビットPRADCに0を書き込んで節電機能を無効にしてください。

ADCは、アナログ入力電圧を連続した近似動作によって10ビットのデジタル値に変換します。 変換結果の最小値はGND電圧を表しており、最大値はAREF端子の電圧値から1LSB分差し引いた値を表します。 ADMUXレジスタのREFSnビットを設定することによって、AVCC、あるいは内蔵電圧リファレンスの1.1VをAREF端子に接続することができます。 したがって、AREF端子に外付けのデカップリング・コンデンサを接続して、内蔵電圧リファレンスのノイズ耐性を改善することができます。

Figure 23-1. A/Dコンバータ回路の動作ブロック図

ADMUXレジスタのMUXビットに値を書き込んで、アナログ入力チャンネルを選択できます。 ADC入力端子のいずれか、GND、固定値のバンドギャップ電圧リファレンスのうち一つをADCのシングル・エンド入力とすることができます。 ADCSRAレジスタのADC有効ビット、ADENをセットするとADCが有効になります。 電圧リファレンスと入力チャンネルの選択は、ADENビットがセットされない限り、有効な選択となりません。 ADENビットがクリアされている場合、ADCは電力を消費しません。したがって、消費電力を低くするためにスリープ・モードに入る際には、ADCへの電力供給をオフにしておくことが推奨されます。

ADCの生成する10ビットの変換結果はADCデータ・レジスタ、ADCH、ADCLに出力されます。 デフォルト設定では、変換結果はビットを右側へ詰め込んだ表現形式で保存されます。 ADMUXレジスタのADLARビットをセットすることにより、ビットを左側に詰め込んだ表現形式とすることもできます。

ビットを左側に配置した変換結果を使用する場合、8ビット以上の精度が必要でなければ、ADCHレジスタの値のみを読み取るだけで十分です。 それ以外の場合は、ADCLレジスタを最初に、その次にADCHレジスタを読み取り、二つのデータ・レジスタの内容が同一の変換結果からのものとなるようにしなければなりません。 ADCLレジスタを読み取ると、ADCによるデータ・レジスタへのアクセスが禁止されます。 つまり、ADCLレジスタを読み取ってからADCHレジスタを読み取る前に新たに変換動作が完了した場合、データ・レジスタADCL、ADCHの更新は行われず、その変換結果は失われることになります。 ADCHを読み取ると、ADCによるADCH、ADCLレジスタへのアクセスが再び有効になります。

ADCには、変換完了時に発生させることができる割り込みが備わっています。 ADCHとADCLレジスタの読み取りの間の、ADCがデータ・レジスタへのアクセスを禁止されている期間に変換動作が完了し、変換結果が失われる場合であっても、割り込みは発生します。

23.3 変換動作の開始

「消費電力を最小にする」(p.40)にあるADC電力低減ビット、PRACに0を書きこんで無効にし、ADC変換開始ビット、ADSCに1を書きこむと、一回の変換動作が開始します。ADSCビットは、変換動作が進行中の間Highのままとなり、変換が完了するとハードウェアによりクリアされます。 変換動作中に、入力チャンネルの選択を変更すると、ADCは進行中の変換を完了してから、チャンネルの変更を行います。

別の方法として、様々な要因をトリガーとして自動的に変換動作をスタートさせることができます。 この自動トリガー動作は、ADCSRAレジスタのADC自動トリガー有効ビット、ADATEをセットすると有効になります。 トリガー要因の選択は、ADCSRBレジスタのADCトリガー選択ビット、ADTS(トリガー要因の一覧については、ADTSビットの説明を参照)によって行います。 選択されたトリガー要因の立ち上がりエッジにより、ADCのプリスケーラがリセットされ、変換動作が開始されます。 この機能により、一定の時間間隔で変換動作を開始することができます。 変換完了時にトリガー要因の信号レベルがHighのままになっている場合、次の変換動作は開始されません。 変換動作中に新たにトリガー要因に立ち上がりエッジが発生した場合、そのエッジは無視されます。 なお、各トリガーに対応する割り込みが無効になっている場合や、SREGのグローバル割り込み有効ビットがクリアされている場合であっても、割り込みフラグはセットされます。 したがって、割り込みを発生させることなく、変換動作をトリガーにより開始することができます。 ただし、割り込みフラグをクリアしないと、次の割り込みイベントによる変換動作を開始することはできません。

Figure 23-2. ADC 自動トリガー回路

ADC割り込みフラグをトリガー要因として使用することにより、変換動作が完了すると即座に次の変換を開始させることができます。 これにより、ADCはフリーラン・モードで動作し、自動的にサンプリングを行って、ADCデータ・レジスタを更新しつづけます。 最初の変換動作は、ADCSRAレジスタのADSCビットに1を書きこんで開始させなければなりません。 このモードでは、ADC割り込みフラグ、ADIFがクリアされているかどうかに関係なく、ADCが連続して変換動作を行います。

自動トリガーを有効にしている場合でも、ADCSRAレジスタのADSCビットに1を書き込むことにより、単一の変換動作を開始させることができます。 ADSCビットは変換動作が進行中かどうかを判定するために使用することもできます。 変換動作の開始要因に関係なく、変換動作中のADSCビットの読み取り値は1となります。

23.4 プリスケーラと変換タイミング

Figure 23-3. ADC プリスケーラ

デフォルト設定では、連続近似変換回路は、最大精度を得る場合50kHzから200kHzのクロック入力を必要とします。 必要な精度が10ビットよりも低い場合、ADCへの入力クロックの周波数を200kHZよりも高く設定して、より高いサンプリング・レートを実現することができます。

ADCモジュールにはプリスケーラが備わっており、100kHzよりも高い周波数のCPUクロックからADCに適切なクロック周波数を生成することができます。 プリスケーラの設定はADCSRAレジスタのADPSビットで行います。

プリスケーラのカウント動作は、ADCSRAレジスタのADENビットをセットしてADCを有効にした時から始まります。 ADENビットがセットされている間、プリスケーラはカウント動作を継続し、ADENビットがLowになった場合、ゼロ固定となります。

ADCSRAレジスタのADSCビットをセットして単一の変換動作を開始する場合、その変換動作はADCクロックサイクルの次の立ち上がりエッジにより開始されます。

通常の変換動作には、ADCクロック13サイクルの時間がかかります。 ADCを有効(ADCSRAレジスタのADENビットをセット)にした最初の変換動作には、アナログ回路を初期化するため、 25サイクルが必要です。

バンドギャップ電圧リファレンスがADCの入力として使用されている場合、その電圧が安定するまでに一定の時間が必要です。 安定していない状態で変換を行うと、最初に読み取る変換結果は正確な値とならない場合があります。

通常の変換動作を開始後1.5ADCサイクル、および、最初の変換動作開始から13.5ADCサイクル後に、サンプル・ホールド動作が行われます。 変換動作が完了すると、変換結果がADCデータ・レジスタに書きこまれ、ADIFビットがセットされます。 単一変換モードでは、同時にADSCビットがクリアされます。 その後、ソフトウェアによりADSCビットを再度セットすると、その後の最初のADCクロックの立ち上がりエッジで次の変換動作が開始されます。

自動トリガー・モードでは、トリガー要因が発生したときにプリスケーラがリセットされます。 これにより、トリガー要因から変換開始までの遅延時間を一定にすることができます。 このモードでは、トリガー要因の立ち上がりエッジから、2ADCクロック後のにサンプル・ホールド回路が動作します。 同期回路の動作に3CPUサイクルを消費します。

フリーラン・モードでは、ADSCビットがHighになっている間、変換動作が完了すると即座に次の変換が開始されます。 変換動作のタイミングをTable 23-1(p.248)にまとめます。

Figure 23-4. ADCタイミング・チャート 最初の変換動作(単一変換モード)

Figure 23-5. ADCタイミング・チャート 単一変換モード

Figure 23-6. ADCタイミング・チャート、自動トリガー・モード

Figure 23-7. ADCタイミング・チャート、フリーラン・モード

Table 23-1. ADC変換時間
条件 サンプル&ホールド時間(変換開始からのサイクル数) 変換時間(サイクル数)
最初の変換 13.5 25
通常の変換 1.5 13
自動トリガーによる変換 2 13.5

23.5 チャンネルやリファレンス電圧の選択を変更する

ADMUXレジスタのMUXnビット、およびREFS1:0ビットは、CPUからランダム・アクセスできる一時レジスタを介してシングル・バッファ接続されています。 このしくみにより、A/D変換動作中の安全な時間帯でのみ、チャンネルやリファレンス電圧の選択動作が行われます。 変換動作が開始するまでは、チャンネルやリファレンス電圧の選択は、変更があると、それに応じていつでも更新されます。 いったん変換動作が開始すると、チャンネルやリファレンス電圧の選択はロックされ、A/Dコンバータに必要なサンプリング時間を確保します。 A/D変換完了(ADCSRAレジスタのADIFフラグがセットされるとき)の直前の最終ADCクロックにおいて、チャンネルやリファレンス電圧選択の更新動作が再開されます。 なお、ADSCレジスタに書き込みを行った次のADCクロックの立ち上がりで、変換動作が開始することにご注意ください。 したがって、ユーザープログラム中では、ADSCレジスタへの書込み後、ADCクロック1サイクル経過するまでの時間帯に、チャンネル選択やリファレンス電圧選択を変更するような値をADMUXレジスタに書きこむべきではありません。

自動トリガー・モードを使用している場合は、トリガー・イベントが発生する正確な時間が予測不能な場合があります。 ADMUXレジスタの更新を行う場合は、設定変更によって変換動作が受ける影響を最小限にするために特別な配慮が必要となります。

ADATEビットとADENビットの両方に1をセットしている場合、割り込みイベントがいつ発生するかを予測することは原理的に不可能です。 ADMUXレジスタをこの状態で変更した場合、その次の変換動作がADMUXの変更前、変更後いずれの設定によるものかをユーザーが知るすべはありません。ADMUXレジスタの変更を安全に行うために、以下のような条件で実行してください。

ADMUXレジスタの更新を以上の条件のもとで行った場合、新しい設定値が次回のA/D変換動作に反映されます。

23.5.1 ADC入力チャンネル

チャンネルの選択を変更する際は、ユーザーは下記の原則に注意して正しいチャンネルが選択されるようにしなければなりません。

単一変換モードでは、必ず変換動作を開始する前にチャンネル選択をしてください。 ADSCビットに1を書き込んだ後、ADCクロック1サイクル経過後でもチャンネル選択の変更をすることができますが、最も簡単な方法は、変換動作が完了するのを待ち、その後、チャンネル選択の変更をすることです。

フリーラン・モードでは、必ず最初の変換動作を始める前にチャンネル選択をしてください。 ADSCビットに1を書き込んだ後、ADCクロック1サイクル経過後にチャンネル選択の変更をすることができますが、最も簡単な方法は、最初の変換動作が完了するのを待ち、その後、チャンネル選択の変更をすることです。このとき、次の変換動作が自動的に開始されているので、次回の変換結果は変更前のチャンネルを反映したものになります。それ以降の変換動作では、新しく選択したチャンネルが反映されます。

23.5.2 ADC 電圧リファレンス

A/D変換の電圧リファレンス(VREF)は、A/D変換の対象となる電圧の上限を示しています。シングル・エンドのチャンネルにおけるVREFを超える入力は全て同一の値0x3FFに変換されます。VREFには、AVCC、内蔵の1.1V電圧リファレンス、または、外部入力端子AREFのいずれかを選択できます。

AVCCはパッシブ・スイッチを通してADCに接続されています。 内蔵1.1V電圧リファレンスは、内蔵のバンドギャップ電圧リファレンスから内蔵アンプを通して生成されています。 どの場合でも、AREF端子はADCに直接接続されており、AREF端子とグラウンドの間にコンデンサを接続することで、電圧リファレンスのノイズ耐性を高めることができます。 VREFの電圧はAREF端子に高インピーダンスの電圧計を接続して測定することもできます。 VREFは高インピーダンスの電圧源なので、回路全体としてVREFに容量性負荷以外のものを接続するべきではありません。

ユーザーがAREF端子に固定値の外部電圧源を接続する場合、内部電圧リファレンスとの短絡を防止するため、そのアプリケーションで他の電圧リファレンスのオプションを選択してはいけません。 外部からの電圧がAREF端子に供給されていない場合に限り、AVCCや1.1Vを選択肢として切り替え使用することができます。 電圧リファレンスを切り替えた場合、その後の最初のAD変換動作の結果は不正確な場合があるので、ユーザーは最初の変換結果を破棄することが推奨されます。

23.6 ADCノイズ抑制機能

ADCにはスリープ・モード中に変換を行い、CPUコアや他の周辺I/Oから発生するノイズを低減するノイズ抑制機能が備わっています。ノイズ抑制機能はADCノイズ低減モードとアイドル・モードで使用できます。 この機能の使用は、下記の手順でおこないます。

アイドル・モード、ADCノイズ低減モード以外のスリープ・モードに入る場合、ADCは自動的にオフにならないことにご注意ください。その他のスリープモードに入る場合、ADENビットにゼロを書き込み、余計な電力を消費しないようにすることが推奨されます。

23.6.1 アナログ入力回路

シングル・エンド・チャンネルのアナログ入力回路をFigure23-8に示します。 ADCn端子に供給されるアナログ電圧源には、ADCの入力チャンネルが選択されているかどうかに関係なく、端子の容量成分と漏れ電流の影響を受けます。 (訳注:Figure23-8には「端子の容量成分」は記載がありません。本文記述によれば、I_ILと並列に接続される容量成分と思われます) チャンネルが選択されている場合は、電圧源は、直列抵抗(入力経路の抵抗成分の合成値)を通して、サンプル・ホールド回路のコンデンサを駆動しなければなりません。

ADCは、出力インピーダンスが約10kω以下のアナログ信号を入力として受けるように最適化されています。 その要件を満たした電圧源を使用する場合はサンプリング時間は無視できるほど小さくなります。 より高い出力インピーダンスをもつ電圧源を使用する場合、サンプリング時間の長さはサンプル・ホールド回路のコンデンサの充電時間に依存し、この時間は広範囲にわたって変化します。 サンプル・ホールド回路のコンデンサの充電時間を最小限にするため、出力インピーダンスが低く、信号の変化がゆっくりとしている電圧源の使用が推奨されます。

予測不可能な信号の重畳による歪みを防止するため、ナイキスト周波数(fADC/2)よりも高い信号成分が、どのチャンネルにも現れないようにする必要があります。 ADCに信号が入力される前に、ロー・パス・フィルタによって高い周波数成分を取り除いておくことが推奨されます。

Figure 23-8. アナログ入力回路

23.6.2 アナログ・ノイズを抑制する手段

デバイス内部、および外部のデジタル回路が発生するEMIにより、アナログ電圧の測定精度が悪化する場合があります。 A/D変換の精度が最重要項目である場合には、下記のような手段によりノイズレベルを低減することができます。

Figure 23-9. ADCへの電源接続

23.6.3 ADC変換精度に関する用語定義

nビットのシングル・エンドA/Dコンバータは、GNDとVREF間の電圧を2n段階(x LSB)に直線的に変換します。 もっとも小さなコードは0となり、最も大きなコードは2n-1となります。

理想的な動作との相違点は、いくつかのパラメータにより表現されます。

23.7 ADC変換結果

変換が完了する(ADIFフラグがHighになる)と、変換結果がADC変換出力レジスタ(ADCL、ADCH)に表れます。

シングル・エンドの変換における変換結果は

ADC = \frac{V_in * 1024}{V_ref}
となります。 ここで、V_INは、選択されている入力端子の電圧、V_REFは選択されている電圧リファレンス(Table 23-2 (p.254)Table 23-3(p.255)を参照)です。 0x000はアナログ・グラウンド電圧を示し、0x3FFは選択されている電圧リファレンスから1LSB分差し引いた電圧を意味します。

23.8 レジスタ詳細

23.8.1 ADMUX – ADCマルチプレクサ選択レジスタ

ビット 7 6 5 4 3 2 1 0
(0x7C) REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0 ADMUX
Read/Write R/W R/W R/W R R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

23.8.2 ADCSRA – ADCコントロール/ステータス・レジスタA

ビット 7 6 5 4 3 2 1 0
(0x7A) ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSRA
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

23.8.3 ADCL、およびADCH – ADCデータ・レジスタ

23.8.3.1 ADLAR = 0

ビット 15 14 13 12 11 10 9 8
(0x79) - - - - - - ADC9 ADC8 ADCH
(0x78) ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 ADCL
7 6 5 4 3 2 1 0
Read/Write R R R R R R R R
R R R R R R R R
初期値 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

23.8.3.2 ADLAR = 1

ビット 15 14 13 12 11 10 9 8
(0x79) ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH
(0x78) ADC1 ADC0 - - - - - - ADCL
7 6 5 4 3 2 1 0
Read/Write R R R R R R R R
R R R R R R R R
初期値 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

ADCの変換が完了すると、変換結果がこの二つのレジスタに表れます。

ADCLレジスタを読みだした後、ADCHレジスタを読み出すまで、ADCデータ・レジスタの内容は更新されません。 したがって、変換結果を左詰めで表現しており、8ビット以上の精度を必要としない場合、ADCHレジスタのみを読み出すことで十分となります。 その他の場合は、ADCLレジスタを最初に読み出し、その後ADCHレジスタを読み出します。

ADMUXレジスタのADLARビットの値により、このレジスタから読み出す方法が変わります。 ADLARビットがセットされている場合、変換結果は左詰めで表現されます。ADLARビットがクリア(デフォルト値)されている場合、変換結果は右詰めで表現されます。

23.8.4 ADCSRB – ADCコントロール/ステータス・レジスタB

ビット 7 6 5 4 3 2 1 0
(0x7B) - ACME - - - ADTS2 ADTS1 ADTS0 ADCSRB
Read/Write R R/W R R R R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

23.8.5 DIDR0 – デジタル入力無効化レジスタ0

ビット 7 6 5 4 3 2 1 0
(0x7E) - - ADC5D ADC4D ADC3D ADC2D ADC1D ADC0D DIDR0
Read/Write R R R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

目次に戻る