トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Getting Started Notes - Analog Comparator

最終更新時間: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をアナログコンパレータへ */