原创 AVR128学习笔记之模拟比较器

2011-2-26 17:04 1971 9 9 分类: MCU/ 嵌入式

说明:AVR128内部有模拟比较器,模拟比较器概念:(来自百度百科)

    将模拟量与一标准值进行比较。当高于该值时,输出高(或低)电平,反之,则输出低(或高)电平。例如,将一温度信号接于运放的同相端,反相端接一电压基准(代表某一温度),当温度高于基准值时,运放输出高电平,控制加热器关闭,反之当温度信号低于基准值时,运放输出低电平,将加热器接通。这一运放就是一个简单的比较器,因为输入与输出同相,称为同相比较器。
  有的模拟比较器具有迟滞回线,称为迟滞比较器,用这种比较器,有助于消除寄生在信号上的干扰。

代码实例:内部晶振8M,编译环境ICCAVR
实验现象:数码管显示的的值将会加一
这里我用了ADC通道的ADC0来代替了模拟比较器输入的负值端。
具体替代实现注意:1、SFIOR寄存器的ACME位置位;2、ADCSRA寄存器的ADEN为0.

#include<iom128v.h>
#include<macros.h>

#include"Mydelay.h"
#include"shumaguan.h"

#define uint  unsigned int
#define uchar unsigned char

volatile uchar num=2; //中断产生后会加一

void init_analog_comparator(void)
{
 SFIOR |= BIT(ACME);
 ADCSRA &= ~BIT(ADEN);//关闭ADC并且SFIOR中的ACME置位,选择ADC通道来代替模拟比较器的负极输入
 ACSR |= BIT(ACD) |BIT(ACIE);
 //禁用比较器,打开中断使能,模式一,输出变化触发中断
}

void start(void)   //启动模拟比较器
{
 ACSR |= BIT(ACD);
}

void init_port(void)

 DDRE &= ~BIT(PE2)|BIT(PE3);
 PORTE |= BIT(PE2)|BIT(PE3);
}

void main(void)
{
 CLI();  //禁止所有中断
 
 init_port();
 init_analog_comparator();
 HC_595_init();

 MCUCR = 0X00;
 
 SEI();  //打开所有中断
 
 start();  //开启模拟比较器
 
 while(1) //等待中断发生
 {
   Seg7_Led_display(num);
 }
}

//模拟比较器的中断服务程序
#pragma interrupt_handler analog_comparator:24
void analog_comparator(void)
{
 num++;
}

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条