打印
[Atmel]

用AtmelStudio6.2跑mega16例程(12):模拟比较器

[复制链接]
1369|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mega16可以实模拟比较器。这可以省去一个外部比较器,而就用一个单片机

要想配置成比较器,必须熟两个寄存器ACSR和SFIOR

下面是ACSR介绍:

• 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: 模拟比较器中断模式选择
这两位确定触发模拟比较器中断的事件。Table 79 给出了不同的设置。

ACIS1 ACIS0 中断模式
0 0 比较器输出变化即可触发中断
0 1 保留
1 0 比较器输出的下降沿产生中断
1 1 比较器输出的上升沿产生中断
需要改变ACIS1/ACIS0 时,必须清零ACSR 寄存器的中断使能位来禁止模拟比较器中
断。否则有可能在改变这两位时产生中断。


特殊功能IO 寄存器- SFIOR
• Bit 7:5 – ADTS2:0: ADC 自动触发源
若ADCSRA 寄存器的ADATE 置位,ADTS 的值将确定触发ADC 转换的触发源;否则,
ADTS的设置没有意义。被选中的中断标志在其上升沿触发ADC转换。从一个中断标志清
零的触发源切换到中断标志置位的触发源会使触发信号产生一个上升沿。如果此时ADCSRA 寄存器的ADEN 为1,ADC 转换即被启动。切换到连续运行模式(ADTS[2:0]=0)
时,即使ADC 中断标志已经置位也不会产生触发事件。

ADTS2 ADTS1 ADTS0 触发源
0 0 0 连续转换模式
0 0 1 模拟比较器
0 1 0 外部中断请求0
0 1 1 定时器/ 计数器0 比较匹配
1 0 0 定时器/ 计数器0 溢出
1 0 1 定时器/ 计数器比较匹配B
1 1 0 定时器/ 计数器1 溢出
1 1 1 定时器/ 计数器1 捕捉事件


明白以上寄存器,则以下程序就好办了:

/*
* GccApplication19.c
*
* Created: 2014-9-11 21:24:58
*  Author: Administrator
*/


#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
#define  redLED      5//PORTD.5
#define  greenLED    6//PORTD.6
int main(void)
{
        DDRD=0xFF;
        PORTD=0xFF;
        ACSR=0x00;
        SFIOR=0x00;
        while(1)
        {
                if((ACSR&(1<<5))==0)
                {
                        //redLED=0;  //AIN1>AIN0,低电压报警
                        //greenLED=1;
                        PORTD |= (1<<6);
                        PORTD &=~(1<<5);
                }
                else
                {
                        //redLED=1;  //AIN1<AIN0,电压正常
                        //greenLED=0;
                        PORTD &=~(1<<6);
                        PORTD |=(1<<5);
                }
        }
}

运行仿真当上边的低下边红灯亮,当下边等于或高于上边绿灯亮。






相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6955

帖子

67

粉丝