说明: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条评论)
登录后参与讨论