最終更新時間:2007年08月26日 13時12分53秒
アナログコンパレータ
概要
アナログコンパレータはAIN0とAIN1のpinの電圧を比較します。AIN0の方の電圧が高ければ、レジスタACSRのbit-ACOがセット(1)されます。この時ANACOMP割り込みを起こし割り込みルーチンを実行することも出来ます。割り込みトリガとして立ち上がり(AC0が0から1)、立ち下がり、トグル(両方)のいずれかを選択できます。これはACIS0:ACIS1で設定できます。
ACIS0 | ACIS1 | 動作 |
---|---|---|
0 | 0 | トグル動作 |
0 | 1 | 未使用 |
1 | 0 | 立ち下がり(AIN1の電圧がAIN0より下回る) |
1 | 1 | 立ち上がり(立ち下がりの逆) |
- レジスタ ACSR
bit | ビット名 | 機能 |
---|---|---|
7 | ACD | アナログコンパレータ禁止。 コンパレータを使わない場合はスリープに入る前にセットすると消費電力削減に役立つ |
6 | ACBG | 基準電圧選択(mega/tinyシリーズのみ)。このbitのセットでAIN0の変わりに内部基準電圧(1.23V)が使用されます。 |
5 | ACO | アナログコンパレータ出力:コンパレータ出力がそのまま現れます。 |
4 | ACI | アナログコンパレータ割り込み要求フラグ |
3 | ACIE | アナログコンパレータ割り込み許可 |
2 | ACIC | アナログコンパレータ捕獲起動許可。Timer1の入力捕獲をアナログコンパレータで作動させる |
1 | ACIS1 | 割り込み選択(上記参照) |
0 | ACIS0 | 割り込み選択(上記参照) |
サンプルプログラム
アナログコンパレータ割り込みも使っています。
/* アナログコンパレータはPORTB.2pin電圧がPORTB.3pinより高くなると割り込みを発生し、 割り込みルーチンが動作しPORTBに接続したLEDが点灯します。 7/00 Leitner Harald , 01/05 modified by anonymous@2ch.net */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ANALOG_COMP_vect) { PORTB=~0x01; /* PORTB-PB0の点灯 */ } int main( void ) { DDRB=~0b00000110; /* PORTB-pin 2/3が入力、その他は出力*/ PORTB = 0xFF; /* 入力ポートはpullup */ ACSR = _BV(ACIE)|_BV(ACIS1)|_BV(ACIS1); /* コンパレータ初期化 */ sei(); for (;;){} }
このプラグラムはAIN0とAIN1を比較します。AIN0の電圧がAIN1より高ければ割り込みルーチンが実行され、PORTB-PB0に接続されたLEDが点灯します。割り込み許可はレジスタACSR内のビットACIEをセットすることで設定できます。もちろんsei();をお忘れなく。
megaシリーズ補足
megaシリーズではさらにレジスタSFIORのbit-ACMEをonにして、ADCを無効にすると、ADC用のマルチプレクサでアナログコンパレータの入力を8本の入力から切り替え使用することが出来ます。WinAVRでは以下のように書けます。詳細は各デバイスのデータシートをお読みください。
SFIOR |= _BV(ACME); /* SFIOR-ACME=1 */ ADCSRA &= ~_BV(ADEN); /* ADCを休止 */ ADMUX = ADMUX & 0b11111000 | 3; /* ch3をアナログコンパレータへ */