Atmel Studioで、AVRマイコンのADC(ADコンバータ)制御プログラムを開発する方法について解説します。
ADCのサンプル・コード
ADCの使い方を、下記の簡単なサンプル・コードを例に説明していきます。
//Example: ADC
//Target Device: ATmega328
//Author: easy labo
//Created: 2014.11.02
#include
void InitAdc(void){
//Clear or AREF Internal Vref turned off,
ADMUX &= ~(0b11000000);
//AVCC with external capacitor at AREF pin,
ADMUX |= 0b01000000;
//Internal 1.1V Voltage Reference with external capacitor at AREF pin
//ADMUX |= 0b11000000;
//set ADLAR 1 to left adjust the result
//ADMUX |= 0b00100000;
//ADCSRA Settings
//ADEN(ADC Enable) = 1,
//ADSC(ADC Start Conversion) = 1
//ADATE(ADC Auto Trigger Enable) = 0
//ADIF(ADC Interrupt Flag) = 0
//ADIE(ADC Interrupt Enable) = 0
//ADPS[2:0](ADC Prescaler Select Bits) = {0,0,0}
ADCSRA = (1<<aden); didr0="" settings,="" digital="" input="" disable="" register="" 0="" }="" unsigned="" int="" convadc(unsigned="" char="" chad){="" dataadc;="" admux="(ADMUX" &="" 0xf0)="" |="" chad;="" adcsra="" adsc="1:" adc="" start="" conversion="" while(adcsra="" (1<<adsc));="" if="" adlar="0," dataadc="ADCL;" +="(ADCH<<8);">>6);
//dataADC += (ADCH<<2);
return dataADC;
}
以下、サンプル・コードの内容を順に見ていく事にします。
8行-32行
ADC関連レジスタの設定を行う関数の例になります。
10行-15行目
ADMUXの設定を行っています。この例では、AVCCをAREFとして使用していますが、他にも内部の1.1V基準を使用する事等も可能です。
17行-18行
2byte(16bit)データ領域のどちら側にデータを寄せるか設定する事も可能です。この例ではデフォルトのままで変えていません。
20行-27行
ADCSRAの設定を行っています。このレジスタでは様々な設定が行えますが、
この例では、最低限必要なADENのみを有効化しています。
29行-30行
Digital Inputの入力抵抗を無効にして、消費電流を減らる事も可能です。
34行-46行
AD変換をする関数の例になります。引数でADCのチャンネルを指定します。
関数の戻り値がADCの測定値になります。
36行
引数で指定したADCのチャンネルをADMUXレジスタのチャンネル指定部に書き込んでいます。ADCのチャンネル以上の数値が入力された場合は無視される様に0xFOでマスクしています。
37行
ADCSCRAのADSCビットを有効にして、AD変換を開始しています。
38行
ADCSRAのADSCビットが”1″の場合は、AD変換中なので、Waitしています。
39行-44行
2byteのデータをシフト演算整理しています。ADMUXレジスタのADLAR設定次第で、データ整理方法を変える必要があります。
45行
整理したADコンバータの測定値を返しています。
まとめ
以上がADCの基本的な使用方法になります。なお、この例では使用していませんが、割り込み等を利用した、より高度な使い方も可能です。また、ATmega328のADC分解能は10bitなので、それ以上の精度が必要な場合は、SPI等のインターフェースを介して外部の高精度ADCを利用する事になります。
Sponsored Link