[嵌入式]A/D轉換器

丫就是熊個貓貓發表於2016-12-26

A/D轉換器

8.1  A/D轉換原理

    在我們的日常生活中,會遇到很多的物理量,遇到很多的物理引數,其中,我們經常遇到的物理引數,如電流、電壓、溫度、壓力、速度等電量或非電量都是模擬量。

    模擬量的大小是連續分佈的,且經常也是時間上的連續函式。要使計算機或數字儀表能識別、處理這些訊號,必須首先將這些模擬訊號轉換成數字訊號;而經計算機分析、處理後輸出的數字量也往往需要將其轉換為相應模擬訊號才能為執行機構所接受。這樣,就需要一種能在模擬訊號與數字訊號之間起橋樑作用的電路—模數和數模轉換器。

A/D轉換過程

 

     模數轉換一般要分取樣、保持、量化和編碼四個步驟進行。在保持過程中,取樣的模擬電壓經數字化編碼電路轉換成一組n位的二進位制數輸出。

A/D轉換主要技術指標

1、解析度

  A/D轉換器的解析度用輸出二進位制數的位數表示,位數越多,誤差越小,轉換精度越高。例如,輸入模擬電壓的變化範圍為0~5V,輸出8位二進位制數可以分辨的最小模擬電壓為5V×2-8=20mV;而輸出12位二進位制數可以分辨的最小模擬電壓為5V×2-12≈1.22mV。

2、量化誤差

    在A/D轉換中由於整量化產生的固有誤差。量化誤差在±1/2LSB(最低有效位)之間。例如:一個8位的A/D轉換器,它把輸入電壓訊號分成28=256層,若它的量程為0~5V,那麼,量化單位q為:

   q ≈0.0195V=19.5mV

3、轉換時間

    轉換時間是指A/D轉換器完成一次轉換所需的時間。轉換時間是指從接到轉換控制訊號開始,到輸出端得到穩定的數字輸出訊號所經過的這段時間。

4、偏移誤差

    輸入訊號為零時輸出訊號不為零的值,可外接電位器調至最小。

5、滿刻度誤差

滿刻度輸出時對應的輸入訊號與理想輸入訊號值之差。

6、線性度

實際轉換器的轉移函式與理想直線的最大偏移,不包括以上3種誤差。

   其他指標還有:絕對精度(Absolute Accuracy)、相對精度(Relative Accuracy)、微分非線性、單調性和無錯碼、總諧波失真(Total Harmonic Distortion,THD)和積分非線性。

 

A/D轉換器的主要型別

    A/D轉換器的主要型別有:積分型A/D轉換器、逐次比較型A/D、並行比較/串並行比較型A/D轉換器、Σ-Δ(Sigma – delta)調製型A/D轉換器、電容陣列逐次比較型A/D轉換器和壓頻變換型A/D轉換器。

1、積分型A/D轉換器

    積分型ADC的工作原理是將輸入電壓轉換成時間(脈衝寬度訊號)或頻率(脈衝頻率),然後由定時器/計數器獲得數字值。其優點是用簡單電路就能獲得高解析度,但缺點是由於轉換精度依賴於積分時間,因此轉換速率極低。

2、逐次比較型A/D轉換器

    逐次比較型ADC由一個比較器和DA轉換器通過逐次比較邏輯構成,從最低位開始,順序地對每一位將輸入電壓與內建DA轉換器輸出進行比較,經n次比較而輸出數字值。其電路規模屬於中等。其優點是速度較高、功耗低,在低分辯率(<12位)時價格便宜,但高精度(>12位)時價格很高。

3、並型比較型A/D轉換器

    並行比較型ADC採用多個比較器,僅作一次比較而實行轉換,又稱快速(Flash)型。電路規模極大,價格也高。

    串並行比較型AD結構上介於並行型和逐次比較型之間,如由2個n/2位的並行型AD轉換器配合DA轉換器組成,用兩次比較實行轉換,所以稱為半快速(Half flash)型。還有分成三步或多步實現AD轉換的叫做分級(Multistep/Subrangling)型ADC。

4、Σ-Δ(Sigma – delta)調製型A/D轉換器

    Σ-Δ型ADC由積分器、比較器、1位DA轉換器和數字濾波器等組成。原理上近似於積分型,將輸入電壓轉換成時間(脈衝寬度)訊號,用數字濾波器處理後得到數字值。電路的數字部分基本上容易單片化,因此容易做到高解析度。主要用於音訊取樣和測量電路。AD7705是典型的Σ-Δ調製型 A/D轉換器。

5、電容陣列逐次比較型A/D轉換器

    電容陣列逐次比較型ADC在內建DA轉換器中採用電容矩陣方式,也可稱為電荷再分配型。一般的電阻陣列DA轉換器中多數電阻的值必須一致,在單晶片上生成高精度的電阻並不容易。如果用電容陣列取代電阻陣列,可以用低廉成本製成高精度單片AD轉換器。最近的逐次比較型A/D轉換器大多為電容陣列式的。

6、壓頻變換型A/D轉換器

    壓頻變換型(Voltage-Frequency Converter)是通過間接轉換方式實現模數轉換的。其原理是首先將輸入的模擬訊號轉換成頻率,然後用計數器將頻率轉換成數字量。從理論上講這種ADC的解析度幾乎可以無限增加,只要取樣的時間能夠滿足輸出頻率解析度要求的累積脈衝個數的寬度。其優點是分辯率高、功耗低、價格低,但是需要外部計數電路共同完成AD轉換。AD650是典型的壓頻變換型A/D轉換器。

 

8.2  S5PV210的A/D轉換器

概述

   S5PV210微處理器支援10位或12位CMOS逐次逼近型模擬/數字轉換器,它具有10通道輸入,並可將模擬量轉換至10位或12位二進位制數輸出。5MHz A/D轉換時鐘時,最大1Msps的轉換速度。A/D轉換具備片上取樣保持功能,同時也支援待機工作模式。

特性

● 10bit/12bit輸出位可選。

● 微分誤差±1.0LSB。

● 積分誤差±2.0LSB。

● 最大轉換速率:1 Msps。

● 功耗少,電壓輸入3.3V。

● 模擬量輸入範圍:0~3.3V。

● 支援片上取樣保持功能。

● 通用轉換模式。

模組圖

 

    ADC與觸控式螢幕控制是複用的,其中AIN9、AIN8、AIN7、AIN6可用於觸控式螢幕1的XP1、XM1、YP1、YM1通道,AIN5、AIN4、AIN3、AIN2可用於觸控式螢幕0的XP0、XM0、YP0、YM0通道。AIN1和AIN0是單獨拉出的AD輸入端。在A/D控制器內部的10選1多路選擇器切換ADC的輸入通道,並送入A/D轉換器中,轉換結果除可以輸出數字量外,還可以通過中斷產生器輸出ADC中斷訊號。

 

8.3  S5PV210的A/D轉換暫存器

1、A/D通道選擇暫存器(ADCMUX)

   A/D通道選擇暫存器ADCMUX 對ADC的10個輸入通道進行選擇切換。由於S5PV210的A/D控制器和觸控式螢幕複用埠,也可對觸控式螢幕輸入進行選擇。

 

2、A/D控制暫存器(TSADCONn)

A/D控制暫存器TSADCONn對A/D轉換器及觸控式螢幕進行配置。

 

A/D轉換預分頻器值:5~255

當預分頻器值為N時,分割因素為N+1。例如:當PCLK為66MHz,預分頻器值為19時,ADC頻率為3.3MHz。

A/D轉換器最大操作頻率為5MHz,所以預分頻器值得設定必須使結果時脈頻率不超過5MHz。

3、ADC延時暫存器(TSDLYn)

A/D延時暫存器TSDLYn配置延時引用時鐘源和延時時間。

 

4、ADC轉換資料X暫存器

A/D轉換資料X暫存器TSDATXn定義了X位置觸控式螢幕相關的顯示值以及正常的A/D轉換AIN0資料值。

 

5、ADC轉換資料Y暫存器

A/D轉換資料X暫存器TSDATYn定義了Y位置觸控式螢幕相關的顯示值以及正常的A/D轉換AIN1資料值。

 

6、ADC中斷清除暫存器

   該暫存器用來清除相關中斷。當中斷服務完成後,由中斷服務例程清除中斷。對該暫存器寫值可以清除相關中斷標誌,讀操作會返回不確定值。

 

8.4  S5PV210的A/D程式設計

硬體電路

   S5PV210微處理器的A/D轉換器的通道0輸入被接到電位器上,通過調節電位器,電路可以輸出0V~3.3V之間不同的電壓值。該電壓值通過A/D轉換轉變成數字量,並通過UART串列埠輸出到計算機螢幕上。

 

程式程式碼

1)adc.c原始檔

adc_test()函式呼叫read_adc(0)獲取通道0電壓資料,向UART串列埠列印。

函式read_adc()很重要,它包括幾個步驟:

(1) 設定時鐘。相關程式碼如下:

TSADCCON0 = (1<<16)|(1 << 14) | (65 << 6);

首先使用12bit adc,然後使能分頻,最後設定分頻係數為66。

(2) 選擇通道。程式碼如下:

ADCMUX = 0;

設定暫存器 ADCMUX,選擇通道 0。

(3) 啟動轉換。程式碼如下:

TSADCCON0 |= (1 << 0);

while (TSADCCON0 & (1 << 0));

首先設定暫存器 TSADCCON0 的 bit[0],啟動 A/D 轉換,然後讀 bit[0]以確定轉換已經啟動。

(4) 檢查轉換是否完成。程式碼如下:

while (!(TSADCCON0 &(1 << 15)) );

讀暫存器 TsdACCON0 的 bit[15],當它為 1 時表示轉換結束。       

(5) 讀資料,程式碼如下:

return (TsdATX0 & 0xfff);

由於使用的 12bit 的模式,所以只讀暫存器 TsdATX0 的前 12bit。

 

程式程式碼

檔案詳細程式碼如下:

#include "lib\stdio.h"
#defineADCTS_PRSCVL65
#define ADCTS_BASE0xE1700000
#define TSADCCON0 ( *((volatile unsigned long *)(ADCTS_BASE+0x0)) )
#define    TSCON0( *((volatile unsigned long *)(ADCTS_BASE+0x4)) )
#define    TSDLY0( *((volatile unsigned long *)(ADCTS_BASE+0x8)) )
#define    TSDATX0( *((volatile unsigned long *)(ADCTS_BASE+0xc)) )
#define    TSDATY0(*((volatile unsigned long *)(ADCTS_BASE+0x10)) )
#define    TSPENSTAT0 (*((volatile unsigned long *)(ADCTS_BASE+0x14)) )
#define    CLRINTADC0(*((volatile unsigned long *)(ADCTS_BASE+0x18)) )
#define  ADCMUX(*((volatile unsigned long *)(ADCTS_BASE+0x1c)) )
#defineCLRINTPEN0(*((volatile unsigned long *)(ADCTS_BASE+0x20)) )
// 延時函式
void delay(unsigned long count)
{
volatile unsigned long i = count;
while (i--)  ;
}
int read_adc(int ch)// 使用查詢方式讀取A/D轉換值
{    // 使能預分頻功能,設定A/D轉換器的時鐘 = PCLK/(65+1)
TSADCCON0 = (1<<16)|(1 << 14) | (65 << 6);
    // 清除位[2],設為普通轉換模式,禁止read start
TSADCCON0 &= ~((1<<2)|(1<<1));
// 選擇通道
ADCMUX = 0;
    // 設定位[0]為1,啟動A/D轉換
    TSADCCON0 |= (1 << 0);
    // 當A/D轉換真正開始時,位[0]會自動清0
    while (TSADCCON0 & (1 << 0));
    // 檢測位[15],當它為1時表示轉換結束
    while (!(TSADCCON0 &  (1 << 15)) );
    // 讀取資料
    return (TSDATX0 & 0xfff);
}
void adc_test(void)
{printf("\r\n============adc test=============\r\n");
while(1)
{printf("adc = %d\r\n",read_adc(0));
delay(0x100000);
}
}
 
main.c檔案詳細程式碼如下:
#include "lib\stdio.h"
void uart_init(void);
void adc_test(void);
int main(void)
{
uart_init(); // 初始化串列埠
adc_test(); // 測試ADC
return 0;
}


相關文章