所謂模擬比較器就是模擬電平之間的比較,單片機的內(nèi)部的比較器一般都很簡單,沒有分立元件組成的比較器精準度高,但是小東東也有大用途,可以用他來檢測單片機的電壓跌落,也可以比較從傳感器采集過的模擬信號……正好ATmega8515內(nèi)部有模擬比較器,所以懶貓決定來試一下這個功能。Analog Comparator
關(guān)于ATmega8515內(nèi)部比較器由PB2(AIN0)與PB3(AIN1)口輸入,模擬比較器對正極 AIN0 的值與負極 AIN1 的值進行比較。當 AIN0 上的電壓比負極 AIN1上的電壓要高時,模擬比較器的輸出 ACO 即置位。比較器的輸出可用來觸發(fā)定時器/計數(shù)器 1 的輸入捕捉功能。此外,比較器還可觸發(fā)自己專有的、獨立的中斷。我們也可以自己選擇比較器是以上升沿、下降沿還是交替變化的邊沿來觸發(fā)中斷。關(guān)于這些可以參看寄存器ACSR.
下面給出程序:
[code="CPP"]
/************************************************
//文件名稱:Analog_Comparator.c
//功 能:學習使用單片機內(nèi)部的模擬比較器
//作 者:懶貓愛飛
//建立日期:2010.11.02
//備 注:MCU-ATmega8515 開發(fā)環(huán)境-winavr100110
************************************************/
#include <avr/io.h>
#include <inttypes.h> //關(guān)于數(shù)據(jù)類型的一些定義
#include <stdint.h> //同樣是一些數(shù)據(jù)類型的定義
#include <avr/interrupt.h>
#include <util/delay.h>
#define LED_ON(N) PORTC &= ~_BV(N) /*第N個LED燈亮*/
#define LED_OFF(N) PORTC |= _BV(N) /*第N個LED燈滅*/
/************************************************
//函數(shù)名稱:void port_init(void)
//功 能:端口初始化
//入口參數(shù):NULL
//出口參數(shù):NULL
//備 注:NULL
************************************************/
void port_init(void)
{
PORTA = 0x00;
DDRD = 0x00;
PORTB = 0x00; //關(guān)閉弱上拉,
DDRB = 0x00; //PB2,PB3(AIN0/AIN1)設(shè)置為輸入
//PB3 AIN1 (Analog Comparator Negative Input)
//PB2 AIN0 (Analog Comparator Positive Input)
PORTC = 0xff;
DDRC = 0xff; //LED燈l輸出端口
}
/************************************************
//函數(shù)名稱:int main(void)
//功 能:主程序
//入口參數(shù):NULL
//出口參數(shù):0
//備 注:NULL
************************************************/
int main(void)
{
port_init();
SFIOR |= _BV(PUD); //禁止內(nèi)部上拉
ACSR |= _BV(ACIE); //允許模擬比較器是斷
sei();
while(1);
return 0;
}
/************************************************
//函數(shù)名稱:ISR(ANA_COMP_vect)
//功 能:模擬比較中斷處理程序
//入口參數(shù):中斷向量入口地址 ANA_COMP_vect
//出口參數(shù):NULL
//備 注:NULL
************************************************/
ISR(ANA_COMP_vect)
{
if(ACSR & _BV(ACO)) //檢測AC0位,判斷AN0電壓是否大于AN1電壓
{
LED_ON(0);
LED_OFF(1);
}
else
{
LED_ON(1);
LED_OFF(0);
}
}
[/code]
其測試電路圖如下:
仿真說明:當AIN1低于AIN0時L1(綠燈亮),當AIN1高于AIN0時L2亮(黃燈亮)。