⑴ 單片機中的ADC是什麼意思作用是什麼
ADC即模擬數字轉換器(英語:Analog-to-digital converter)是用於將模擬形式的連續信號轉換為數字形式的離散信號的一類設備。一個模擬數字轉換器可以提供信號用於測量。與之相對的設備成為數字模擬轉換器。
ADC的作用是將連續變化的模擬信號轉換為離散的數字信號。真實世界的模擬信號,例如溫度、壓力、聲音或者圖像等,需要轉換成更容易儲存、處理和發射的數字形式。
(上圖為ADC針腳排布)
(1)單片機課設adc項目要求擴展閱讀:
ADC模擬數字轉換器:
典型的模擬數字轉換器將模擬信號轉換為表示一定比例電壓值的數字信號。然而,有一些模擬數字轉換器並非純的電子設備,例如旋轉編碼器,也可以被視為模擬數字轉換器。
數字信號輸出可能會使用不同的編碼結構。通常會使用二進制二補數(也稱作「補碼」)進行表示,但也有其他情況,例如有的設備使用格雷碼(一種循環碼)。
參考資料來源:
網路-ADC
⑵ AT89S51 單片機 ADC 介面電路設計
⑶ 51單片機的ADC請教
IO口接電源用大電阻。允許輸入電流很小,大了會燒壞,熱了也會燒壞。
⑷ 單片機中 ADC 是如何進行採集的
摘 要:本文設計並實現了基於2.4GHz ISM頻段射頻收發晶元nRF2401的計算機短距離無線數據採集系統。該系統採用PC作為系統控制中心,以C8051F021單片機為核心構成數據採集傳送的前端,並且採用nRF2401晶元進行數據無線發射與接收。
關鍵詞:ISM頻段; 射頻; C8051F021單片機; nRF2401
引言
針對某醫療裝置中的人體生理信號採集和傳輸問題,本文設計了計算機近距離無線數據採集系統。採用Nodic公司的nRF2401作為無線收發核心器件。系統由一台PC、無線數據接收模塊和無線數據採集發射模塊組成。無線數據發射模塊以C8051F021單片機為處理核心,採用單片機內部的12位ADC對現場的模擬信號進行採集和發送;無線數據接收模塊以C8051F021單片機作為處理核心,接收與發射模塊由nRF2401無線收發晶元完成,採用MAX5591實現12位D/A轉換,採用 RS-485匯流排與PC進行通信,它負責現場數據的接收和初步處理,並轉發給PC以供顯示和監控,同時將數字量轉換為模擬量,供示波器顯示;PC有良好的人機界面,利用NI的虛擬示波器顯示遠端現場採集的數據,並可以向現場的採集模塊發送控制命令,同時可以實現保存採集數據、列印、回放歷史數據等功能。
系統分析及設計
計算機短距離無線數據採集系統組成如圖1所示。
圖 1 系統組成框圖
系統分析及硬體設計
由於現場要採集的數據為醫學人體實驗數據,幅值大約在-1.0V~+1.0V之間,頻率為300Hz,要求測量誤差低於10mV,C8051F021自帶的12位ADC在精度上可以滿足要求;但是單片機中的ADC要求輸入為正電壓,同時考慮到轉換精度要求,故需要對信號進行轉換,將原信號轉換為幅值在0~3V、頻率300Hz左右的信號。可以利用MAX4194組成信號轉換電路,將模擬信號的零參考電平抬升到1.0V。這樣,原先-1.0V~0V之間的電壓信號轉換為0~1.0V之間的電壓,而原先0V~1.0V之間的電壓轉換為1.0V~2.0V之間的電壓。這樣就完成了原始信號的轉換,適應了單片機的輸入要求。單片機A/D轉換參考電壓選擇外部3.3V,由MAX6013提供。
考慮到無線數據的發送與接收特點,故選用Nordic 公司的nRF2401晶元。nRF2401是單片射頻收發晶元,工作於2.4GHz~2.5GHz ISM頻段,晶元內置頻率合成器、功率放大器、晶體振盪器和調制器等功能模塊,輸出功率和通信頻道可通過程序進行配置。晶元功耗非常低,以-5dBm的功率發射時,工作電流只有10.5mA,接收時工作電流只有18mA。其獨有的DuoCeiver技術使nRF2401可以使用同一天線,同時接收兩個不同頻道的數據。nRF2401使用跳頻技術,在2400MHz~2527MHz之間設立了128個頻道(每個頻道帶寬1MHz),頻道間的切換時間小於200ms。此外,nRF2401內置CRC編解碼模塊,可以在不增加編程難度的條件下減小誤碼率。
無線數據接收後,要進行D/A轉換,供示波器觀看;考慮到數據的採集精度要求,故採用了 MAX5591作為轉換器件,一方面可以方便地與C8051F021單片機SPI介面連接,另一方面,它是12位DAC,與採集端的ADC匹配,可減小轉換誤差。
無線數據接收到終端後,要求能直觀地觀看,並且可以對現場的數據採集次數、採集啟停時間進行控制,故需要將數據傳到PC,進行顯示;同時,通過人機界面,對現場進行遠程式控制制。PC採用VC++編寫程序,利用NI 的虛擬示波器和其它控制項實現友好的人機界面,數據顯示、存儲和列印功能。
系統中的主要軟體模塊
系統軟體主要由上位機軟體和下位機軟體組成。
上位機軟體主要實現與單片機通信、波形顯示、數據存儲、數據回放、列印等功能。下位機的主要功能有:系統初始化、數據採集(A/D轉換)、無線數據發射、無線數據接收、數據D/A轉換、與PC串口通信等。下面重點介紹下位機的無線發射與接收部分軟體。
無線數據收發主要通過對nRF2401進行操作實現,包括器件配置、發送數據、接收數據等。nRF2401的工作模式通過引腳PWR_UP、CE和CS選擇。在RX/TX模式下,有兩種工作方式:ShockBurs和Direct Mode。本系統選用了ShockBurst模式,這種模式下需要配置的內容有:接收數據長度、接收通道地址、CRC校驗、工作方式、發送頻率、傳送速率、接收與發送等。需要15位元組的配置內容,下面給出了16進制的配置內容:0x80,0x80,0x00,0xcc,0xcc,0xcc,
0x00,0xcd,0xcd,0xcd,0xcd,0x83,0x4f,
0x05。
難點分析及解決方法
nRF2401半雙工通信方式與C8051全雙工通信介面的轉換
在數據的採集端,單片機與射頻模塊是雙向通信,可以直接採用單片機自帶的SPI 介面與射頻模塊單向通信,包括配置射頻模塊的工作方式、接收通道地址、接收數據長度、接收頻率、發送功率等參數和要發送的採集數據;當單片機要讀取遠端發送的控制命令時,要將SPI模式關閉,同時將MOSI、DR1埠定義為輸入方式,然後將射頻模塊接收的控制命令讀到單片機內部,並根據控制命令進行相應的操作,如採集通道選擇、採集次數設定、開始採集、停止採集、發送數據等。
表1 實驗數據表
在接收端,單片機和射頻模塊之間也是雙向通信,單片機首先關閉SPI 模式,將MISO定義為輸入模式,通過模擬的SPI 操作,對射頻模塊進行配置;當有控制命令要發送時,仍將MISO埠定義為輸出模式,將射頻模塊配置為發送模式,將控制命令發送到數據採集終端;當要接收採集終端傳來的數據時,首先將射頻模塊配置為接收模式,然後打開SPI 功能,利用單片機的SPI介面,將數據讀到單片機內部。
這樣,就完成了射頻模塊的半雙工通信介面與單片機全雙工通信介面的轉換。
單片機與MAX5591之間的
SPI介面通信
C8051單片機的SPI 操作時序不能滿足MAX5591的時序要求。要使單片機和MAX5591之間進行數據傳輸,必須根據MAX5591的時序要求將單片機的SPI時序進行轉換。
實驗結果及分析總結
實驗結果
現場模擬電壓信號通過12位ADC轉換為數字量,通過無線方式傳送到遠端監控室,一方面通過DAC轉換為模擬量,供示波器觀看;另一方面,通過RS-232傳送到PC進行顯示、存儲和列印。表1是實驗數據。
分析總結
從試驗數據可以看到,系統實現了現場模擬電壓信號的採集、無線傳輸以及模擬信號還原,誤差不大於0.2%,滿足了設計要求。同時系統還存在著不足之處:在數據量加大,傳輸速率為1MHz時,偶爾會出現數據丟失現象;當被測信號頻率大於500Hz的時候,信號復現時會出現波形失真。
系統實現了遠端現場採集8路人體生理信號,無線傳送到監控中心並復現現場信號的功能。實驗證明,系統在250Kbps速率下無線傳輸距離可達50米,採集信號誤差低於0.5% 。數據傳輸中採用了16位CRC校驗,降低了誤碼率。該系統已經在某醫療器械上得到應用。經改造,系統可以採集現場的數字量和一些開關量,實現設備狀態監測和開關量控制等。
結語
本文採用軟體切換的方式實現了半雙工器件與全雙工器件的通訊轉換,採用軟體模擬SPI操作,解決了多SPI器件之間的通信協議匹配問題。■
參考文獻:
1 沈陽新華龍電子有限公司,C8051F020/1/2/3 混合信號ISP FLASH 微控制器,2005
2 趙念強,鮑可進,申屠浩.基於SoC單片機8051F的碼頭供給監控系統 北京:微計算機信息, 2005年第3期第70頁
⑸ 懇求各位高手:幫忙看一下這個單片機課設題目唄。題目為 ADC0808轉換 謝謝!謝謝!
27. ADC0809A/D轉換器基本應用技術
1. 基本知識
ADC0809是帶有8位A/D轉換器、8路多路開關以及微處理機兼容的控制邏輯的CMOS組件。它是逐次逼近式A/D轉換器,可以和單片機直接介面。
(1). ADC0809的內部邏輯結構
由上圖可知,ADC0809由一個8路模擬開關、一個地址鎖存與解碼器、一個A/D轉換器和一個三態輸出鎖存器組成。多路開關可選通8個模擬通道,允許8路模擬量分時輸入,共用A/D轉換器進行轉換。三態輸出鎖器用於鎖存A/D轉換完的數字量,當OE端為高電平時,才可以從三態輸出鎖存器取走轉換完的數據。
(2). 引腳結構
IN0-IN7:8條模擬量輸入通道
ADC0809對輸入模擬量要求:信號單極性,電壓范圍是0-5V,若信號太小,必須進行放大;輸入的模擬量在轉換過程中應該保持不變,如若模擬量變化太快,則需在輸入前增加采樣保持電路。
地址輸入和控制線:4條
ALE為地址鎖存允許輸入線,高電平有效。當ALE線為高電平時,地址鎖存與解碼器將A,B,C三條地址線的地址信號進行鎖存,經解碼後被選中的通道的模擬量進轉換器進行轉換。A,B和C為地址輸入線,用於選通IN0-IN7上的一路模擬量輸入。通道選擇表如下表所示。
C B A 選擇的通道
0 0 0 IN0
0 0 1 IN1
0 1 0 IN2
0 1 1 IN3
1 0 0 IN4
1 0 1 IN5
1 1 0 IN6
1 1 1 IN7
數字量輸出及控制線:11條
ST為轉換啟動信號。當ST上跳沿時,所有內部寄存器清零;下跳沿時,開始進行A/D轉換;在轉換期間,ST應保持低電平。EOC為轉換結束信號。當EOC為高電平時,表明轉換結束;否則,表明正在進行A/D轉換。OE為輸出允許信號,用於控制三條輸出鎖存器向單片機輸出轉換得到的數據。OE=1,輸出轉換得到的數據;OE=0,輸出數據線呈高阻狀態。D7-D0為數字量輸出線。
CLK為時鍾輸入信號線。因ADC0809的內部沒有時鍾電路,所需時鍾信號必須由外界提供,通常使用頻率為500KHZ,
VREF(+),VREF(-)為參考電壓輸入。
2. ADC0809應用說明
(1). ADC0809內部帶有輸出鎖存器,可以與AT89S51單片機直接相連。
(2). 初始化時,使ST和OE信號全為低電平。
(3). 送要轉換的哪一通道的地址到A,B,C埠上。
(4). 在ST端給出一個至少有100ns寬的正脈沖信號。
(5). 是否轉換完畢,我們根據EOC信號來判斷。
(6). 當EOC變為高電平時,這時給OE為高電平,轉換的數據就輸出給單片機了。
3. 實驗任務
如下圖所示,從ADC0809的通道IN3輸入0-5V之間的模擬量,通過ADC0809轉換成數字量在數碼管上以十進制形成顯示出來。ADC0809的VREF接+5V電壓。
4. 電路原理圖
圖1.27.1
5. 系統板上硬體連線
(1). 把「單片機系統板」區域中的P1埠的P1.0-P1.7用8芯排線連接到「動態數碼顯示」區域中的A B C D E F G H埠上,作為數碼管的筆段驅動。
(2). 把「單片機系統板」區域中的P2埠的P2.0-P2.7用8芯排線連接到「動態數碼顯示」區域中的S1 S2 S3 S4 S5 S6 S7 S8埠上,作為數碼管的位段選擇。
(3). 把「單片機系統板」區域中的P0埠的P0.0-P0.7用8芯排線連接到「模數轉換模塊」區域中的D0D1D2D3D4D5D6D7埠上,A/D轉換完畢的數據輸入到單片機的P0埠
(4). 把「模數轉換模塊」區域中的VREF端子用導線連接到「電源模塊」區域中的VCC端子上;
(5). 把「模數轉換模塊」區域中的A2A1A0端子用導線連接到「單片機系統」區域中的P3.4P3.5P3.6端子上;
(6). 把「模數轉換模塊」區域中的ST端子用導線連接到「單片機系統」區域中的P3.0端子上;
(7). 把「模數轉換模塊」區域中的OE端子用導線連接到「單片機系統」區域中的P3.1端子上;
(8). 把「模數轉換模塊」區域中的EOC端子用導線連接到「單片機系統」區域中的P3.2端子上;
(9). 把「模數轉換模塊」區域中的CLK端子用導線連接到「分頻模塊」區域中的/4端子上;
(10). 把「分頻模塊」區域中的CK IN端子用導線連接到「單片機系統」區域中的ALE端子上;
(11). 把「模數轉換模塊」區域中的IN3端子用導線連接到「三路可調壓模塊」區域中的VR1端子上;
6. 程序設計內容
(1). 進行A/D轉換時,採用查詢EOC的標志信號來檢測A/D轉換是否完畢,若完畢則把數據通過P0埠讀入,經過數據處理之後在數碼管上顯示。
(2). 進行A/D轉換之前,要啟動轉換的方法:
ABC=110選擇第三通道
ST=0,ST=1,ST=0產生啟動轉換的正脈沖信號
7. 匯編源程序
CH EQU 30H
DPCNT EQU 31H
DPBUF EQU 33H
GDATA EQU 32H
ST BIT P3.0
OE BIT P3.1
EOC BIT P3.2
ORG 00H
LJMP START
ORG 0BH
LJMP T0X
ORG 30H
START: MOV CH,#0BCH
MOV DPCNT,#00H
MOV R1,#DPCNT
MOV R7,#5
MOV A,#10
MOV R0,#DPBUF
LOP: MOV @R0,A
INC R0
DJNZ R7,LOP
MOV @R0,#00H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#00H
MOV TMOD,#01H
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: CLR ST
SETB ST
CLR ST
WAIT: JNB EOC,WAIT
SETB OE
MOV GDATA,P0
CLR OE
MOV A,GDATA
MOV B,#100
DIV AB
MOV 33H,A
MOV A,B
MOV B,#10
DIV AB
MOV 34H,A
MOV 35H,B
SJMP WT
T0X: NOP
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
MOV DPTR,#DPCD
MOV A,DPCNT
ADD A,#DPBUF
MOV R0,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
MOV DPTR,#DPBT
MOV A,DPCNT
MOVC A,@A+DPTR
MOV P2,A
INC DPCNT
MOV A,DPCNT
CJNE A,#8,NEXT
MOV DPCNT,#00H
NEXT: RETI
DPCD: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH,00H
DPBT: DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH
END
8. C語言源程序
#include <AT89X52.H>
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
unsigned char channel=0xbc;//IN3
unsigned char getdata;
void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
TR0=1;
ET0=1;
EA=1;
P3=channel;
while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
dispbuf[2]=getdata/100;
getdata=getdata%10;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata%10;
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}