模拟比较器

模拟比较器

 

模拟比较器对正极 AIN0 的值与负极 AIN1 的值进行比较。当 AIN0 上的电压比负极 AIN1上的电压要高时,模拟比较器的输出 ACO 即置位。比较器的输出可用来触发定时器 / 计数器 1 的输入捕捉功能。此外,比较器还可触发自己专有的、独立的中断。用户可以选择比较器是以上升沿、下降沿还是交替变化的边沿来触发中断。Figure 97 为比较器及其外围逻辑电路的框图。

 

模拟比较器_第1张图片

 

特殊功能IO寄存器- SFIOR

 模拟比较器_第2张图片

模拟比较器控制和状态寄存器-ACSR

 

• Bit 7 – ACD: 模拟比较器禁用
ACD 置位时,模拟比较器的电源被切断。可以在任何时候设置此位来关掉模拟比较器。这
可以减少器件工作模式及空闲模式下的功耗。改变 ACD 位时,必须清零 ACSR 寄存器的
ACIE 位来禁止模拟比较器中断。否则 ACD 改变时可能会产生中断。
• Bit 6 – ACBG: 选择模拟比较器的能隙基准源
ACBG 置位后,模拟比较器的正极输入由能隙基准源所取代。否则,AIN0 连接到模拟比
较器的正极输入。见 P39 “ 片内基准电压 ” 。
• 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 中断模式
00 比较器输出变化即可触发中断
01 保留
10 比较器输出的下降沿产生中断
11 比较器输出的上升沿产生中断

需要改变 ACIS1/ACIS0 时,必须清零 ACSR 寄存器的中断使能位来禁止模拟比较器中
断。否则有可能在改变这两位时产生中断。

 

可以选择 ADC7..0 之中的任意一个来代替模拟比较器的负极输入端。ADC 复用器可用来
完成这个功能。当然,为了使用这个功能首先必须关掉 ADC。如果模拟比较器复用器使
能位(SFIOR中的ACME)被置位,且ADC也已经关掉(ADCSRA寄存器的ADEN为0),
则可以通过 ADMUX 寄存器的 MUX2..0 来选择替代模拟比较器负极输入的管脚,详见
Table 80。如果 ACME 清零或 ADEN置位,则模拟比较器的负极输入为 AIN1。

Table 80.  模拟比较器复用输入
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 <avr/io.h>       

#include <util/delay.h>

#include <avr/interrupt.h>   //中断函数头文件

 

//函数声明

void Port_Init(void);   //端口初始化配置

void Compare_Init(void);  //模拟比较器初始化设置

 

int main(void)           

{

       Port_Init();

       Compare_Init();

      

      

      

       sei();          //使能全局中断 

      

       while(1)

       {

              if(ACSR & (1 << ACO))    //判断ADC0的电压是否大于1.22V

              {

                     PORTB = 0X01;       //低于1.22VD1点亮,

              }

              else

              {

                     PORTB = 0X02;     //高于1.22VD2点亮,

              }

       }

}

 

//端口状态初始化设置函数

void Port_Init()

{

       PORTB = 0X00;          //

       DDRB |= (1 << PB0) | (1 << PB1);   //PB0PB1设置为输出

      

}

 

//模拟比较器初始化函数

void Compare_Init()

{

       SFIOR |= (1 << ACME);  //使用ADC多路复用器选择ADC的模拟输入端口

                               //作为模拟比较器反向输入端的信号源。

                            //同时选择ADCADC0作为输入端,并且关闭AD转换的使能

       ACSR |= (1 << ACBG);   //允许模拟比较器,AIN0设置为内部固定能隙参考电源1.22V

}

 

 

你可能感兴趣的:(模拟比较器)