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