6.1 模擬比較器實驗
6.1.1 實例功能
模擬比較器和模數(shù)轉(zhuǎn)換ADC是單片機內(nèi)部最常見的兩種支持模擬信號輸入的功能接口。大部分AVR都具備這兩種類型的接口。本實例將以ATmage16芯片為例,介紹模擬比較器的使用方法,在下一個實例中介紹模數(shù)轉(zhuǎn)換ADC。
使用模擬比較器可以實現(xiàn)單片機系統(tǒng)電源電壓的檢測,更巧妙的應用是利用模擬比較器和一些簡單的外圍電路,設計簡單的模數(shù)轉(zhuǎn)換ADC。
本實例實現(xiàn)利用模擬比較器比較某一點電壓與內(nèi)部模擬比較器參考電壓的高低。共有3個功能模塊,分別描述如下:
● 單片機系統(tǒng):使用ATmega16單片機的模擬比較器比較某一點的電壓與參考電壓的關系。
● 外圍電路:利用電阻設計的分壓電路。
● 軟件程序:熟悉掌握ATmega16單片機的模擬比較器的使用。
通過本實例的學習,掌握相關電路設計,并掌握以下知識點:
● 了解單片機的模擬比較器。
● 了解單片機的模擬比較器的使用。
● 掌握單片機模擬比較器的編程。
6.1.2、器件和原理
1、模擬比較器的介紹
ATmega16的模擬比較器可以實現(xiàn)對兩個輸入端:正極AIN0和負極AIN1(分別對應于ATmage16的引腳PB2、PB3)的模擬輸入電壓進行比較。當AIN0上的電壓高于AIN1的電壓時,模擬比較器輸出ACO被設為“1”。比較器的輸出還可以被設置作為定時計數(shù)器1輸入捕獲功能的觸發(fā)信號。此外,比較器的輸出可以觸發(fā)一個獨立的模擬比較器中斷。用戶可以選擇使用比較器輸出的上升沿、下降沿或事件觸發(fā)作為模擬比較器中斷的觸發(fā)信號。
2、與模擬比較器相關的寄存器
與模擬比較器相關的寄存器是SFIOR、ACSR。用戶通過這兩個寄存器的相關位實現(xiàn)對模擬比較器的設置和控制。
ACSR是模擬比較器主要的控制寄存器,其中各個位的作用如下:
當該位設為“1”時,提供給模擬比較器的電源關閉。該位可以在任何時候被置位,從而關閉模擬比較器。在MCU閑置模式,且無需將模擬比較器作為喚醒源的情況下,關閉模擬比較器可以減少電源的消耗。要改變ACD位的設置時,應該先將寄存器ACSR中的ACIE位清零,把模擬比較器中斷禁止掉。否則,在改變ADC位設置時會產(chǎn)生一個中斷。
當該位為“1”時,芯片內(nèi)部一個固定的能隙(Bandgap)參考電源1.22V將代替AIN0的輸入,作為模擬比較器的正極輸入端。當該位被清零時,AIN0的輸入仍然作為模擬比較器的正極輸入端。
模擬比較器的輸出信號經(jīng)過同步處理后直接與ACO相連。由于經(jīng)過同步處理,ACO與模擬比較器的輸出之間,會有1~2個時鐘的延時。
當模擬比較器的輸出事件符合中斷觸發(fā)條件時(中斷觸發(fā)條件由ACIS1 和ACIS0 定義),ACI由硬件置“1”。若ACIE 位置“1”,且狀態(tài)寄存器中的I位為“1”時,MCU響應模擬比較器中斷。當轉(zhuǎn)入模擬比較中斷處理向量時,ACI被硬件自動清空。此外,也可使用軟件方式清零ACI:對ACI標志位寫入邏輯“1”來清零該位。
當ACIE位設為“1”,且狀態(tài)寄存器中的I位被設為“1”時,允許模擬比較器中斷觸發(fā)。當ACIE被清“0”時,模擬比較器中斷被禁止。
當該位設置為“1”時,定時計數(shù)器1的輸入捕獲功能將由模擬比較器的輸出來觸發(fā)。在這種情況下,模擬比較器的輸出直接連到輸入捕獲前端邏輯電路,從而能利用定時器/計數(shù)器1輸入捕獲中斷的噪聲消除和邊緣選擇的特性。當該位被清零時,模擬比較器和輸入捕獲功能之間沒有聯(lián)系。要使能比較器觸發(fā)定時器/計數(shù)器1的輸入捕獲中斷,定時器中斷屏蔽寄存器(TIMSK)中 的TICIE1位必須被設置。
這2個位決定哪種模擬比較器的輸出事件可以觸發(fā)模擬比較器的中斷。不同的設置參見表6.1.1。
表6.1.1 模擬比較器中斷模式選擇 |
||
ACIS1 |
ACIS0 |
中 斷 模 式 |
0 |
0 |
比較器輸出的上升沿和下降沿都觸發(fā)中斷 |
0 |
1 |
保留 |
1 |
0 |
比較器輸出的下降沿觸發(fā)中斷 |
1 |
1 |
比較器輸出的上升沿觸發(fā)中斷 |
注意:當要改變ACIS1、ACIS0時,必須先清除ACSR寄存器中的中斷允許位,以禁止模擬比較器中斷;否則,當這些位被改變時,會發(fā)生中斷。
在本實例中,我們要使用模擬比較器,所以應當允許模擬比較器,即ACD應為0,選擇芯片內(nèi)部的固定能隙參考電源。即ACBG設置為1,我們不使用中斷和捕獲,所以不必理會與此相關的各位。
用戶可以選擇ADC7..0引腳中的任一路的模擬信號代替AIN1引腳,作為模擬比較器的反向輸入端。模數(shù)轉(zhuǎn)換的ADC多路復用器提供這種選擇的能力,但此時必須關閉芯片的ADC功能。當模擬比較器的多路選擇使能位(SFIOR中的ACME位)置“1”,同時ADC被關閉時(ADCSRA中的ADEN位置“0”),由寄存器ADMUX中的MUX[2:0]位所確定的引腳將代替AIN1作為模擬比較器的反向輸入端,如表6.1.2所示。如果ACME被清零,或ADEN被置1,則AIN1仍將為模擬比較器的反向輸入端。
表6.1.2 模擬比較器多路輸入選擇 |
|||
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 |
本實例中我們采用ADC0作為模擬比較器的反向輸入端,所以選擇ADMUX寄存器中的MUX2:0=0;
6.1.3、電路
本實例的電路包含分壓電路,下面的電路是電阻分壓電路,如下圖所示。
1、電路原理
在本實例中利用電位器(即可調(diào)電阻)組成分壓電路,單片機的PA0連接在電位器的動片引腳上,這個電路實際上相當于兩個電阻組成的串聯(lián)電路,只不過這兩個電阻的阻值是可變的,改變動片的位置,就可以改變PA0與地之間的電阻值,根據(jù)串聯(lián)電路分壓的原理,當動片移動時,PA0處的電壓就會發(fā)生變化。
2、電路連接
電路電位器的動片引腳連接到單片機的PA0口,作為模擬比較器的反向輸入端。
6.1.4、程序設計
1、程序功能
程序的功能是使用單片機的模擬比較器比較PA0口的電壓與單片機內(nèi)部的固定能隙電壓(1.22V)之間的高低,如果PA0的電壓低于1.22V,則D1燈點亮,否則D2燈點亮。
2函數(shù)說明
本程序有兩個功能函數(shù),分別是:
● 端口初始化函數(shù),設置連接D1、D2兩個LED的端口PB0、PB1為輸出口,輸出低電平,使兩個LED都處于熄滅狀態(tài)。
● 模擬比較器初始化函數(shù)
設置與模擬比較器相關的寄存器,使模擬器按照一定的方式工作。
3、使用WINAVR開發(fā)環(huán)境,我們使用的是外部12M的晶振,所以需要將makefile文件中的時鐘頻率修改為12M。另外在程序燒錄到單片機的時候,熔絲位也要選擇為外部12M晶振(注意是晶振,不是外部振蕩器,一定不要選擇錯了,否則會導致單片機不能再燒寫程序)。
4、程序代碼
[code="CPP"]
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> //中斷函數(shù)頭文件
//函數(shù)聲明
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.22V,D1點亮,
}
else
{
PORTB = 0X02; //高于1.22V,D2點亮,
}
}
}
//端口狀態(tài)初始化設置函數(shù)
void Port_Init()
{
PORTB = 0X00; //
DDRB |= (1 << PB0) | (1 << PB1); //PB0、PB1設置為輸出
}
//模擬比較器初始化函數(shù)
void Compare_Init()
{
SFIOR |= (1 << ACME); //使用ADC多路復用器選擇ADC的模擬輸入端口
//作為模擬比較器反向輸入端的信號源。
//同時選擇ADC的ADC0作為輸入端,并且關閉AD轉(zhuǎn)換的使能
ACSR |= (1 << ACBG); //允許模擬比較器,AIN0設置為內(nèi)部固定能隙參考電源1.22V
}
[/code]