トップ 新規 一覧 検索 ヘルプ RSS ログイン

Getting Started Notes - Analog Comparatorの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{lastmodified}}

!!!アナログコンパレータ
{{outline}}

!!概要
アナログコンパレータは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, 割り込み選択(上記参照)

//!!{{span ,サンプルプログラム}}
!!サンプルプログラム
アナログコンパレータ割り込みも使っています。

 /*
 アナログコンパレータは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をアナログコンパレータへ */