電圧などのアナログ値をデジタル値(数値)に変換する装置(ハードウエア)をA/D変換器(Analog to Digital
Converter)という。
例えば、図の様なアナログの信号(電圧値)があった時に①の点では、2Vであったとすると、AD変換器(以下、ADC)を使えば、この電圧値を数値に変換する事が出来る。
ADCでアナログ電圧を数値に変換する事を、サンプリングと言う。サンプリングの周期は、アナログ電圧の周波数に対して、十分短い事が要求される。具体
的には、アナログ電圧の最大の周波数成分に対して2倍以上の速度でサンプルすれば良い事が知られている。(サンプリング定理)
ただし、実用上は3倍以上、出来れば10倍程度の速度でサンプルすることが望ましい。
変換結果とアナログ電圧の関係
アナログ入力電圧は、ADCによって数値に変換される。この時、数値と実際の電圧との関係は、以下のようになる。
ADCの分解能は10bit(0~1023の数値を表現できる)なので、基準電圧を2.56Vとすると、この間を1024等分する事になる。つまり、
式:変換後の数値と入力電圧・基準電圧の関係
変換後の数値(ADCH、ADCL) = (入力電圧[V](ADC0~ADC12ピン) × 1023) / 2.56(基準電圧:VREF) |
ということになる。
【注意】
ここで入力電圧の上限を5Vとしているが、正確には電源電圧が上限となる。従って、電池(3V)などでマイコンを動作させた場合は、3Vが上限になる事に注意。 (USB給電を行った場合は、5V)
上限を超える電圧を加えると、マイコンが破壊する。
AVRマイコン(ATMega32U4)に実装されているADCの主な仕様は、以下の通り
などである。
プログラミングの手順
設定内容は以下の通り、
ADCSRA |= _BV(ADEN); // AD変換器を起動 |
ADCSRBレジスタ:bitの位置 (ビットの名前) |
3 (ADTS3) |
2 (ADTS2) |
1 (ADTS1) |
0 (ADTS0) |
連続変換 | 0 | 0 | 0 | 0 |
アナログ比較器 | 0 | 0 | 0 | 1 |
外部割込み(IRQ0) | 0 | 0 | 1 | 0 |
タイマ0 比較・一致 | 0 | 0 | 1 | 1 |
タイマ0 オーフロー(TCNT0) | 0 | 1 | 0 | 0 |
タイマ1 比較・一致 (OCR1B) | 0 | 1 | 0 | 1 |
タイマ1 オーバフロー(TCNT1) | 0 | 1 | 1 | 0 |
タイマ1 キャプチャイベント | 0 | 1 | 1 | 1 |
タイマ4 オーバフロー | 1 | 0 | 0 | 0 |
タイマ4 比較・一致 (OCR4A) | 1 | 0 | 0 | 1 |
タイマ4 比較・一致 (OCR4B) | 1 | 0 | 1 | 0 |
タイマ4 比較・一致 (OCR4D) | 1 | 0 | 1 | 1 |
連続変換(AD変換を1回だけでなく、連続してどんどん行わせる)の設定にしたいなら、以下の様にする。
ADCSRA |= _BV(ADATE); // ADATEビットを1に設定 ADCSRB &= 0b11110000; // ADTS3~0ビットを0に設定 |
ADATEビットを0にして、ADSCビット(ADCSRA)を1にすると、AD変換は1回だけ行われる。
ADCSRA &= ~_BV(ADATE); // ADCSRAレジスタは初期値が0なので、通常はこの設定は不要 |
ADCSRA |= _BV(ADIE); // AD割り込みを許可 |
ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // ADPS2~0ビットが111 |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ADC9 | ADC8 | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADC1 | ADC0 | - | - | - | - | - | - |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | - | - | - | - | - | ADC9 | ADC8 | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADC1 | ADC0 |
ADMUXレジスタ:bitの位置 (ビットの名前) |
7 (REFS1) |
6 (REFS0) |
AREFピン(ボード上はVREFピン)を基準電圧とする。 | 0 | 0 |
AVCC(Davinci32Uは5V)を基準電圧とする。 | 0 | 1 |
予約 | 1 | 0 |
内部2.56V基準電圧 | 1 | 1 |
ビット MUX5~MUX0 |
シングルエンド入力ピン | 差動入力 (プラス側)ピン |
差動入力 (マイナス側)ピン |
倍率 |
00 0000 | ADC0 | N/A | ||
00 0001 | ADC1 | |||
00 0010 | N/A | |||
00 0011 | ||||
00 0100 | ADC4 | |||
00 0101 | ADC5 | |||
00 0110 | ADC6 | |||
00 0111 | ADC7 | |||
00 1000 | N/A | N/A | N/A | N/A |
00 1001 | ADC1 | ADC0 | 10x | |
00 1010 | N/A | N/A | N/A | |
00 1011 | ADC1 | ADC0 | 200x | |
00 1100 | N/A | |||
00 1101 | ||||
00 1110 | ||||
00 1111 | ||||
01 0000 | ADC0 | ADC1 | 1x | |
01 0001 | N/A | |||
01 0010 | ||||
01 0011 | ||||
01 0100 | ADC4 | ADC1 | 1x | |
01 0101 | ADC5 | ADC1 | 1x | |
01 0110 | ADC6 | ADC1 | 1x | |
01 0111 | ADC7 | ADC1 | 1x | |
01 1000 | N/A | |||
01 1001 | ||||
01 1010 | ||||
01 1011 | ||||
01 1100 | ||||
01 1101 | ||||
01 1110 | 1.1V (VBAND GAP) | |||
01 1111 | 0V (GND) | |||
10 0000 | ADC8 | |||
10 0001 | ADC9 | |||
10 0010 | ADC10 | |||
10 0011 | ADC11 | |||
10 0100 | ADC12 | |||
10 0101 | ADC13 | |||
10 0110 | N/A | ADC1 | ADC0 | 40x |
10 0111 | Temperature Sensor | |||
10 1000 | N/A | ADC0 | ADC0 | 10x |
10 1001 | ADC5 | ADC0 | 10x | |
10 1010 | ADC6 | ADC0 | 10x | |
10 1011 | ADC7 | ADC0 | 10x | |
10 1100 | ADC4 | ADC1 | 10x | |
10 1101 | ADC5 | ADC1 | 10x | |
10 1110 | ADC6 | ADC1 | 10x | |
10 1111 | ADC7 | ADC1 | 10x | |
11 0000 | ADC4 | ADC0 | 40x | |
11 0001 | ADC5 | ADC0 | 40x | |
11 0010 | ADC6 | ADC0 | 40x | |
11 0011 | ADC7 | ADC0 | 40x | |
11 0100 | ADC4 | ADC1 | 40x | |
11 0101 | ADC5 | ADC1 | 40x | |
11 0110 | ADC6 | ADC1 | 40x | |
11 0111 | ADC7 | ADC1 | 40x | |
11 1000 | ADC4 | ADC0 | 200x | |
11 1001 | ADC5 | ADC0 | 200x | |
11 1010 | ADC6 | ADC0 | 200x | |
11 1011 | ADC7 | ADC0 | 200x | |
11 1100 | ADC4 | ADC1 | 200x | |
11 1101 | ADC5 | ADC1 | 200x | |
11 1110 | ADC6 | ADC1 | 200x | |
11 1111 | ADC7 | ADC1 | 200x |
各レジスタのビットの配置は、以下の通り。
ADCSRAレジスタのビット配置
bitの位置 (ビットの名前) |
7 (ADEN) |
6 (ADSC) |
5 (ADATE) |
4 (ADIF) |
3 (ADIE) |
2 (ADPS2) |
1 (ADPS1) |
0 (ADPS0) |
機能 |
ADEN=1 ADCを起動 ADEN=0 ADCを停止 |
ADSC=1 AD変換スタート ADSC=0 AD変換停止 |
「2.AD変換の 起動設定」を参照 |
AD変換終了 割り込みフラグ (「3.割り込み設定」を参照) |
ADIE=1 ADIE=0 |
システムクロック |
||
初期値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ADCSRBレジスタのビット配置
bitの位置 (ビットの名称) |
7 (ADHSM) |
6 (ACME) |
5 (MUX5) |
4 - |
3 (ADTS3) |
2 (ADTS2) |
1 (ADTS1) |
0 (ADTS0S0) |
機能 | 高速変換モード | 「表:アナログ入力チャンネルの選択」を参照 | - | 「表:トリガモード一覧」を参照 | ||||
初期値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ADMUXレジスタのビット配置
bitの位置 (ビットの名前) |
7 (REFS1) |
6 (REFS0) |
5 |
4 (MUX4) |
3 (MUX3) |
2 (MUX2) |
1 (MUX1) |
0 (MUX0) |
機能 | 「表:基準電圧減の選択」参照 | 「表:AD変換結果のレイアウト」参照 | 「表:アナログ入力チャンネルの選択」参照 | |||||
初期値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
DIDR1レジスタのビット配置
bitの位置 (ビットの名称) |
7 (ADC7D) |
6 (ADC6D) |
5 (ADC5D) |
4 (ADC4D) |
3 - |
2 - |
1 (ADC1D) |
0 (ADC0D) |
機能 |
MUX5~0で選択したピンについて、当該ビットを1にセットすると、デジタル入力機能がOFFとなり、 消費電力を削減できる。 |
|||||||
初期値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
DIDR0レジスタのビット配置
bitの位置 (ビットの名称) |
7 - |
6 - |
5 (ADC13D) |
4 (ADC12D) |
3 (ADC11D) |
2 (ADC10D) |
1 (ADC9D) |
0 (ADC8D) |
機能 |
MUX5~0で選択したピンについて、当該ビットを1にセットすると、デジタル入力機能がOFFとなり、 消費電力を削減できる。 |
|||||||
初期値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
AD変換の入力ピン配置
前述の通り、ATMega32U4マイコンには12本のアナログ入力がある。それぞれの入力と、基板上のピンの対応は、以下の通り。
サンプルプログラム
以下の様に、スライドボリュームをADC0に接続し、ボリュームのつまみの位置によってLED(PC7)が点滅するプログラム例を、以下に示す。
スライドボリュームの出力は、0~5Vの間で変化するためADC0の入力電圧も、同様に変化する。この時のAD変換後の数値は、0~1023となる。
○単発変換によるサンプル
/* #include < avr/io.h > int main() CLKPR = 0x80; CLKPR = 0; // 16MHz動作のための設定 // ADCの初期化 while(1) { |
○連続変換によるサンプル
/* #include < avr/io.h > int main() CLKPR = 0x80; CLKPR = 0; // 16MHz動作のための設定 // ADCの初期化 while(1) { |
AD変換と割り込み
/* #include < avr/io.h > // 割り込みハンドラ t = ADC; //
ADCは16bit幅で、8bitずつ2回に分けてアクセスされるので、 int main() DDRC = 0b10000000; // デバッグ用のLED(PC7)の設定 // ADCの初期化 sei(); // 全ての割り込みを許可 while(1) { |