嵌入式知識-ARM裸機-學習筆記(12):ADC模數轉換器

嵌入式知識-ARM裸機-學習筆記(12):ADC模數轉換器

一、ADC

1. 什麼是ADC

ADC(analog digital converter):模數轉換(也就是模擬量轉換爲數字量)。由於CPU本身是數字的,而外部世界變量(如電壓、溫度、高度、壓力···)都是模擬的,所以需要用CPU來處理這些外部的模擬變量的時候就需要做AD轉換。

模擬的就是連續的,現實生活當中的時間、電壓、高度等都是模擬的(連續分佈的,劃分的話可以無限的更小劃分)。模擬量反映在數學裏面就是無限小數位(從0到1之間有無數個數)。
數字的就是離散的,離線的就是不連續的。這種離散處理實際上是從數學上對現實中的模擬量的一種有限精度的描述。數字化就是離散化,就是把連續分佈的模擬量按照一定精度進行取點(採樣)變成有限多個不連續分佈的數字值,就叫數字量。
數字化的意義就在於可以用(離散)數學來簡化描述模擬量,這東西是計算機技術的基礎。計算機處理參量的時候都是數字化的,計算機需要數字化的值來參與運算。如果系統輸入參數中有模擬量,就需要外加AD轉換器將模擬量轉成數字量再給計算機

2. DAC

AD是analog to digital,DA自然就是digital to analog,數字轉模擬
純粹用cpu是不可能實現數字轉模擬,因爲cpu本身就是數字的。使用一些(具有一些積分或微分效果的)物理器件就可實現數字轉模擬。數字轉模擬的作用。譬如可以用來做波形發生器

3. ADC相關概念

量程(模擬量輸入範圍)
AD轉換器是一個電子器件,所以他只能輸入電壓信號。其他種類的模擬信號要先經過傳感器(Sensor)的轉換變成模擬的電壓信號然後才能給AD。
AD輸入端的模擬電壓要求有一個範圍,一般是0~3.3V或0~5V或者是0~12V等等。模擬電壓的範圍是AD芯片本身的一個參數。實際工作時給AD的電壓信號不能超過這個電壓範圍。

精度(分辨率resolution)
AD轉換輸出的數字值是有一定的位數的(譬如說10位,意思就是輸出的數字值是用10個二進制位來表示的,這種就叫10位AD)。這個位數就表示了轉換精度
10位AD就相當於把整個範圍分成了1024個格子,每個格子之間的間隔就是電壓的表示精度。加入AD芯片的量程是0~3.3V,則每個格子代表的電壓值是3.3V/1024=0.0032265V。如果此時AD轉換後得到的數字量是447,則這個數字量代表的模擬值是:447×0.0032265V=1.44V。
AD的位數越多,則每個格子表示的電壓值越小,將來算出來的模擬電壓值就越精確
AD的模擬量程一樣的情況下,AD精度位數越多精度越高,測出來的值越準。但是如果AD的量程不一樣。譬如2個AD,A的量程是0~50V,B的量程是0~0.5V,A是12位的,B是10位的,可能B的精度比A的還要高。(A的精度:50/1024=0.04883,B的精度:0.5/4096=0.000122)。

轉換速率(MSPS與conventor clock的不同)
首先要明白:AD芯片進行AD轉換是要耗費時間的。這個時間需要多久,不同的芯片是不一樣的,同一顆芯片在配置不一樣(譬如說精度配置爲10位時時間比精度配置爲12位時要小,譬如說有些AD可以配轉換時鐘,時鐘頻率高則轉換時間短)時轉換時間也不一樣。
詳細的需要時間可以參考數據手冊。一般數據手冊中描述轉換速率用的單位是MSPS(第一個M是兆,S是sample,就是採樣;PS就是per second,總的意思就是兆樣本每秒,每秒種轉出來多少M個數字值)。
AD工作都需要一個時鐘,這個時鐘有一個範圍,我們實際給他配置時不要超出這個範圍就可以了。AD轉換是在這個時鐘下進行的,時鐘的頻率控制着AD轉換的速率。注意:時鐘頻率和MSPS不是一回事,只是成正比不是完全相等。譬如S5PV210中的AD轉換器,MSPS = 時鐘頻率/5。

通道數
AD芯片有多少路analog input通道,代表了將來可以同時進行多少路模擬信號的輸入。

二、S5PV210的ADC

1. ADC控制器

ADC的工作時鐘框圖:
在這裏插入圖片描述
ADCCLK是ADC控制器工作的時鐘。從時鐘框圖可以看出,它是PCLK(當然是PCLK_PSYS)經過了一次分頻後得到的。所以將來初始化ADC控制器時一定有一個步驟是初始化這裏的分頻器。

210有10個ADC通道:
在這裏插入圖片描述
210一共支持10個ADC通道,分別叫AIN[0]~AIN[9]。理論上可以同時做10路AD轉換
SoC的引腳至少分2種:digit數字引腳和analog模擬引腳。我們以前接觸的GPIO都屬於數字引腳,ADC channel通道引腳屬於模擬引腳。數字引腳和模擬引腳一般是不能混用的。

2. 配置ADC控制器代碼

在這裏插入圖片描述
在這裏插入圖片描述

三、補充:解決SecureCRT換行問題

在uart.c文件中添加以下代碼:

void putc(char c)
{                  	
	// 串口發送一個字符,其實就是把一個字節丟到發送緩衝區中去
	// 因爲串口控制器發送1個字節的速度遠遠低於CPU的速度,所以CPU發送1個字節前必須
	// 確認串口控制器當前緩衝區是空的(意思就是串口已經發完了上一個字節)
	// 如果緩衝區非空則位爲0,此時應該循環,直到位爲1
	
	if (c == '\n')
	{
		while (!(rUTRSTAT0 & (1<<1)));
		rUTXH0 = '\r';
	}

	while (!(rUTRSTAT0 & (1<<1)));
	rUTXH0 = c;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章