avr單片機(jī)模擬比較器初始化配置及說明
上的電壓要高時,模擬比較器的輸出 ACO 即置位。比較器的輸出可用來觸發(fā)定時器 / 計(jì)
數(shù)器 1 的輸入捕捉功能。此外,比較器還可觸發(fā)自己專有的、獨(dú)立的中斷。用戶可以選擇
比較器是以上升沿、下降沿還是交替變化的邊沿來觸發(fā)中斷。
/*
特殊功能 IO 寄存器- SFIOR
7 6 5 4 3 2 1 0
ADTS2 ADTS1 ADTS0 – ACME PUD PSR2 PSR10
Bit 3 – ACME: 模擬比較器多路復(fù)用器使能
當(dāng)此位為邏輯 "1” ,且ADC 處于關(guān)閉狀態(tài) (ADCSRA 寄存器的 ADEN 為 "0”) 時,ADC 多
路復(fù)用器為模擬比較器選擇負(fù)極輸入。當(dāng)此位為 "0” 時, AIN1 連接到比較器的負(fù)極輸入
端。
模擬比較器控制和狀態(tài)寄存器-ACSR
7 6 5 4 3 2 1 0
ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0
Bit 7 – ACD: 模擬比較器禁用
ACD 置位時,模擬比較器的電源被切斷。可以在任何時候設(shè)置此位來關(guān)掉模擬比較器。這
可以減少器件工作模式及空閑模式下的功耗。改變 ACD 位時,必須清零 ACSR 寄存器的
ACIE 位來禁止模擬比較器中斷。否則 ACD 改變時可能會產(chǎn)生中斷。
Bit 6 – ACBG: 選擇模擬比較器的能隙基準(zhǔn)源
ACBG 置位后,模擬比較器的正極輸入由能隙基準(zhǔn)源所取代。否則,AIN0 連接到模擬比
較器的正極輸入。見 P40 “ 片內(nèi)基準(zhǔn)電壓 ” 。
Bit 5 – ACO: 模擬比較器輸出
模擬比較器的輸出經(jīng)過同步后直接連到 ACO。同步機(jī)制引入了 1-2 個時鐘周期的延時。
Bit 4 – ACI: 模擬比較器中斷標(biāo)志
當(dāng)比較器的輸出事件觸發(fā)了由ACIS1 及 ACIS0 定義的中斷模式時,ACI 置位。如果 ACIE
和 SREG 寄存器的全局中斷標(biāo)志 I 也置位,那么模擬比較器中斷服務(wù)程序即得以執(zhí)行,同
時 ACI 被硬件清零。 ACI 也可以通過寫 "1” 來清零。
Bit 3 – ACIE: 模擬比較器中斷使能
當(dāng) ACIE 位被置 "1” 且狀態(tài)寄存器中的全局中斷標(biāo)志 I 也被置位時,模擬比較器中斷被激
活。否則中斷被禁止。
Bit 2 – ACIC: 模擬比較器輸入捕捉使能
ACIC 置位后允許通過模擬比較器來觸發(fā)T/C1 的輸入捕捉功能。此時比較器的輸出被直接
連接到輸入捕捉的前端邏輯,從而使得比較器可以利用 T/C1 輸入捕捉中斷邏輯的噪聲抑
制器及觸發(fā)沿選擇功能。 ACIC 為 "0” 時模擬比較器及輸入捕捉功能之間沒有任何聯(lián)系。
為了使比較器可以觸發(fā) T/C1 的輸入捕捉中斷,定時器中斷屏蔽寄存器 TIMSK 的 TICIE1
必須置位。
Bits 1, 0 – ACIS1, ACIS0: 模擬比較器中斷模式選擇
這兩位確定觸發(fā)模擬比較器中斷的事件。
ACIS1/ACIS0 設(shè)置
ACIS1 ACIS0 中斷模式
0 0 比較器輸出變化即可觸發(fā)中斷
0 1 保留
1 0 比較器輸出的下降沿產(chǎn)生中斷
1 1 比較器輸出的上升沿產(chǎn)生中斷
需要改變 ACIS1/ACIS0 時,必須清零 ACSR 寄存器的中斷使能位來禁止模擬比較器中
斷。否則有可能在改變這兩位時產(chǎn)生中斷。
模擬比較器多工輸入
可以選擇 ADC7..0 之中的任意一個來代替模擬比較器的負(fù)極輸入端。ADC 復(fù)用器可用來
完成這個功能。當(dāng)然,為了使用這個功能首先必須關(guān)掉 ADC。如果模擬比較器復(fù)用器使
能位 (SFIOR 中的ACME) 被置位,且 ADC 也已經(jīng)關(guān)掉 (ADCSRA 寄存器的ADEN 為 0) ,
則可以通過 ADMUX 寄存器的 MUX2..0 來選擇替代模擬比較器負(fù)極輸入的管腳,
如果 ACME 清零或 ADEN 置位,則模擬比較器的負(fù)極輸入為 AIN1。
模擬比較器復(fù)用輸入
ACME ADEN MUX2..0 模擬比較器負(fù)極輸入
0 x xxx AIN1
1 1 xxx AIN1
1 0 000 ADC0
1 0 001 ADC1
1 0 010 ADC2
1 0 011 ADC3
1 0 100 ADC4
1 0 101 ADC5
1 0 110 ADC6
1 0 111 ADC7
*/
#include
#include
#pragma interrupt_handler ANA_COMP_inter:iv_ANA_COMP
#pragma interrupt_handler Timer1_CAPT:iv_TIMER1_CAPT
unsigned int ANA_COMP_fun=0;
unsigned int T1_CAPT=0;
void T1_capt_init(void)
{
TCNT1=500;//可以賦值,也可以不用。默認(rèn)是0
TCCR1A=0x00; //普通端口操作
TCCR1B|=0X04;//TCCR1B=0X03;256分頻.
TCCR1B|=0x80;//ICNC1:1使能噪聲捕捉功能
TCCR1B|=1<
}
void ANA_COMP_init(unsigned char mode,unsigned char ANI1_select)
{
//SFIOR|=1
switch(mode)
{
case 0:ACSR&=~((1
{
switch(ANI1_select)
{
case 1:SFIOR|=1
T1_capt_init();
// 如果要用到邊沿觸發(fā)功能,就用用到T/C1 的輸入捕捉功能中的觸發(fā)沿選擇功能
//如果不用邊沿觸發(fā)功能,也不用T/C1 的輸入捕捉功能,一下兩行不用,就屏蔽掉吧。
ACSR|=1
}
SREG|=0x80; //開放全局中斷
}
void ANA_COMP_inter()
{
ANA_COMP_fun++;
}
void Timer1_CAPT()
{
T1_CAPT=ICR1;
}
評論