ARM筆記: ADC轉(zhuǎn)換器
S3C2440的CMOS模擬數(shù)字轉(zhuǎn)換器ADC可以對(duì)8通道模擬輸入信號(hào)進(jìn)行循環(huán)檢測(cè),S3C2440的ADC和觸摸屏公用一個(gè)ADC轉(zhuǎn)換器,所以學(xué)習(xí)ADC也是學(xué)習(xí)觸摸屏的基礎(chǔ)。
S3C2440ADC的主要特性如下:
●分辨率:10位
●最大轉(zhuǎn)換速率:500KSPS
●微分線性度誤差:±1.0 LSB
●積分線性度誤差:±2.0 LSB
●供電電壓:3.3V
●模擬輸入電壓范圍:0~3.3V
ADC原理
ADC是一種將模擬信號(hào)轉(zhuǎn)化為數(shù)字信號(hào)的方法,一般要經(jīng)過(guò)采樣、保持、量化、編碼4個(gè)步驟。在實(shí)際電路中,有些過(guò)程是合并進(jìn)行的,如采樣和保持,量化和編碼在轉(zhuǎn)換過(guò)程中時(shí)同時(shí)實(shí)現(xiàn)的。由奈奎特采樣定理可知,當(dāng)采樣頻率大于模擬信號(hào)中最高頻率的2倍時(shí),采樣值才能不失真地反映原來(lái)模擬信號(hào)。
主要技術(shù)指標(biāo)如下:
●分辨率
通常以輸出二進(jìn)制的位數(shù)表示分辨率的高低,一般位數(shù)越多,量化單位越小,對(duì)輸入信號(hào)的分辨能力就越高。例如,輸入模擬電壓的變化范圍為0±~3.3V、分辨率為12位時(shí),可以分辨的最小模擬電壓為3.3V/2^12≈0.8mV;而分辨率為10位時(shí),可以分辨的最小模擬電壓為3.3V/2^10≈3.2mV。
●轉(zhuǎn)換誤差
它是指在零點(diǎn)和滿度都校準(zhǔn)以后,在整個(gè)轉(zhuǎn)換范圍內(nèi),分別測(cè)量各個(gè)數(shù)字量所對(duì)應(yīng)的模擬輸入電壓實(shí)測(cè)范圍與理論范圍之間的偏差,取其中的最大偏差作為轉(zhuǎn)換誤差的指標(biāo)。它通常以相對(duì)誤差的形式出現(xiàn),并以LSB為單位表示。
●轉(zhuǎn)換速度
完成一次模數(shù)轉(zhuǎn)換所需要的時(shí)間稱為轉(zhuǎn)換時(shí)間。在大多數(shù)情況下,轉(zhuǎn)換速度是轉(zhuǎn)換時(shí)間的倒數(shù)。
ADC的轉(zhuǎn)換速度主要取決于轉(zhuǎn)換電路的類型,并聯(lián)比較型ADC的轉(zhuǎn)換速度最高,逐次逼近型ADC次之,雙積分型ADC轉(zhuǎn)換速度最低。
S3C2440處理器ADC功能圖如圖1所示,其中虛線框是與觸摸屏有關(guān)的功能模塊,可以暫不考慮,學(xué)完ADC基本實(shí)驗(yàn)后,再學(xué)觸摸屏部分也可以。
從圖1可以看出,ADC共有8路模擬輸入,其中XP、XM、YP和YM是觸摸屏使用的4路,剩下的4路模擬輸入A[3:0]可以用于一般的ADC輸入通道。
此外還需要注意ADC的輸入時(shí)鐘是如何產(chǎn)生的。對(duì)于S3C2440處理器,ADC輸入時(shí)鐘是由PCLK分頻得到的,如圖2所示
ADC相關(guān)寄存器
使用ADC只需要對(duì)相應(yīng)的寄存器進(jìn)行配置,然后啟動(dòng)ADC即可,啟動(dòng)ADC有兩種方法:
①手動(dòng)啟動(dòng)
②讀取完上一次轉(zhuǎn)換結(jié)果后自動(dòng)啟動(dòng)下一次ADC轉(zhuǎn)換
得到ADC是否轉(zhuǎn)換完成的信息有兩種方法
①查詢法:查詢寄存器ADCCON的第15位(ADC轉(zhuǎn)換結(jié)束標(biāo)志位)
②中斷法:轉(zhuǎn)換完成后,產(chǎn)生ADC中斷信號(hào),如圖1中的INT_ADC信號(hào)。
當(dāng)不使用觸摸屏?xí)r,與ADC相關(guān)的寄存器主要有寄存器ADCCON和寄存器ADCDAT0。寄存器ADCCON主要用于ADC的啟動(dòng)方式、設(shè)置ADC轉(zhuǎn)換時(shí)鐘以及ADC轉(zhuǎn)換結(jié)束標(biāo)志位等,如下圖3。寄存器ADCDAT0中存放了ADC轉(zhuǎn)換所得到的的數(shù)據(jù),ADC轉(zhuǎn)換結(jié)束后,可以通過(guò)讀該寄存器的值來(lái)得到轉(zhuǎn)換結(jié)果。
ADC初始化
對(duì)ADC初始化只需要做好以下兩個(gè)方面的工作:
① 設(shè)置ADC輸入時(shí)鐘。
② 選擇ADC輸入通道。
可以使用如下代碼初始化:
#define PRSC_EN1 //允許預(yù)分頻
#define PRSCVL19 //預(yù)分頻值
#define STDBM0//正常工作模式
#define READ_START0//讀數(shù)時(shí)不進(jìn)行A/D轉(zhuǎn)換
void ADC_Init(unsigned char channel)
{
ADCCON&=(~((1<<14)|(0xff<<6)|(0x7<<3)|(1<<2)|(1<<1)|(1<<0)));
ADCCON|=(PRSC_EN<<14)|(PRSCVL<<6)|(channel<<3)|(STDBM<<2)|(READ_START<<1);}
此時(shí),對(duì)PCLK進(jìn)行50分頻,則可以計(jì)算出ADC輸入時(shí)鐘=PCLK/50=1MHz。