ARM筆記: ADC轉(zhuǎn)換器
S3C2440的CMOS模擬數(shù)字轉(zhuǎn)換器ADC可以對8通道模擬輸入信號進(jìn)行循環(huán)檢測,S3C2440的ADC和觸摸屏公用一個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是一種將模擬信號轉(zhuǎn)化為數(shù)字信號的方法,一般要經(jīng)過采樣、保持、量化、編碼4個步驟。在實(shí)際電路中,有些過程是合并進(jìn)行的,如采樣和保持,量化和編碼在轉(zhuǎn)換過程中時同時實(shí)現(xiàn)的。由奈奎特采樣定理可知,當(dāng)采樣頻率大于模擬信號中最高頻率的2倍時,采樣值才能不失真地反映原來模擬信號。
主要技術(shù)指標(biāo)如下:
●分辨率
通常以輸出二進(jìn)制的位數(shù)表示分辨率的高低,一般位數(shù)越多,量化單位越小,對輸入信號的分辨能力就越高。例如,輸入模擬電壓的變化范圍為0±~3.3V、分辨率為12位時,可以分辨的最小模擬電壓為3.3V/2^12≈0.8mV;而分辨率為10位時,可以分辨的最小模擬電壓為3.3V/2^10≈3.2mV。
●轉(zhuǎn)換誤差
它是指在零點(diǎn)和滿度都校準(zhǔn)以后,在整個轉(zhuǎn)換范圍內(nèi),分別測量各個數(shù)字量所對應(yīng)的模擬輸入電壓實(shí)測范圍與理論范圍之間的偏差,取其中的最大偏差作為轉(zhuǎn)換誤差的指標(biāo)。它通常以相對誤差的形式出現(xiàn),并以LSB為單位表示。
●轉(zhuǎn)換速度
完成一次模數(shù)轉(zhuǎn)換所需要的時間稱為轉(zhuǎn)換時間。在大多數(shù)情況下,轉(zhuǎn)換速度是轉(zhuǎn)換時間的倒數(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的輸入時鐘是如何產(chǎn)生的。對于S3C2440處理器,ADC輸入時鐘是由PCLK分頻得到的,如圖2所示
ADC相關(guān)寄存器
使用ADC只需要對相應(yīng)的寄存器進(jìn)行配置,然后啟動ADC即可,啟動ADC有兩種方法:
①手動啟動
②讀取完上一次轉(zhuǎn)換結(jié)果后自動啟動下一次ADC轉(zhuǎn)換
得到ADC是否轉(zhuǎn)換完成的信息有兩種方法
①查詢法:查詢寄存器ADCCON的第15位(ADC轉(zhuǎn)換結(jié)束標(biāo)志位)
②中斷法:轉(zhuǎn)換完成后,產(chǎn)生ADC中斷信號,如圖1中的INT_ADC信號。
當(dāng)不使用觸摸屏?xí)r,與ADC相關(guān)的寄存器主要有寄存器ADCCON和寄存器ADCDAT0。寄存器ADCCON主要用于ADC的啟動方式、設(shè)置ADC轉(zhuǎn)換時鐘以及ADC轉(zhuǎn)換結(jié)束標(biāo)志位等,如下圖3。寄存器ADCDAT0中存放了ADC轉(zhuǎn)換所得到的的數(shù)據(jù),ADC轉(zhuǎn)換結(jié)束后,可以通過讀該寄存器的值來得到轉(zhuǎn)換結(jié)果。
ADC初始化
對ADC初始化只需要做好以下兩個方面的工作:
① 設(shè)置ADC輸入時鐘。
② 選擇ADC輸入通道。
可以使用如下代碼初始化:
#define PRSC_EN1 //允許預(yù)分頻
#define PRSCVL19 //預(yù)分頻值
#define STDBM0//正常工作模式
#define READ_START0//讀數(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);}
此時,對PCLK進(jìn)行50分頻,則可以計算出ADC輸入時鐘=PCLK/50=1MHz。