AVR模擬比較器范例
AVR模擬比較器范例--AVR的模擬比較器模塊可以用來比較接在AIN0(mega16PB2的第二功能)和AIN1(PB3)兩個引腳的電壓大小。
程序操作流程:初始化>>開中斷>>中斷服務程序判斷,比較結果將會同步到
模擬比較器控制和狀態(tài)寄存器-ACSR的第五位ACO,檢測ACO的值就可以得出比較結果。AIN0AIN1(ACO=1)
//ICC-AVR
//Target:M16
//Crystal:7.3728MHz
//AVR模擬比較器使用范例
#include
#include
#include"delay.h"
//管腳定義
#defineLED00//PB0
#defineAIN_P2//PB2(AIN0)
#defineAIN_N3//PB3(AIN1)
//宏定義
#defineLED0_ON()PORTB|=(1<
//常量定義
/*
模擬比較器的正輸入端由ACBG位決定,=0選擇AIN0引腳,=1選擇1.23V內部能隙基準源
模擬比較器多工輸入(不常用,因為ADC將無法使用)
可以選擇ADC7..0之中的任意一個來代替模擬比較器的負極輸入端。
ADC復用器可用來完成這個功能。
當然,為了使用這個功能首先必須關掉ADC。
如果模擬比較器復用器使能位(SFIOR中的ACME)被置位,且ADC也已經(jīng)關掉(ADCSRA寄存器的ADEN為0),
則可以通過ADMUX寄存器的MUX2..0來選擇替代模擬比較器負極輸入的管腳,
如果ACME清零或ADEN置位,則模擬比較器的負極輸入為AIN1。
*/
#defineAC_ADC00x00//ADC0
#defineAC_ADC10x01//ADC1
#defineAC_ADC20x02//ADC2
#defineAC_ADC30x03//ADC3
#defineAC_ADC40x04//ADC4
#defineAC_ADC50x05//ADC5
#defineAC_ADC60x06//ADC6
#defineAC_ADC70x07//ADC7
voidport_init(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=~((1<上拉電阻。
DDRB=(1<
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
}
//初始化的步驟,關中斷,更改ACSR的值,配置模擬比較器,開中斷。
//Comparatorinitialize
//triggeron:Outputtoggle
voidcomparator_init(void)
{
ACSR=ACSR&0xF7;//ensureinterruptisoffbeforechanging
//上面一句會使ACIE為零,不允許中斷
ACSR=(1/使能模擬比較器中斷,比較器輸出變化即可觸發(fā)中斷,AIN0為正輸入端,AIN1為負輸入端。
}
#pragmainterrupt_handlerana_comp_isr:17
voidana_comp_isr(void)
{
//analogcomparatorcompareevent
//硬件自動清除ACI標志位
delay_us(10);
if((ACSR&(1/Bit5ACO:模擬比較器輸出模擬比較器的輸出經(jīng)過同步后直接連到ACO。
LED0_ON();//如果AIN0else
LED0_OFF();//否則LED滅
delay_ms(200);//當電壓差接近0V時,模擬比較器會產(chǎn)生臨界抖動,故延時200mS令肉眼能看到
}
//callthisroutinetoinitializeallperipherals
voidinit_devICes(void)
{
//stoperrantinterruptsuntilsetup
CLI();//dISAbleallinterrupts
port_init();
comparator_init();
MCUCR=0x00;
GICR=0x00;
TIMSK=0x00;//timerinterruptsources
SEI();//re-enableinterrupts
//allperipheralsarenowinitialized
}
voidmain(void)
{
init_devices();
while(1)
;
}
--------------------------------------------------------------------------------
/*
程序測試:
VCCVCC
||
||||
AIN0--|W||W|--AIN1PB0---R---LED--
|||||
|||
GNDGNDGND
兩個電位器,一端接VCC,一端接地,構成電位器分壓電路
AIN0和AIN1都分別接到電位器的中心抽頭。
PBO輸出串電阻驅動LED,高電平有效。
然后分別旋轉電位器,增減抽頭的電壓,將會發(fā)現(xiàn)PB0的輸出(LED0)會根據(jù)AIN0/AIN1的電壓關系變動
由于電源紋波,IO電流及外界干擾的影響,當電壓差接近0V時,模擬比較器會產(chǎn)生臨界抖動,AIN0/AIN1對地并上小電容可以改善這種情況。
只有一個電位器時,可以變通
1可以使能ACBG,利用1.23V內部能隙基準源代替AIN0作模擬比較器的正輸入端。
ACSR=(1<2可以使能ADC的內部2.56V電壓基準,然后把AIN0或AIN1連接到PIN32AREF腳。
ADCSRA=(1
模擬比較器控制和狀態(tài)寄存器-ACSR
Bit7–ACD:模擬比較器禁用
模擬比較器上電默認是已經(jīng)工作中的,跟其他的模塊有所不同
ACD置位時,模擬比較器的電源被切斷??梢栽谌魏螘r候設置此位來關掉模擬比較器。
這可以減少器件工作模式及空閑模式下的功耗。
改變ACD位時,必須清零ACSR寄存器的ACIE位來禁止模擬比較器中斷。否則ACD改變時可能會產(chǎn)生中斷
Bit6–ACBG:選擇模擬比較器的能隙基準源
ACBG置位后,模擬比較器的正極輸入由1.23V能隙基準源所取代。否則,AIN0連接到模擬比較器的正極輸入。
Bit5–ACO:模擬比較器輸出
模擬比較器的輸出經(jīng)過同步后直接連到ACO。同步機制引入了1-2個時鐘周期的延時。
Bit4–ACI:模擬比較器中斷標志
當比較器的輸出事件觸發(fā)了由ACIS1及ACIS0定義的中斷模式時,ACI置位。
如果ACIE和SREG寄存器的全局中斷標志I也置位,那么模擬比較器中斷服務程序即得以執(zhí)行,同時ACI被硬件清零。
ACI也可以通過寫"1”來清零。
Bit3–ACIE:模擬比較器中斷使能
當ACIE位被置"1”且狀態(tài)寄存器中的全局中斷標志I也被置位時,模擬比較器中斷被激活。
否則中斷被禁止。
Bit2–ACIC:模擬比較器輸入捕捉使能
這個功能用于檢測一些微弱的觸發(fā)信號源,節(jié)省一個外部運放。
ACIC置位后允許通過模擬比較器來觸發(fā)T/C1的輸入捕捉功能。
此時比較器的輸出被直接連接到輸入捕捉的前端邏輯,從而使得比較器可以利用T/C1輸入捕捉中斷邏輯的噪聲抑制器及觸發(fā)沿選擇功能。
為了使比較器可以觸發(fā)T/C1的輸入捕捉中斷,定時器中斷屏蔽寄存器TIMSK的TICIE1必須置位。
ACIC為"0”時模擬比較器及輸入捕捉功能之間沒有任何聯(lián)系。
Bits1,0–ACIS1,ACIS0:模擬比較器中斷模式選擇
這兩位確定觸發(fā)模擬比較器中斷的事件。
ACIS1ACIS0中斷模式
00比較器輸出變化即可觸發(fā)中斷
01保留
10比較器輸出的下降沿產(chǎn)生中斷
11比較器輸出的上升沿產(chǎn)生中斷
需要改變ACIS1/ACIS0時,必須清零ACSR寄存器的中斷使能位來禁止模擬比較器中斷。否則有可能在改變這兩位時產(chǎn)生中斷。
*/