嵌入式裸機之ADC學習筆記

2021-10-23 15:47:18 字數 3891 閱讀 1204

(1)adc:analog digital converter,ad轉換,模數轉換(也就是模擬轉數字)

(2)cpu本身是數字的,而外部世界變數(如電壓、溫度、高度、壓力···)都是模擬的,所以需要用cpu來處理這些外部的模擬變數的時候就需要做ad轉換。

為了用數字技術來處理外部的模擬物理量。

(1)模擬的就是連續的,現實生活當中的時間、電壓、高度等都是模擬的(連續分布的,劃分的話可以無限的更小劃分)。模擬量反映在數學裡面就是無限小數字(從0到1之間有無數個數)

(2)數字的就是離散的,離線的就是不連續的。這種離散處理實際上是從數學上對現實中的模擬量的一種有限精度的描述。數位化就是離散化,就是把連續分布的模擬量按照一定精度進行取點(取樣)變成有限多個不連續分布的數字值,就叫數字量。

(3)數位化的意義就在於可以用(離散)數學來簡化描述模擬量,這東西是計算機技術的基礎。

(4)計算機處理參量的時候都是數位化的,計算機需要數位化的值來參與運算。如果系統輸入引數中有模擬量,就需要外加ad轉換器將模擬量轉成數字量再給計算機。

(1)ad是analog to digital,da自然就是digital to analog,數字轉模擬。

(2)純粹用cpu是不可能實現數字轉模擬,因為cpu本身就是數字的。使用一些(具有一些積分或微分效果的)物理器件就可實現數字轉模擬。

(3)數字轉模擬的作用。譬如可以用來做波形發生器。

(1)ad轉換器是乙個電子器件,所以他只能輸入電壓訊號。其他種類的模擬訊號要先經過感測器(sensor)的轉換變成模擬的電壓訊號然後才能給ad。

(2)ad輸入端的模擬電壓要求有乙個範圍,一般是0~3.3v或0~5v或者是0~12v等等。模擬電壓的範圍是ad晶元本身的乙個引數。實際工作時給ad的電壓訊號不能超過這個電壓範圍。

(1)ad轉換輸出的數字值是有一定的位數的(譬如說10位,意思就是輸出的數字值是用10個二進位制位來表示的,這種就叫10位ad)。這個位數就表示了轉換精度。

(2)10位ad就相當於把整個範圍分成了1024個格仔,每個格仔之間的間隔就是電壓的表示精度。加入ad晶元的量程是0~3.3v,則每個格仔代表的電壓值是3.3v/1024=0.0032265v。如果此時ad轉換後得到的數字量是447,則這個數字量代表的模擬值是:447×0.0032265v=1.44v。

(3)ad的位數越多,則每個格仔表示的電壓值越小,將來算出來的模擬電壓值就越精確。

(4)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)

(1)首先要明白:ad晶元進行ad轉換是要耗費時間的。這個時間需要多久,不同的晶元是不一樣的,同一顆晶元在配置不一樣(譬如說精度配置為10位時時間比精度配置為12位時要小,譬如說有些ad可以配轉換時鐘,時鐘頻率高則轉換時間短)時轉換時間也不一樣。

(2)詳細的需要時間可以參考資料手冊。一般資料手冊中描述轉換速率用的單位是msps(第乙個m是兆,s是sample,就是取樣;ps就是per second,總的意思就是兆樣本每秒,每秒鐘轉出來多少m個數字值)

(3)ad工作都需要乙個時鐘,這個時鐘有乙個範圍,我們實際給他配置時不要超出這個範圍就可以了。ad轉換是在這個時鐘下進行的,時鐘的頻率控制著ad轉換的速率。注意:時鐘頻率和msps不是一回事,只是成正比不是完全相等。譬如s5pv210中的ad轉換器,msps = 時鐘頻率/5

ad晶元有多少路analog input通道,代表了將來可以同時進行多少路模擬訊號的輸入。

(1)adc在210的資料手冊的section10.7

(2)電阻式觸控螢幕本身工作時依賴於ad轉換,所以在210的soc中電阻觸控螢幕介面本身和adc介面是合二為一的。或者說電阻觸控螢幕介面使用了(復用了)adc的介面。

adcclk是adc控制器工作的時鐘,也就是1.13.2.3節中講到的conventor clock。從時鐘框圖可以看出,它是pclk(當然是pclk_psys)經過了一次分頻後得到的。所以將來初始化adc控制器時一定有乙個步驟是初始化這裡的分頻器。

(1)210一共支援10個adc通道,分別叫ain[0]~ain[9]。理論上可以同時做10路ad轉換。

(2)soc的引腳至少分2種:digit數字引腳和analog模擬引腳。我們以前接觸的gpio都屬於數字引腳,adc channel通道引腳屬於模擬引腳。數字引腳和模擬引腳一般是不能混用的。

tsadccon0 adc控制暫存器配置

tsdatx0 tsdaty0 轉出來的ad值存在這裡,我們讀也是讀這裡

clrintadc0 清中斷

adcmux 選擇當前正在操作的ad通道

(1)等待觸控螢幕轉換完畢的方法有2種:一種是檢查標誌位,第二種是中斷。第一種方式下我們先開啟一次轉換然後迴圈不停檢查標誌位直到標誌位為1表明已經轉換完可以去讀了;第二種方式下就是設定好中斷,寫好中斷isr來讀取ad轉換資料。然後開啟中斷後cpu就不用管了,等ad轉換完成後會生成乙個中斷訊號給cpu,就會進入中斷處理流程。第一種方法是同步的,第二種方式是非同步的。

(2)ad轉換都是需要反覆進行的,那麼轉完一次一般要立即開啟下一次轉換,所以需要有一種機制能夠在一次轉完時自動開啟下一次。這個機制就叫start by read,這個機制的工作方法是:當我們讀取本次ad轉換的ad值後,硬體自動開啟下一次ad轉換。

adc.c

#include

"stdio.h"

#include

"main.h"

#define tsadccon0 0xe1700000

#define tscon0 0xe1700004

#define tsdatx0 0xe170000c

#define tsdaty0 0xe1700010

#define clrintadc0 0xe1700018

#define adcmux 0xe170001c

#define rtsadccon0 (*(volatile unsigned int *)tsadccon0)

#define rtscon0 (*(volatile unsigned int *)tscon0)

#define rtsdatx0 (*(volatile unsigned int *)tsdatx0)

#define rtsdaty0 (*(volatile unsigned int *)tsdaty0)

#define rclrintadc0 (*(volatile unsigned int *)clrintadc0)

#define radcmux (*(volatile unsigned int *)adcmux)

//初始化adc

static

void

adc_init

(void

)static

void

delay

(void

)void adc_test (

void

)}

我們通過滑動變阻器r44 的滑動,得出tsdatx中的數值會隨著變阻器上下滑動,而相應的增加/減少

注: 以上內容來自朱老師物聯網大講堂裸機課件

嵌入式學習之裸機開發前奏

為裸機開發做鋪墊 我們需 安裝交叉編譯工具鏈 就是在linux下安裝軟體 並且進行相關配置方便裸機開發時使用 熟悉makefile流程 方便裸機開發工程管理 知道各個檔案字尾的作用以及來歷 mkv210 imge.c程式的作用以及內部 區分ubs串列埠燒寫和sd卡燒寫的區別 1 我們使用安裝包的形式...

嵌入式裸機GPIO和LED學習筆記

gpio general purpose input output 通用輸入輸出 gpio就是晶元的引腳 晶元上的引腳有些不是gpio,只有一部分是 作為gpio的這類引腳,他的功能和特點是可以被程式設計控制它的工作模式,也可以程式設計控制他的電壓高低等。通過之前的分析我們知道,我們設計電路時就把l...

ARM嵌入式裸機程式學習(一)

這裡不用ads整合開發環境,因為ads相容性存在問題,而且通過自己手動編譯 鏈結對學習有好處,所以我們下面都在linux環境下進行arm開發。開發環境 linux作業系統 ubuntu 開發工具 arm linux gdb 7.5 eclipse cpp helios sr2 linux gtc a...