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