一、 實(shí)驗(yàn)?zāi)康?br>1.熟悉ARM 本身自帶的八路十位A/D 控制器及相應(yīng)寄存器。
2.編程實(shí)現(xiàn)ARM 系統(tǒng)的A/D 功能。
3.掌握帶有A/D 的CPU 編程實(shí)現(xiàn)A/D 功能的主要方法。
二、 實(shí)驗(yàn)內(nèi)容
學(xué)習(xí)A/D 接口原理,了解實(shí)現(xiàn)A/D 系統(tǒng)對(duì)于系統(tǒng)的軟件和硬件要求。閱讀ARM 芯片
文檔,掌握ARM 的A/D 相關(guān)寄存器的功能,熟悉ARM 系統(tǒng)硬件的A/D 相關(guān)接口。利用外
部模擬信號(hào)
1.編程實(shí)現(xiàn)ARM 循環(huán)采集全部8路通道,并且在超級(jí)終端上顯示。(不帶操作系統(tǒng))
2.編程實(shí)現(xiàn)ARM 采集某路的連續(xù)電壓值,并且在屏幕上展開(kāi)顯示采集曲線。(帶操作
系統(tǒng))
三、 預(yù)備知識(shí)
1、用ARM SDT 2.5 集成開(kāi)發(fā)環(huán)境,編寫(xiě)和調(diào)試程序的基本過(guò)程。
2、ARM 應(yīng)用程序的框架結(jié)構(gòu)。
3、會(huì)使用Source Insight 3 編輯C 語(yǔ)言源程序。
4、能夠自己完成在LCD 上顯示指定參量。
四、 實(shí)驗(yàn)設(shè)備及工具
硬件:ARM 嵌入式開(kāi)發(fā)板、用于ARM7TDMI 的JTAG 仿真器、PC 機(jī)Pentumn100 以
上、模擬電壓信號(hào)源
軟件:PC 機(jī)操作系統(tǒng)win98、ARM SDT 2.51 集成開(kāi)發(fā)環(huán)境、仿真器驅(qū)動(dòng)程序、Source
Insight 3.0
五、 實(shí)驗(yàn)原理及說(shuō)明
1.A/D 轉(zhuǎn)換器
A/D 轉(zhuǎn)換器是模擬信號(hào)源和CPU 之間聯(lián)系的接口,它的任務(wù)是將連續(xù)變化的模擬信號(hào)
轉(zhuǎn)換為數(shù)字信號(hào),以便計(jì)算機(jī)和數(shù)字系統(tǒng)進(jìn)行處理、存儲(chǔ)、控制和顯示。在工業(yè)控制和數(shù)據(jù)
采集及許多其他領(lǐng)域中,A/D 轉(zhuǎn)換是不可缺少的。
A/D 轉(zhuǎn)換器有以下類(lèi)型:逐位比較型、積分型、計(jì)數(shù)型、并行比較型、電壓-頻率型,
主要應(yīng)根據(jù)使用場(chǎng)合的具體要求,按照轉(zhuǎn)換速度、精度、價(jià)格、功能以及接口條件等因素而
決定選擇何種類(lèi)型。常用的有以下兩種:
(一)雙積分型的A/D 轉(zhuǎn)換器
雙積分式也稱二重積分式,其實(shí)質(zhì)是測(cè)量和比較兩個(gè)積分的時(shí)間,一個(gè)是對(duì)模擬輸入電
壓積分的時(shí)間T,此時(shí)間往往是固定的;另一個(gè)是以充電后的電壓為初值,對(duì)參考電源Vncf
反向積分,積分電容被放電至零所需的時(shí)間T,(或T。等)。模擬輸入電壓Vi 與參考電壓
VRef 之比,等于上述兩個(gè)時(shí)間之比。由于VRef,T。固定,而放電時(shí)間Ti 可以測(cè)出,因而可計(jì)
算出模擬輸入電壓的大小(VRef 與Vi 符號(hào)相反)。
由于T。、VRef 為已知的固定常數(shù),因此反向積分時(shí)間T1 與輸入模擬電壓Vi 在T。時(shí)間
內(nèi)的平均值成正比。輸入電壓Vi 愈高,VA 愈大,T1 就愈長(zhǎng)。在T1 開(kāi)始時(shí)刻,控制邏輯同
時(shí)打開(kāi)計(jì)數(shù)器的控制門(mén)開(kāi)始計(jì)數(shù),直到積分器恢復(fù)到零電平時(shí),計(jì)數(shù)停止。則計(jì)數(shù)器所計(jì)出
的數(shù)字即正比于輸入電壓Vi 在T。時(shí)間內(nèi)的平均值,于是完成了一次A/D 轉(zhuǎn)換。
由于雙積分型A/D 轉(zhuǎn)換是測(cè)量輸入電壓Vi 在T。時(shí)間內(nèi)的平均值,所以對(duì)常態(tài)干擾(串
模干擾)有很強(qiáng)的抑制作用,尤其對(duì)正負(fù)波形對(duì)稱的干擾信號(hào),抑制效果更好。
雙積分型的A/D 轉(zhuǎn)換器電路簡(jiǎn)單,抗干擾能力強(qiáng),精度高,這是突出的優(yōu)點(diǎn)。但轉(zhuǎn)換
速度比較慢,常用的A/D 轉(zhuǎn)換芯片的轉(zhuǎn)換時(shí)間為毫秒級(jí)。例如12 位的積分型A/D 芯片
ADCETl2BC,其轉(zhuǎn)換時(shí)間為lms。因此適用于模擬信號(hào)變化緩慢,采樣速率要求較低,而
對(duì)精度要求較高,或現(xiàn)場(chǎng)干擾較嚴(yán)重的場(chǎng)合。例如在數(shù)字電壓表中常被采用。
(二)逐次逼近型的A/D 轉(zhuǎn)換器
逐次逼近型(也稱逐位比較式)的A/D 轉(zhuǎn)換器,應(yīng)用比積分型更為廣泛,其原理框圖如圖
6-1 所示,主要由逐次逼近寄存器SAR、D/A 轉(zhuǎn)換器、比較器以及時(shí)序和控制邏輯等部分組
成。它的實(shí)質(zhì)是逐次把設(shè)定的SAR 寄存器中的數(shù)字量經(jīng)D/A 轉(zhuǎn)換后得到電壓Vc,與待轉(zhuǎn)
換模擬電壓V。進(jìn)行比較。比較時(shí),先從SAR 的最高位開(kāi)始,逐次確定各位的數(shù)碼應(yīng)是“1”
還是“0”,其工作過(guò)程如下:
轉(zhuǎn)換前,先將SAR 寄存器各位清零。轉(zhuǎn)換開(kāi)始時(shí),控制邏輯電路先設(shè)定SAR 寄存器的
最高位為“1”,其余位為“0”,此試探值經(jīng)D/A 轉(zhuǎn)換成電壓Vc,然后將Vc 與模擬輸入電
壓Vx 比較。如果Vx≥Vc,說(shuō)明SAR 最高位的“1”應(yīng)予保留;如果Vx<Vc,說(shuō)明SAR 該
位應(yīng)予清零。然后再對(duì)SAR 寄存器的次高位置“1”,依上述方法進(jìn)行D/A 轉(zhuǎn)換和比較。如
此重復(fù)上述過(guò)程,直至確定SAR 寄存器的最低位為止。過(guò)程結(jié)束后,狀態(tài)線改變狀態(tài),表
明已完成一次轉(zhuǎn)換。最后,逐次逼近寄存器SAR 中的內(nèi)容就是與輸入模擬量V 相對(duì)應(yīng)的二
進(jìn)制數(shù)字量。顯然A/D 轉(zhuǎn)換器的位數(shù)N 決定于SAR 的位數(shù)和D/A 的位數(shù)。圖6-1(b)表示四
位A/D 轉(zhuǎn)換器的逐次逼近過(guò)程。轉(zhuǎn)換結(jié)果能否準(zhǔn)確逼近模擬信號(hào),主要取決于SAR 和D/A
的位數(shù)。位數(shù)越多,越能準(zhǔn)確逼近模擬量,但轉(zhuǎn)換所需的時(shí)間也越長(zhǎng)。
逐次逼近式的A/D 轉(zhuǎn)換器的主要特點(diǎn)是:
轉(zhuǎn)換速度較快,在1—100μs 以內(nèi),分辨率可以達(dá)18 位,特別適用于工業(yè)控制系統(tǒng)。
轉(zhuǎn)換時(shí)間固定,不隨輸入信號(hào)的變化而變化??垢蓴_能力相對(duì)積分型的差。例如,對(duì)模擬輸
入信號(hào)采樣過(guò)程中,若在采樣時(shí)刻有一個(gè)干擾脈沖迭加在模擬信號(hào)上,則采樣時(shí),包括干擾
信號(hào)在內(nèi),都被采樣和轉(zhuǎn)換為數(shù)字量,這就會(huì)造成較大的誤差,所以有必要采取適當(dāng)?shù)臑V波
措施。
2.A/D 轉(zhuǎn)換的重要指標(biāo)
⑴ 分辨率(Resolution):
分辨率反映A/D 轉(zhuǎn)換器對(duì)輸入微小變化響應(yīng)的能力,通常用數(shù)字輸出最低位(LSB)所對(duì)
應(yīng)的模擬輸入的電平值表示。n 位A/D 能反應(yīng)1/2n 滿量程的輸入電平。由于分辨率直接與轉(zhuǎn)
換器的位數(shù)有關(guān),所以一般也可簡(jiǎn)單地用數(shù)字量的位數(shù)來(lái)表示分辨率,即n 位二進(jìn)制數(shù),最
低位所具有的權(quán)值,就是它的分辨率。
值得注意的是,分辨率與精度是兩個(gè)不同的概念,不要把兩者相混淆。即使分辨率很高,
也可能由于溫度漂移、線性度等原因,而使其精度不夠高。
⑵ 精度(Accuracy)
精度有絕對(duì)精度(Absolute Accuracy)和相對(duì)精度(Relative Accuracy)兩種表示方法。
① 絕對(duì)誤差
在一個(gè)轉(zhuǎn)換器中,對(duì)應(yīng)于一個(gè)數(shù)字量的實(shí)際模擬輸入電壓和理想的模擬輸入電壓之差并
非是一個(gè)常數(shù)。我們把它們之間的差的最大值,定義為“絕對(duì)誤差”。通常以數(shù)字量的最小
有效位(LSB)的分?jǐn)?shù)值來(lái)表示絕對(duì)誤差,例如: ± 1LSB 等。絕對(duì)誤差包括量化誤差和其它
所有誤差。
② 相對(duì)誤差
是指整個(gè)轉(zhuǎn)換范圍內(nèi),任一數(shù)字量所對(duì)應(yīng)的模擬輸入量的實(shí)際值與理論值之差,用模擬
電壓滿量程的百分比表示。
例如,滿量程為10V,10 位A/D 芯片,若其絕對(duì)精度為± 1/2LSB,則其最小有效位的
量化單位:9.77mV,其絕對(duì)精度為=4.88mV,其相對(duì)精度為0.048%。
⑶ 轉(zhuǎn)換時(shí)間(Conversion Time)
轉(zhuǎn)換時(shí)間是指完成一次A/D 轉(zhuǎn)換所需的時(shí)間,即由發(fā)出啟動(dòng)轉(zhuǎn)換命令信號(hào)到轉(zhuǎn)換結(jié)束
信號(hào)開(kāi)始有效的時(shí)間間隔。
轉(zhuǎn)換時(shí)間的倒數(shù)稱為轉(zhuǎn)換速率。例如AD570 的轉(zhuǎn)換時(shí)間為25us,其轉(zhuǎn)換速率為40KHz。
⑷ 電源靈敏度(power supply sensitivity)
電源靈敏度是指A/D 轉(zhuǎn)換芯片的供電電源的電壓發(fā)生變化時(shí),產(chǎn)生的轉(zhuǎn)換誤差。一般
用電源電壓變化1%時(shí)相當(dāng)?shù)哪M量變化的百分?jǐn)?shù)來(lái)表示。
⑸ 量程
量程是指所能轉(zhuǎn)換的模擬輸入電壓范圍,分單極性、雙極性兩種類(lèi)型。
例如,單極性 量程為0~+5V,0~+10V,0~+20V;
雙極性 量程為-5~+5V,-10~+10V。
⑹ 輸出邏輯電平
多數(shù)A/D 轉(zhuǎn)換器的輸出邏輯電平與TTL 電平兼容。在考慮數(shù)字量輸出與微處理器的數(shù)
據(jù)總線接口時(shí),應(yīng)注意是否要三態(tài)邏輯輸出,是否要對(duì)數(shù)據(jù)進(jìn)行鎖存等。
⑺ 工作溫度范圍
由于溫度會(huì)對(duì)比較器、運(yùn)算放大器、電阻網(wǎng)絡(luò)等產(chǎn)生影響,故只在一定的溫度范圍內(nèi)才
能保證額定精度指標(biāo)。一般A/D 轉(zhuǎn)換器的工作溫度范圍為(0~700C),軍用品的工作溫度范
圍為(-55~+1250C)
3.ARM 自帶的十位A/D 轉(zhuǎn)換器
ARM S3C440BX 芯片自帶一個(gè)8路10 位A/D 轉(zhuǎn)換器,該轉(zhuǎn)換器可以通過(guò)軟件設(shè)置為
Sleep 模式,可以節(jié)電減少功率損失,最大轉(zhuǎn)換率為500K,非線性度為正負(fù)1位,其轉(zhuǎn)換時(shí)
間可以通過(guò)下式計(jì)算:如果系統(tǒng)時(shí)鐘為66MHz,比例值為9,則為
66MHz/2 (9+1)/16 (完成轉(zhuǎn)換至少需要16 個(gè)時(shí)鐘周期)=205.25KHz=4.85us。
ARM 芯片與A/D 功能有關(guān)的引腳為以下幾個(gè),其中AIN[7:0]為8 路模擬采集通道,
AREFT 為參考正電壓,AREFB 為參考負(fù)電壓,AVCOM 為模擬共電壓。
轉(zhuǎn)換在讀操作時(shí)開(kāi)始。2,3,4 位是通道號(hào)。5 位為睡眠模式設(shè)定,6 位為轉(zhuǎn)換標(biāo)志位(只讀)。
通過(guò)該寄存器設(shè)置A/D 轉(zhuǎn)換開(kāi)始可以參見(jiàn)下例:
rADCCON=0x11(通道4開(kāi)始轉(zhuǎn)換)
即前四路通過(guò)電位器接倒3.3V 的電源上。
六、 實(shí)驗(yàn)步驟
1.不帶操作系統(tǒng)的A/D 功能的實(shí)現(xiàn)
當(dāng)本系統(tǒng)不嵌入操作系統(tǒng),僅僅執(zhí)行A/D 轉(zhuǎn)換的單任務(wù)時(shí),首先要設(shè)置各相關(guān)寄存器,
進(jìn)行初始化,然后再開(kāi)啟轉(zhuǎn)換。下面我們看看在不帶操作系統(tǒng)時(shí)循環(huán)采集全部8 路通道是如
何實(shí)現(xiàn)的。
⑴ 學(xué)習(xí)上述A/D 轉(zhuǎn)換原理,了解轉(zhuǎn)換相應(yīng)寄存器各位的意義。
⑵ 打開(kāi)一個(gè)新工程,定義與AD 有關(guān)的三個(gè)寄存器地址和一些特殊的位命令。主要有
以下各寄存器:
/* ADC 的三個(gè)功能寄存器 */
#define rADCCON (*(volatile unsigned *)0x1d40000)
#define rADCPSR (*(volatile unsigned *)0x1d40004)
#define rADCDAT (*(volatile unsigned *)0x1d40008)
/* ADC 的各種指示符 */
#define ADCCON_FLAG 0x40 //轉(zhuǎn)換標(biāo)志
#define ADCCON_SLEEP 0x20 //休眠標(biāo)志
#define ADCCON_ADIN0 (0x0<<2)//輸入信道
#define ADCCON_ADIN1 (0x1<<2)
#define ADCCON_ADIN2 (0x2<<2)
#define ADCCON_ADIN3 (0x3<<2)
#define ADCCON_ADIN4 (0x4<<2)
#define ADCCON_ADIN5 (0x5<<2)
#define ADCCON_ADIN6 (0x6<<2)
#define ADCCON_ADIN7 (0x7<<2)
#define ADCCON_READ_START 0x2//讀使轉(zhuǎn)化標(biāo)志
⑶ ADCDAT,轉(zhuǎn)換結(jié)果數(shù)據(jù)寄存器。該寄存器的十位表示轉(zhuǎn)換后的結(jié)果,全為1時(shí)為
滿量程3.3 伏。
4.AD 轉(zhuǎn)換器在擴(kuò)展版的接法如下:
#define ADCCON_ENABLE_START 0x1//使能轉(zhuǎn)化標(biāo)志
將上述定義為一個(gè)AD 功能的頭文件,并且加入到工程中。
⑶ 在上面的文件中添加兩個(gè)執(zhí)行函數(shù),一個(gè)為初始化函數(shù),一個(gè)為轉(zhuǎn)換某路函數(shù)。
將函數(shù)放入AD 的函數(shù)庫(kù)中(*.c)。
初始化函數(shù):
void init_ADdevice()
{
rADCPSR=20; //采樣率為32
rADCCON=ADCCON_SLEEP;//進(jìn)入休眠模式
}
讀取某路模擬量函數(shù):
int GetADresult(int channel) //channel 為通道數(shù)
{
rADCCON=(channel<<2)|ADCCON_ENABLE_START; //啟動(dòng)某路轉(zhuǎn)換
while(!(rADCCON&ADCCON_FLAG)); //直到轉(zhuǎn)換完畢
return rADCDAT; //返回轉(zhuǎn)換結(jié)果
}
⑷ 在主函數(shù)中首先初始化AD 寄存器,編程實(shí)現(xiàn)循環(huán)采集8路模擬量,并且在超級(jí)終
端上顯示結(jié)果。
主函數(shù)如下:
int Main(int argc, char **argv)
{
int i;
float d=1024;
init_ADdevice();
Uart_Printf("\n");
while(1)
{
for(i=0;i<=7;i++)
{
d=GetADresult(i)*5.00/1024;
Uart_Printf("a%d=%f\n",i,d);
Delay(10000);
}
}
return 0;
}
⑸ 用萬(wàn)用表測(cè)量擴(kuò)展板上電位器兩端輸出電壓,記下輸出電壓。啟動(dòng)采集,觀察轉(zhuǎn)換
后的電壓值是否與測(cè)量值相等。
2.帶操作系統(tǒng)的A/D 功能實(shí)現(xiàn)
當(dāng)系統(tǒng)內(nèi)嵌入操作系統(tǒng)時(shí),由于相當(dāng)部分的工作已經(jīng)被系統(tǒng)執(zhí)行,甚至包括串行口的初
始化工作,所以A/D 功能的實(shí)現(xiàn)變的更加容易,下面我們看看如何周期性采集某路通道的
信號(hào),并在LCD 上顯示該信號(hào)的波形。
⑴ 打開(kāi)一個(gè)已有的工程文件,在其中的主函數(shù)MAIN 中添加AD 的寄存器初始化代碼,并添加鍵盤(pán)掃描任務(wù)。鍵盤(pán)掃描任務(wù)的代碼如下:
void Key_Scan_Task(void *Id)
{
U32 key;
POSMSG pmsg;
Uart_Printf(0,"key\n");
for (;;){
key=GetKey();
pmsg=OSCreateMessage(OSM_KEY,(key+1)&0xffff,key>>16);
if(pmsg)
SendMessage(pmsg);
}
}
同時(shí)將A/D 轉(zhuǎn)換單列為一個(gè)任務(wù)。軟件部分將通道0的模擬電壓經(jīng)A/D 轉(zhuǎn)換后到液晶
屏上展開(kāi)顯示。
void AD_Check_Task(void *Id)
{
int i;
float d;
init_ADdevice();
while(1)
{
if(ADOpen)
{
LCD_ChangeMode(DspGraMode);
ClearScreen();
for(i=0;i<=319;i++);
{
d=GetADresult(0)*5/1024;
Show(i,d);
OSTimeDly(1);
}
}
}
}
⑵ 在Main_Task 中添加消息響應(yīng)部分,通過(guò)設(shè)置某個(gè)全局變量,當(dāng)按鍵盤(pán)上的某個(gè)鍵
時(shí)(如nkey==4),變量改變,決定是否繼續(xù)采集。鍵盤(pán)響應(yīng)函數(shù)為:
void onKey(int nkey, int fnkey)
{
if(nkey==4)
if(ADOpen==True)
ADOpen=False;
else ADOpen=True;
}
AD 轉(zhuǎn)換任務(wù)在執(zhí)行時(shí),將檢測(cè)ADOpen 變量,判斷是否開(kāi)啟轉(zhuǎn)換。
⑶ 找一個(gè)信號(hào)發(fā)生器,使其產(chǎn)生0~5 伏連續(xù)變化的電壓。接到A/D 的0 通道上,動(dòng)
態(tài)采集電壓,并在屏幕上顯示出其電壓波動(dòng)情況(橫坐標(biāo)拉開(kāi),在屏幕上動(dòng)態(tài)刷新)。
顯示部分程序如下:
void Show(int i, float d)
{
PDC ADpdc;
U16 Point[2]={0x2e,0x00};
ADpdc=CreateDC();
TextOut(ADpdc,i,(int)(d*10),Point,TRUE, FONTSIZE_MIDDLE);
DestoryDC(ADpdc);
}
觀察LCD 上顯示的波形,并思考如果量程超出了測(cè)量范圍,應(yīng)采取何種方法測(cè)量模擬
電壓。
七、 思考題
1.逐次逼近型的A/D 轉(zhuǎn)換器原理是什么?
2.A/D 轉(zhuǎn)換的重要指標(biāo)包括哪些?
3.ARM 的A/D 功能的相關(guān)寄存器有哪幾個(gè),對(duì)應(yīng)的地址是什么?
4.如何啟動(dòng)ARM 開(kāi)始轉(zhuǎn)換A/D,有幾種方式?轉(zhuǎn)換開(kāi)始時(shí)ARM 是如何知道轉(zhuǎn)換哪
路通道的?如何判斷轉(zhuǎn)換結(jié)束?
5.怎樣動(dòng)態(tài)顯示某個(gè)通道的模擬電壓波形?
評(píng)論