- ADC(アナログ-デジタル変換)とは
- AVRマイクロコントローラーAtmega16のADC
- 必要なコンポーネント
- 回路図
- Atmega16でのADC制御レジスタの設定
- ADC用のAtmega16のプログラミング
ほとんどすべての組み込みアプリケーションで使用される一般的な機能の1つは、ADCモジュール(アナログ-デジタルコンバーター)です。これらの アナログ-デジタルコンバーター は、温度センサー、傾斜センサー、電流センサー、フレックスセンサーなどのアナログセンサーから電圧を読み取ることができます。このチュートリアルで は、ADCとは何か、Atmega16でADCを使用する方法を学習します。このチュートリアルには、小さなポテンショメータをAtmega16のADCピンに接続することが含まれ、8つのLEDを使用して、ADC入力値の変化に対するADC出力値の変化する電圧を表示します。
以前、他のマイクロコントローラーのADCについて説明しました。
- ARM7LPC2148でADCを使用する方法-アナログ電圧の測定
- STM32F103C8でADCを使用する方法-アナログ電圧の測定
- MSP430G2でADCを使用する方法-アナログ電圧の測定
- Arduino UnoでADCを使用する方法は?
- MPLABおよびXC8でPICマイクロコントローラのADCモジュールを使用する
ADC(アナログ-デジタル変換)とは
ADCはAnalog to DigitalConverterの略です。エレクトロニクスでは、ADCは電流や電圧などのアナログ信号をデジタルコード(バイナリ形式)に変換するデバイスです。実世界では、ほとんどの信号はアナログであり、マイクロコントローラーまたはマイクロプロセッサーはバイナリ言語またはデジタル言語(0または1)を理解します。したがって、マイクロコントローラにアナログ信号を理解させるには、これらのアナログ信号をデジタル形式に変換する必要があります。 ADCはまさにこれを私たちに代わって行います。さまざまなアプリケーションで利用できるADCには多くの種類があります。人気のあるADCは、フラッシュ、逐次比較、シグマデルタです。
最も安価なタイプのADCは逐次比較であり、このチュートリアルでは逐次比較ADCを使用します。逐次比較型ADCでは、それぞれが固定アナログレベルに対応する一連のデジタルコードが連続して生成されます。内部カウンタは、変換中のアナログ信号と比較するために使用されます。アナログレベルがアナログ信号より少し大きくなると、生成が停止します。アナログレベルに対応するデジタルコードは、アナログ信号の望ましいデジタル表現です。これで、逐次比較に関する簡単な説明は終わりです。
ADCをさらに深く探求したい場合は、ADCに関する以前のチュートリアルを参照できます。ADCはICの形で入手でき、マイクロコントローラーには現在ADCが組み込まれています。このチュートリアルでは、Atmega16の内蔵ADCを使用します。Atmega16の内蔵ADCについて説明しましょう。
AVRマイクロコントローラーAtmega16のADC
Atmega16には10ビットと8チャンネルのADCが内蔵されています。10ビットは、入力電圧が0〜5Vの場合、10ビット値、つまり1024レベルのディスクリートアナログ値(2 10 = 1024)に分割されることに対応します。これで、8チャネルはAtmega16の専用の8つのADCピンに対応し、各ピンはアナログ電圧を読み取ることができます。完全なPortA(GPIO33-GPIO40)はADC動作専用です。デフォルトでは、PORTAピンは一般的なIOピンであり、ポートピンが多重化されていることを意味します。これらのピンをADCピンとして使用するには、ADC制御専用の特定のレジスタを構成する必要があります。これが、レジスタがADC制御レジスタとして知られている理由です。内蔵ADCの機能を開始するためにこれらのレジスタを設定する方法について説明しましょう。
Atmega16のADCピン
必要なコンポーネント
- Atmega16マイクロコントローラーIC
- 16Mhz水晶発振器
- 2つの100nFコンデンサ
- 2つの22pFコンデンサ
- ボタンを押す
- ジャンパー線
- ブレッドボード
- USBASP v2.0
- Led(任意の色)
回路図
Atmega16でのADC制御レジスタの設定
1. ADMUXレジスタ(ADCマルチプレクサ選択レジスタ):
ADMUXレジスタは、ADCチャネルの選択と基準電圧の選択用です。次の図は、ADMUXレジスタの概要を示しています。以下に説明する。
- ビット0〜4:チャネル選択ビット。
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
選択されたADCチャネル |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- ビット5: 結果を右または左に調整するために使用されます。
ADLAR |
説明 |
0 |
結果を正しく調整する |
1 |
結果を左調整 |
- ビット6-7:ADCの基準電圧を選択するために使用されます。
REFS1 |
REFS0 |
電圧リファレンスの選択 |
0 |
0 |
AREF、内部Vrefがオフになっています |
0 |
1 |
AREFピンに外部コンデンサを備えたAVcc |
1 |
0 |
予約済み |
1 |
1 |
AREFピンに外部コンデンサを備えた内部2.56電圧リファレンス |
次に、内部ADCを読み取ってPORTCのすべてのピンに出力するように、プログラムでこれらのレジスタビットの構成を開始します。
ADC用のAtmega16のプログラミング
完全なプログラムを以下に示します。JTAGとAtmelstudioを使用してAtmega16でプログラムを書き込み、ポテンショメータを回転させてADC値を変更します。ここでは、コードが1行ずつ説明されています。
ADC変換値を読み取る1つの関数を作成することから始めます。次に、 ADC_read 関数でチャネル値を 「chnl」 として 渡し ます。
unsigned int ADC_read(unsigned char chnl )
ADCチャネルは8つしかないため、チャネル値は0〜7でなければなりません。
chnl = chnl &0b00000111;
ADMUXレジスタに「40」、つまり「01000000」を書き込むことにより、アナログ入力がデジタル変換用に接続されるADC0としてPORTA0を選択しました。
ADMUX = 0x40;
ここで、このステップにはADC変換プロセスが含まれます。ADCSRAレジスタのADSCビットにONEを書き込むことにより、変換を開始します。その後、変換が完了したらADIFビットが値を返すのを待ちます。ADCSRAレジスタのADIFビットに「1」を書き込むことで変換を停止します。変換が完了したら、ADC値を返します。
ADCSRA-=(1 <
ここで、内部ADC基準電圧はREFS0ビットを設定することによって選択されます。その後、ADCを有効にし、プリスケーラを128として選択します。
ADMUX =(1 <
次に、ADC値を保存し、PORTCに送信します。PORTCでは、8つのLEDが接続されており、8ビット形式でデジタル出力を表示します。私たちが示した例では、1つの1Kポットを使用して0Vから5Vの間で電圧を変化させます。
i = ADC_read(0); PORTC = i;
デジタルマルチメータはADCピンのアナログ入力電圧を表示するために使用され、8つのLEDはADC出力の対応する8ビット値を表示するために使用されます。ポテンショメータを回転させるだけで、マルチメータと光るLEDで対応する結果を確認できます。
完全なコードと作業ビデオを以下に示します。