上的电压要高时,模拟比较器的输出 ACO 即置位。比较器的输出可用来触发定时器 / 计
数器 1 的输入捕捉功能。此外,比较器还可触发自己专有的、独立的中断。用户可以选择
比较器是以上升沿、下降沿还是交替变化的边沿来触发中断。
/*
特殊功能 IO 寄存器- SFIOR
7 6 5 4 3 2 1 0
ADTS2 ADTS1 ADTS0 – ACME PUD PSR2 PSR10
Bit 3 – ACME: 模拟比较器多路复用器使能
当此位为逻辑 "1” ,且ADC 处于关闭状态 (ADCSRA 寄存器的 ADEN 为 "0”) 时,ADC 多
路复用器为模拟比较器选择负极输入。当此位为 "0” 时, AIN1 连接到比较器的负极输入
端。
模拟比较器控制和状态寄存器-ACSR
7 6 5 4 3 2 1 0
ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0
Bit 7 – ACD: 模拟比较器禁用
ACD 置位时,模拟比较器的电源被切断。可以在任何时候设置此位来关掉模拟比较器。这
可以减少器件工作模式及空闲模式下的功耗。改变 ACD 位时,必须清零 ACSR 寄存器的
ACIE 位来禁止模拟比较器中断。否则 ACD 改变时可能会产生中断。
Bit 6 – ACBG: 选择模拟比较器的能隙基准源
ACBG 置位后,模拟比较器的正极输入由能隙基准源所取代。否则,AIN0 连接到模拟比
较器的正极输入。见 P40 “ 片内基准电压 ” 。
Bit 5 – ACO: 模拟比较器输出
模拟比较器的输出经过同步后直接连到 ACO。同步机制引入了 1-2 个时钟周期的延时。
Bit 4 – ACI: 模拟比较器中断标志
当比较器的输出事件触发了由ACIS1 及 ACIS0 定义的中断模式时,ACI 置位。如果 ACIE
和 SREG 寄存器的全局中断标志 I 也置位,那么模拟比较器中断服务程序即得以执行,同
时 ACI 被硬件清零。 ACI 也可以通过写 "1” 来清零。
Bit 3 – ACIE: 模拟比较器中断使能
当 ACIE 位被置 "1” 且状态寄存器中的全局中断标志 I 也被置位时,模拟比较器中断被激
活。否则中断被禁止。
Bit 2 – ACIC: 模拟比较器输入捕捉使能
ACIC 置位后允许通过模拟比较器来触发T/C1 的输入捕捉功能。此时比较器的输出被直接
连接到输入捕捉的前端逻辑,从而使得比较器可以利用 T/C1 输入捕捉中断逻辑的噪声抑
制器及触发沿选择功能。 ACIC 为 "0” 时模拟比较器及输入捕捉功能之间没有任何联系。
为了使比较器可以触发 T/C1 的输入捕捉中断,定时器中断屏蔽寄存器 TIMSK 的 TICIE1
必须置位。
Bits 1, 0 – ACIS1, ACIS0: 模拟比较器中断模式选择
这两位确定触发模拟比较器中断的事件。
ACIS1/ACIS0 设置
ACIS1 ACIS0 中断模式
0 0 比较器输出变化即可触发中断
0 1 保留
1 0 比较器输出的下降沿产生中断
1 1 比较器输出的上升沿产生中断
需要改变 ACIS1/ACIS0 时,必须清零 ACSR 寄存器的中断使能位来禁止模拟比较器中 T1_capt_init(); void ANA_COMP_inter()
断。否则有可能在改变这两位时产生中断。
模拟比较器多工输入
可以选择 ADC7..0 之中的任意一个来代替模拟比较器的负极输入端。ADC 复用器可用来
完成这个功能。当然,为了使用这个功能首先必须关掉 ADC。如果模拟比较器复用器使
能位 (SFIOR 中的ACME) 被置位,且 ADC 也已经关掉 (ADCSRA 寄存器的ADEN 为 0) ,
则可以通过 ADMUX 寄存器的 MUX2..0 来选择替代模拟比较器负极输入的管脚,
如果 ACME 清零或 ADEN 置位,则模拟比较器的负极输入为 AIN1。
模拟比较器复用输入
ACME ADEN MUX2..0 模拟比较器负极输入
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;//可以赋值,也可以不用。默认是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<
if(ANI1_select)//如果ANI1_select=0,默认的是模拟比较器的负极输入端
{
switch(ANI1_select)
{
case 1:SFIOR|=1<
}
// 如果要用到边沿触发功能,就用用到T/C1 的输入捕捉功能中的触发沿选择功能
//如果不用边沿触发功能,也不用T/C1 的输入捕捉功能,一下两行不用,就屏蔽掉吧。
ACSR|=1<
}
SREG|=0x80; //开放全局中断
}
{
ANA_COMP_fun++;
}
void Timer1_CAPT()
{
T1_CAPT=ICR1;
}
上一篇:hex的反汇编文件译码及说明(获得函数地址)
下一篇:avr单片机电源管理及其睡眠模式配置说明
推荐阅读最新更新时间:2024-03-16 15:10