一.基本概念講解
A/D是我們的模擬量到數字量的轉換,依靠的是模數轉換器(Analog to Digtial Converter),簡稱ADC;D/A是數字量到模擬量的轉換,依靠的是數模轉換器(Digtial to Analog Converter),簡稱DAC。他們的道理是完全一樣的。只是轉換的方向完全不同。
什么是模擬量?就是指變量在一定的范圍內可以連續變化的量。也就是在一定的范圍內可以取任意的指。比如我們的溫度計。從0度到100度,可以取任意值?梢允1度,可以是0.01度,也可以是0.0001度等。總之0到100度之間有無限個中間值。所以,稱之為連續變量的量。這個就是我們稱之的模擬量。如下左圖
而我們的溫度計被我們人為的刻上了符號,每兩個大型的刻度間隔是10度。這個實際上就是我們的對模擬量數字化,由于有一定的間隔,不是連續的,所以,我們專業的說法叫做離散的。我們的ADC就是把連續的信號用離散的數字表達處理啊。我們的ADC就是模擬量轉換成數字量的一種機制。
注:
模擬量可以是電壓、電流等電信號,也可以是壓力、溫度、濕度、位移、聲音等非電信號。但在A/D轉換前,輸入到A/D轉換器的輸入信號必須經各種傳感器把各種物理量轉換成電壓信號。
A/D轉換后,輸出的數字信號可以有8位、10位、12位、14位和16位等。
二.A/D轉換器的主要技術指標
① 分辨率:數字量變化一個小量時模擬信號的變化量,定義為滿刻度與 2n 的比值。分辨率又稱精度,通常以數字信號的位數來表示。,它表示對模擬信號進行數字化能夠達到多細的程度。通常用數字量的位數表示,如8位、12位、16位分辨率等。若分辨率為8位,能夠表示的大數字是255。若是我們輸入的電壓位12V,那么其分辨率位12 / 255 = 0.047v(約等于0.047v)也就是說模擬量的輸入必須以0.047為單位變大或變小,其輸出的數字量才會有變化,例如:11.953~12.000的模擬量其輸出數字量都為255.分辨率越高,轉換時對輸人量的微小變化的反應越靈敏。
②量程:即所轉換的電壓范圍。單極性工作的芯片有以0V為基準的0~+10V,0~-10V等;雙極性工作的芯片有以0V為基準的±5V,±10V等。
③轉換時間和轉換率:完成一次A/D轉換所需要的時間稱為轉換時間,轉換時間的倒數稱為轉換率。不同形式、不同分辨率的器件,其轉換時間的長短相差很大,可為幾微妙到幾百毫秒。在選擇器件時,要根據應用的需要和成本,對這項指標加以考慮,有時還要同時考慮數據傳輸過程中轉換器件的一些結構和特點。
MSPS--Million Samples per Second
采樣時間則是另外一個概念,是指兩次轉換的間隔。為了保證轉換的正確完成,采樣速率(Sample Rate)必須小于或等于轉換速率。因此有人習慣上將轉換速率在數值上等同于采樣速率也是可以接受的
例如:
我們有一把塑料尺子,它的量程是10厘米,上面有100個刻度,能夠都出來的小的單位是1毫米有效值,那么我們就說我們這個尺子的分辨率為1毫米。
三.電路圖分析
我們觀察到開發板上有一個電位器(滑動變阻器),上面的編號為VR1,我們就可以通過搜索VR1來觀察滑動變阻器的阻值情況。
在《FS4412-DevBoard-V5.pdf》搜索VR1(或者直接搜索ADC),觀察到下圖。
當我們的滑動變阻器變化的時候,通過檢測XadcAIN3引腳電壓變化轉換車成數字。
我們在芯片手冊《FS4412_CoreBoard_V2.pdf》中,同樣搜索到的內容如下:
三.芯片手冊大致翻譯
56 ADC
56.1 ADC 概述
10 位或 12 位 CMOS 再循環式模擬數字轉換器,它具有 4 通道輸入,并可將模擬量轉換為 10 位或 12位二進制數。 5MHz A/D 轉換時鐘時,大 1MSPS(Million Samples per Second)。 A/D 轉換操作具有樣本保持的功能,同時也支持降功耗模式。
特性
ADC 接口包括如下特性:
Ø 10bit/12bit 輸出位可選。
Ø 微分誤差±2.0LSB。
Ø 積分誤差±4.0LSB。
Ø 大轉換速率: 1 Msps。
Ø 功耗少,電壓輸入 3.3v。
Ø 模擬量輸入范圍: 0~3.3v。
Ø 支持片上樣本保持功能。
Ø 通用轉換模式。
56. ADC 選擇
Exynos 4412 SCP 有2個ADC 設備塊,分別是ADC和MTCADC_ISP。我們可以選擇其中一個ADC塊設備,通過設置SFR(special function register)寄存器中的ADC_CFG[16]來選擇。
56.4.2 A/D 轉換時間
當一個PLCK 時鐘頻率是66MHZ,并且分頻值是65,選擇的是12位的分辨率的時候。
我們的計算公式如下:
完成一次 A/D 轉換需要 5 個時鐘周期。 A/D 轉換器的大工作時鐘為 5MHz,所以大的采樣率可以達到 1Mbit/s。
56.4.3 ADC 轉換模式
轉換模式中AIN0~AIN3是類似的。若是需要初始化這個模式,通過設置ADCCON(ADC控制寄存器)即可. 轉換的數據可以通過ADCDAT這個寄存器來讀。
ADC編程步驟:
設置預分配器
根據上述公式,我們選擇預分配位255,終得到的結果位
ADCCON[14] = 1; //使能分配器
ADCCON[6:13] = 0xff //選擇分配系數
時鐘頻率 100 MHZ /(255 + 1) = 25 / 64 MHZ
(2) 設置精度(選擇分辨率 8位,12位等)
ADCCON[16] = 1 //選擇12bit 的A/D轉換
注:量化位數是12位,那么數字表示的范圍是0~4096
假如我們輸入小的電壓范圍位0~1.8V,那么我們
低有效位1LSB 表示大小 1.8V / 4096 。
當我們量化的位數越大的時候,每位能給你識別的電壓越小,精度越高。
(3) 選擇通道
ADCMUX[3:0] = 0011
(4)使能,啟動A/D轉換
注:由圖所知,我們的可以選擇ADCCON [0]和ADCCON[1].
ADCCON[0] 使能A/D轉換開始。我們知道當我們的A/D轉換開始后,若是
我們讀了之后,這位會被自動的清除。故我們每次都需要設置。
ADCCON[1] A/D轉換由讀來開始。通過讀來使能開始,我們知道了,當我們
讀了一次之后,我們的A/D轉換才開始,若是不讀的話,我們的
A/D轉換不會啟動。
//ADC轉換后的數值
ADCCON[2] = 0 //選擇正常模式
ADCCON[1] = //使能讀功能,可以讀ADCDAT中的信息
temp = ADCDAT[0 : 11] //讀取一次后,轉換開始。若是不讀取,A/D轉換不會啟動。
(1) 獲得轉換后-的數值
While(!(ADDCCON[15] == 1)) //每次讀取結束后ADDCCON的值會自動設置位1表示結束
Temp = ADCDAT[0 : 11]
代碼簡介:
void adc_init()
{
//enable prescaler
REG_WRITE(ADCCON,REG_READ(ADCCON) | (1 << 14));
//prescaler 256
REG_WRITE(ADCCON,(REG_READ(ADCCON) & ~(0Xff << 6)) | (0xff << 6));
//設置精度 12bit
REG_WRITE(ADCCON,REG_READ(ADCCON) | (1 << 16));
//選擇通道3
REG_WRITE(ADCMUX,(REG_READ(ADCMUX) & ~(0Xf)) | (0x3));
//normal 模式
REG_WRITE(ADCCON,REG_READ(ADCCON) & ~(1 << 2));
//設置通過的讀的方式使能adc轉換
REG_WRITE(ADCCON,REG_READ(ADCCON) | ( 1 << 1));
//讀一次之后,啟動我們的ADC
adcval = REG_READ(ADCDAT);
}
int adc_read()
{
int val;
while(!(REG_READ(ADCCON) & (1 << 15)));
val = REG_READ(ADCDAT) & 0xfff;
return val;
}
int main()
{
adc_init();
while(1)
{
adcval = adc_read();
delay_ms(500);
uart_printf("adc = %d\r\n",adcval);
}
return 0;
}