原理圖
ADC的快速回顧
大多數(shù)人認(rèn)為模擬領(lǐng)域已經(jīng)落后于他們,但事實(shí)是模擬領(lǐng)域從未如此強(qiáng)大!隨著物聯(lián)網(wǎng)的興起和傳感器的生產(chǎn),全球每秒都在進(jìn)行數(shù)十億的模擬讀數(shù)。這只是微控制器生產(chǎn)商將ADC外設(shè)直接集成到其器件中的眾多原因之一。
通常測量ADC
由于ADC是數(shù)字的,模擬信號被量化為離散的步驟
這意味著ADC只能準(zhǔn)確無誤地實(shí)現(xiàn)它們的位寬(即10位ADC)測量特定電壓電平
最大數(shù)字值等于ADC 正參考電壓(通常為VCC)
最小數(shù)字值等于ADC 負(fù)參考(通常為GND)
ADC需要時(shí)間來轉(zhuǎn)換信號
在ATmega168中,ADC具有以下特性:
10位分辨率(+ Vref和-Vref之間的1024個(gè)離散電壓電平)
精度為2LSB(高8位精度保證)
高達(dá)15,000個(gè)樣本/秒
6個(gè)多路復(fù)用輸入源
1.1V 帶隙參考
配置ADC
我們可以使用之前ADC,需要配置用于ADC測量的外設(shè)和I/O引腳。
左對齊還是右對齊?
當(dāng)ADC完成轉(zhuǎn)換操作后,結(jié)果存儲在一對中8位寄存器(10位結(jié)果不適合單個(gè)8位寄存器)。由于ATmega是原生的8位器件,因此使用8位ADC不如10位結(jié)果更有意義,但這會降低結(jié)果的分辨率。但是,必須正確讀取10位數(shù)的8位結(jié)果,否則結(jié)果將不正確。為此,我們需要讀取前8位(位9-2),而不是后8位。使用ADLAR位很容易實(shí)現(xiàn),當(dāng)設(shè)置為1時(shí),將使ADC結(jié)果保持正確。這意味著我們不需要讀取結(jié)果寄存器(ADCH和ADCL)并進(jìn)行一些操作,而是直接讀取ADCH并忘記ADCL。
配置I/O端口
現(xiàn)在我們可以直接讀取ADCH以獲得8位結(jié)果,而不必?fù)?dān)心位操作(在分辨率的成本),我們現(xiàn)在需要配置我們的模擬引腳。默認(rèn)情況下,ATmega168上的I/O引腳配置為數(shù)字引腳,這意味著它們只能處理1和0。因此,要將輸入配置為模擬引腳,我們使用DIDR0寄存器,它代表數(shù)字輸入禁用寄存器。不幸的是,并非每個(gè)引腳都具有模擬輸入的能力,因此請務(wù)必注意帶有標(biāo)簽ADCx的引腳。例如,引腳23至28是ATmega168上的模擬輸入引腳。
配置ADC模塊
配置ADC的最后階段包括打開ADC,設(shè)置預(yù)縮放器時(shí)間以及確定ADC的參考值。
通過將ADCSRA寄存器中的ADEN位置1來打開ADC模塊。
在大多數(shù)情況下,預(yù)縮放器不是太重要了,為了簡單起見,我們將預(yù)縮放器設(shè)置為其最大值(設(shè)置ADCSRA寄存器中的所有ADPSx位)。
ATmega168上的ADC可以介于0V和某個(gè)參考電壓之間,通常設(shè)置為VCC。由于大多數(shù)電路都是這種情況,我們需要將Aref引腳連接到也接地的電容,我們還需要將REFSx位設(shè)置為使用AVCC作為參考。
使用ADC
使用ADC非常簡單。選擇將從中取出模擬讀數(shù)的通道,然后,為了開始轉(zhuǎn)換,ADSC位(在ADCSRA中找到)將打開。轉(zhuǎn)換完成后,ADC硬件會自動清零ADSC位。
通過設(shè)置ADMUX寄存器中的相應(yīng)多路復(fù)用器位MUX3-MUX0來選擇要讀取的模擬引腳。
軟件示例
此示例從ADC0(PC0,引腳23)讀取模擬值并進(jìn)行比較他們到一個(gè)特定的價(jià)值。如果模擬讀數(shù)超出指定值(定義為TRIGPOINT),LED(連接到PD0,引腳2)將打開。一旦ADC讀數(shù)低于指定值,LED就會關(guān)閉!
/*
* AVR IO.c
*
* Created: 03/01/2018 11:25:21
* Author : RobinLaptop
*/
#define F_CPU 1000000UL
#define TRIGPOINT 128
#include
#include
int main(void)
{
// Configure PORT D bit 0 to an output
DDRD = 0b00000001;
// Configure PORT C bit 0 to an input
DDRC = 0b00000000;
// Configure ADC to be left justified, use AVCC as reference, and select ADC0 as ADC input
ADMUX = 0b01100000;
// Enable the ADC and set the prescaler to max value (128)
ADCSRA = 0b10000111;
// Main program loop
while (1)
{
// Start an ADC conversion by setting ADSC bit (bit 6)
ADCSRA = ADCSRA | (1 《《 ADSC);
// Wait until the ADSC bit has been cleared
while(ADCSRA & (1 《《 ADSC));
if(ADCH 》 TRIGPOINT)
{
// Turn LED on
PORTD = PORTD | (1 《《 PD0);
}
else
{
// Turn LED off
PORTD = PORTD & ~(1 《《 PD0);
}
}
}
結(jié)論
本文僅介紹ADC背后的基礎(chǔ)知識,但我們已經(jīng)開始從現(xiàn)實(shí)世界中進(jìn)行模擬測量。當(dāng)然,您可以閱讀數(shù)據(jù)表并了解其他更高級的功能,包括觸發(fā)和其他電壓參考。但就目前而言,這應(yīng)該為您提供足夠的知識,開始制作需要讀取模擬值的AVR項(xiàng)目!
-
AVR
+關(guān)注
關(guān)注
11文章
1125瀏覽量
78841 -
adc
+關(guān)注
關(guān)注
99文章
6533瀏覽量
545525
發(fā)布評論請先 登錄
相關(guān)推薦
評論