版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第5章
模/數(shù)和數(shù)/模轉(zhuǎn)換器模擬量隨時間連續(xù)變化的量可以是電量,如模擬電壓、電流,也可以是非電量,如溫度、濕度、壓力、氣體濃度等數(shù)字量離散變化的量A/D轉(zhuǎn)換器(ADC:AnalogtoDigitalConverter)是一種能把模擬量轉(zhuǎn)換成相應的數(shù)字量的電子器件。一般先用傳感器或變送器采集非電模擬量轉(zhuǎn)換成電模擬量D/A轉(zhuǎn)換器(DAC:DigitaltoAnalogConverter)則相反,它能把數(shù)字量轉(zhuǎn)換成相應的模擬量。數(shù)據(jù)采集過程控制單片機實時閉環(huán)控制系統(tǒng)示意圖
多路開關A/D其它功能
D/A被控實體單片機傳感器傳感器模擬→數(shù)字數(shù)字→模擬非電模擬量→電模擬量選擇一路5.1模/數(shù)轉(zhuǎn)換器5.2數(shù)/模轉(zhuǎn)換器
5.3電壓基準
5.4比較器第5章
模/數(shù)和數(shù)/模轉(zhuǎn)換器5.1模/數(shù)轉(zhuǎn)換器5.1.1模數(shù)轉(zhuǎn)換原理和性能指標5.1.2C8051F020的ADC0功能結(jié)構(gòu)5.1.3模擬多路選擇器和PGA5.1.4ADC的工作方式5.1.5ADC0可編程窗口檢測器5.1.6ADC1(8位ADC)5.1.7模數(shù)轉(zhuǎn)換舉例5.1模/數(shù)轉(zhuǎn)換器A/D是將模擬量轉(zhuǎn)換成數(shù)字量的器件。模擬量可以是電壓、電流等電信號,也可以是聲、光、壓力、濕度、溫度等隨時間連續(xù)變化的非電的物理量。非電的模擬量可通過合適的傳感器(如光電傳感器、壓力傳感器、溫度傳感器)轉(zhuǎn)換成電信號。C8051F020片內(nèi)包含一個9通道的12位的模數(shù)轉(zhuǎn)換器ADC0和一個8通道8位的模數(shù)轉(zhuǎn)換器ADC1。5.1.1模數(shù)轉(zhuǎn)換原理即性能指標1.轉(zhuǎn)換原理種類(按轉(zhuǎn)換原理分)計數(shù)式簡單、速度慢,很少使用并行式速度最快、結(jié)構(gòu)復雜、價格高,用于速度要求極高場合雙積分式抗干擾能力強、精度高、速度較慢,用于儀器儀表逐次逼近式
結(jié)構(gòu)簡單、速度較高,計算機測控中常用轉(zhuǎn)換原理—計數(shù)式時鐘復位數(shù)字輸出比較器模擬輸入計數(shù)器D/A轉(zhuǎn)換器轉(zhuǎn)換結(jié)束以最低位為增減量的逐步計數(shù)法轉(zhuǎn)換原理—逐次逼近式
N位寄存器VsABVxN位D/A控制邏輯比較器模擬量輸入啟動DONE從最高位開始的逐位試探法(1)逐次逼近式A/D轉(zhuǎn)換器控制邏輯先將結(jié)果寄存器的最高位Dn-1置1若Vx>Vs則保留此位Dn-1(為1),否則將Dn-1清0。然后控制邏輯將結(jié)果寄存器的次高位Dn-2置1Vs再和Vx比較,以決定Dn-2位保留為1還是清成“0”,依次類推到最低位D0。結(jié)果寄存器的狀態(tài)便是與輸入的模擬量Vx對應的數(shù)字量。轉(zhuǎn)換原理—雙積分式
也稱二重積分式,其實質(zhì)是測量和比較兩個積分的時間。一個是對輸入模擬電壓積分的時間T0,此時間往往是固定的;另一個是以充電后的電壓Vi為初值,對參考電源Vref反向積分,積分電容被放電至零所需的時間Ti(Vref
與Vi符號相反)。模擬輸入電壓Vi與參考電壓Vref之比,等于上述兩個時間之比。由于Vref
、T0
固定,而放電時間Ti可以測出,因而可計算出模擬輸入電壓的大小。
雙積分式A/D轉(zhuǎn)換器工作原理圖Ti1tA控制邏輯B-+計數(shù)器時鐘Vi模擬輸入Vref標準電壓Vi2Vi1Ti2固定積分時間積分輸出開始斜率固定(b)積分原理(a)原理框圖T02.性能指標(1)衡量A/D性能的主要參數(shù)是:(1)
分辨率(resolution)分辨率是指輸出的數(shù)字量變化一個相鄰的值所對應的輸入模擬量的變化值;取決于輸出數(shù)字量的二進制位數(shù)。一個n位的A/D轉(zhuǎn)換器所能分辨的最小輸入模擬增量定義為滿量程值的2-n倍。例如,滿量程為10V的8位A/D芯片的分辨率為
10V×2-8=39mV;而16位的A/D是
10V×2-16=153μV。2.性能指標(2)(2)滿刻度誤差(fullscaleerror) 滿刻度誤差也稱增益誤差,即輸出全1時輸入電壓與理想輸入量之差。(3)轉(zhuǎn)換速率(conversionrate) 轉(zhuǎn)換速率是指完成一次A/D轉(zhuǎn)換所需時間的倒數(shù),A/D轉(zhuǎn)換器型號不同,轉(zhuǎn)換速度差別很大。(4)轉(zhuǎn)換精度(conversionaccuracy) 轉(zhuǎn)換精度由模擬誤差和數(shù)字誤差組成。模擬誤差屬于非固定誤差,由器件質(zhì)量決定,數(shù)字誤差和A/D輸出數(shù)字量的位數(shù)有關,位數(shù)越多,誤差越小。5.1.2C8051F020的ADC0功能結(jié)構(gòu)(1)C8051F020的ADC0子系統(tǒng)是一個100ksps、12位分辨率的逐次逼近型ADC。一個9通道的可編程模擬多路選擇器(AMUX0)一個可編程增益放大器(PGA0)一個100ksps、12位分辨率的逐次逼近型ADC,ADC中集成了跟蹤保持電路和可編程窗口檢測器。ADC0子系統(tǒng)功能框圖
輸入方式配置
通道選擇
配置寄存器
控制寄存器內(nèi)置溫度傳感器窗口寄存器窗口比較中斷5.1.3模擬多路選擇器和PGA(1)模擬多路選擇器AMUX(AnalogMultiplexer)中的8個通道用于外部測量,而第9通道在內(nèi)部被接到片內(nèi)溫度傳感器。9個通道通過通道選擇寄存器AMX0SL和配置寄存器AMX0CF進行選擇和配置??梢詫MUX輸入對編程為差分或單端方式。5.1.3模擬多路選擇器和PGA(2)配置寄存器AMX0CF的格式如下:
R/WR/WR/WR/WR/WR/WR/WR/W復位值----AIN67ICAIN45ICAIN23ICAIN01IC00000000位7位6位5位4位3位2位1位0SFR地址:0xBA位3:AIN67IC:AIN6、AIN7輸入對配置位
0:AIN6和AIN7為獨立的單端輸入
1:AIN6,AIN7為+,-差分輸入對注:差分通道輸出的數(shù)據(jù)格式是2的補碼5.1.3模擬多路選擇器和PGA(3)通道選擇寄存器AMX0SL的格式如下:
R/WR/WR/WR/WR/WR/WR/WR/W復位值----AMX0AD3AMX0AD2AMX0AD1AMX0AD000000000位7位6位5位4位3位2位1位0SFR地址:0xBB位3-0:AMX0AD3-0:AMUX0地址位0000-1111b:根據(jù)不同組合選擇ADC輸入的通道。
模擬通道配置5.1.3模擬多路選擇器和PGA(4)PGA(programmablegainamplifier),可編程增益放大器。對AMUX輸出信號的放大倍數(shù)由ADC0配置寄存器ADC0CF中的AMP0GN2-0確定。PGA增益可以用軟件編程為0.5、1、2、4、8或16,復位后的默認增益為1。注意,PGA0的增益對溫度傳感器也起作用。P244ADC0CF格式5.1.4ADC的工作方式
(1)1.轉(zhuǎn)換過程由控制寄存器ADC0CN來設置和控制,其格式如下:R/WR/WR/WR/WR/WR/WR/WR/W復位值AD0ENAD0TMAD0INTAD0BUSYAD0CM1AD0CM0AD0WINTAD0LJST00000000位7使能位
位6跟蹤方式位5轉(zhuǎn)換結(jié)束中斷位4忙標志
位3啟動方式
位2啟動方式位1窗口比較中斷位0對齊方式SFR地址:0xE85.1.4ADC的工作方式
(2)C8051F020的ADC0有4種轉(zhuǎn)換啟動方式,由ADC0CN中的ADC0啟動轉(zhuǎn)換方式位(AD0CM1,AD0CM0)的狀態(tài)決定。00:向AD0BUSY寫1時啟動01:定時器3溢出時啟動10:CNVSTR上升沿啟動11:定時器2溢出時啟動AD0BUSY位在轉(zhuǎn)換期間為1,轉(zhuǎn)換結(jié)束后復0,并置中斷標志AD0INT。查詢方式編程步驟(1)寫0到AD0INT;(2)向AD0BUSY寫1,啟動轉(zhuǎn)換;(3)查詢并等待AD0INT變1;(4)處理ADC0數(shù)據(jù)
AD0INT=0; AD0BUSY=1; while(!AD0INT); result=ADC0;2.跟蹤方式
每次ADC轉(zhuǎn)換之前都必須有一段最小的跟蹤時間,以保證得到精確的轉(zhuǎn)換結(jié)果ADC0CN中的AD0TM位控制ADC0的跟蹤保持方式。在缺省狀態(tài),除了轉(zhuǎn)換期間ADC0輸入被連續(xù)跟蹤。當AD0TM=1,ADC0工作在低功耗跟蹤保持方式。每次轉(zhuǎn)換之前都有3個SAR時鐘的跟蹤周期(在啟動轉(zhuǎn)換信號有效之后)。當CNVSTR信號用于在低功耗跟蹤保持方式啟動轉(zhuǎn)換時,ADC0只在CNVSTR為低電平時跟蹤;在CNVSTR的上升沿開始轉(zhuǎn)換。當整個芯片處于低功耗待機或休眠方式時,跟蹤可以被禁止(關斷)。12位ADC跟蹤和轉(zhuǎn)換時序
CNVSTR低電平跟蹤,上升沿開始轉(zhuǎn)換只跟蹤3個周期轉(zhuǎn)換結(jié)束進入低功耗狀態(tài)除轉(zhuǎn)換外一直跟蹤3.建立時間要求當ADC0輸入配置發(fā)生改變時(AMUX或PGA的選擇發(fā)生變化),在進行一次精確的轉(zhuǎn)換之前需要有一個最小的跟蹤時間,稱建立時間。對于一個給定的建立精度(SA),所需要的ADC0建立時間可以用方程估算:
ADC0建立時間
:SA是建立精度,用一個LSB的分數(shù)表示(例如,建立精度0.25對應1/4LSB);t為所需要的建立時間,以秒為單位;RTOTAL為ADC0模擬多路器電阻與外部信號源電阻之和;n為ADC0的分辨率,用比特表示。
ADC0等效輸入電路
4.轉(zhuǎn)換結(jié)果格式12位轉(zhuǎn)換結(jié)果存放在ADC0H、ADC0L中。AD0LJST=0:數(shù)據(jù)右對齊,ADC0H的位7-4為位3的符號擴展位、位3-0是12位ADC0數(shù)據(jù)字的高4位。ADC0L的位7-0為12位ADC0數(shù)據(jù)字的低8位。AD0LJST=1:數(shù)據(jù)左對齊,ADC0H位7-0為12位ADC0數(shù)據(jù)字的高8位。ADC0L的位7-4為12位ADC0數(shù)據(jù)字的低4位,ADC0L的位3-0恒為0。符號擴展ADC0H(4位)ADC0L(8位)ADC0H(8位)ADC0L(5位)000數(shù)據(jù)字轉(zhuǎn)換表
AIN0為單端輸入方式:數(shù)據(jù)是無符號數(shù)高4位為0(符號)低4位為0AIN0-AIN1為差分輸入對:
數(shù)據(jù)為帶符號數(shù)(右對齊,高四位為補碼符號擴展)高4位為符號擴展低4位為05.1.5ADC0可編程窗口檢測器
ADC0可編程窗口檢測器提供一個中斷,當ADC0轉(zhuǎn)換值在下限(大于)寄存器ADC0GTH:ADC0GTL和上限(小于)寄存器ADC0LTH:ADC0LTL范圍之內(nèi),并且中斷開啟時,引發(fā)相應中斷。下限值<上限值時,檢測值位于極限值內(nèi)時有效,可引起中斷。下限值>上限值時,檢測值位于極限值以外時有效,可引起中斷。默認下限值為0xffff,上限值為0x0000,全范圍不引發(fā)中斷。ADC0右對齊的單端數(shù)據(jù)窗口中斷示例
數(shù)據(jù)在此范圍中斷ADC0右對齊的差分數(shù)據(jù)窗口中斷示例數(shù)據(jù)在此范圍中斷ADC0左對齊的單端數(shù)據(jù)窗口中斷示例數(shù)據(jù)在此范圍中斷ADC0左對齊的差分數(shù)據(jù)窗口中斷示例數(shù)據(jù)在此范圍中斷5.1.6ADC1(8位ADC)
C8051F020還有一個ADC1子系統(tǒng),包括一個8通道(無內(nèi)置的溫度通道)的可配置模擬多路開關(AMUX1),一個可編程增益放大器(PGA1)和一個500ksps、8位分辨率的逐次逼近型ADC,該ADC中集成了跟蹤保持電路。
與ADC1工作有關的SFR有ADC1配置寄存器ADC1CF、AMUX配置寄存器AMX1SL、ADC1控制寄存器ADC1CN、ADC1數(shù)據(jù)寄存器ADC1。
與ADC0區(qū)別:無窗口比較功能,無差分方式,只有4種增益倍數(shù),啟動方式增加到5種。ADC1原理框圖
選擇通道
放大倍數(shù)
轉(zhuǎn)換時鐘頻率
3.跟蹤方式
ADC1CN中的AD1TM位控制ADC1的跟蹤保持方式。工作原理與過程同ADC0類似。ADC1跟蹤和轉(zhuǎn)換時序舉例
內(nèi)容回顧A/D轉(zhuǎn)換器把模擬量轉(zhuǎn)換成相應數(shù)字量的電子器件。數(shù)據(jù)采集按原理分類并行式、計數(shù)式、逐次逼近式、雙積分式分辨率:滿量程電壓/2nD/A轉(zhuǎn)換器把數(shù)字量轉(zhuǎn)換成相應模擬量的電子器件。自動控制單片機實時閉環(huán)控制系統(tǒng)示意圖
多路開關A/D其它功能
D/A被控實體單片機傳感器傳感器數(shù)據(jù)采集自動控制內(nèi)容回顧通道配置與選擇差分、單端AMX0CF、AMX0SL增益放大與轉(zhuǎn)換時鐘控制0.5、1、2、4、8、16ADC0CF啟動方式向AD0BUSY位寫1T3溢出T2溢出外部信號啟動(CNVSTR上升沿)跟蹤方式每次ADC轉(zhuǎn)換之前必須有一段最小的跟蹤時間,以保證得到精確的轉(zhuǎn)換結(jié)果連續(xù)跟蹤(默認)低功耗跟蹤(轉(zhuǎn)換啟動后跟蹤3個SAR時鐘周期或CNVSTR為低時跟蹤)數(shù)據(jù)對齊方式左對齊、右對齊內(nèi)容回顧—ADC0組成內(nèi)容回顧可編程窗口檢測器下限值<上限值時,檢測值位于極限值內(nèi)時有效,可引起中斷。下限值>上限值時,檢測值位于極限值以外時有效,可引起中斷。軟件啟動轉(zhuǎn)換、查詢方式讀結(jié)果方法寫0到AD0INT;向AD0BUSY寫1,啟動轉(zhuǎn)換;查詢并等待AD0INT變1;處理ADC0數(shù)據(jù)5.1.7模數(shù)轉(zhuǎn)換舉例1.片內(nèi)溫度傳感器數(shù)據(jù)采集C8051F020的ADC0中有一個片內(nèi)溫度傳感器,溫度傳感器產(chǎn)生一個與器件內(nèi)部溫度成正比的電壓,作為單端輸入提供給AMUX,轉(zhuǎn)換結(jié)果經(jīng)簡單數(shù)學運算可以轉(zhuǎn)換成度數(shù)表示的溫度。溫度轉(zhuǎn)換器的典型應用有系統(tǒng)環(huán)境檢測、系統(tǒng)過熱測試和在基于熱電偶的應用中測量冷端溫度。本例使用左對齊,這樣可使代碼的權(quán)值與ADC的位數(shù)(12或10)無關。ADC轉(zhuǎn)換步驟
(1)通過將TEMPE(REF0CN.2,P276)設置為1來允許溫度傳感器工作。模擬偏置發(fā)生器和內(nèi)部電壓基準的允許位REF0CN.1和REF0CN.0也要置1。即:movREF0CN,#07h;允許溫度傳感器、模擬偏置發(fā)生器和電壓基準(2)選擇溫度傳感器作為ADC的輸入。這可以通過寫AMX0SL來完成,例如:movAMX0SL,#0fh;選擇溫度傳感器作ADC輸入,1×××(3)設置位于ADC0CF中的ADC0SAR時鐘分頻系數(shù),特別是ADC轉(zhuǎn)換時鐘的周期至少應為500ns。ADC轉(zhuǎn)換步驟(4)選擇ADC的增益。如果使用內(nèi)部電壓基準,則該值大約為2.4V。溫度傳感器所能產(chǎn)生的最大電壓值稍大于1V。因此,可以安全地將ADC的增益設置為2,以提高溫度分辨率。設置ADC增益的配置位在ADC0CF中。所以,有
movADC0CF,#61h;設置ADC的時鐘為SYSCLK/13、增益為2,P245(5)將ADC配置為低功耗跟蹤方式,向AD0BUSY寫1啟動轉(zhuǎn)換
movADC0CN,#C1H;允許ADC;AD0BUSY作轉(zhuǎn)換啟動信號(6)至此,可以通過將AD0BUSY寫1來啟動一次轉(zhuǎn)換:
setbAD0BUSY
;
啟動轉(zhuǎn)換(7)用查詢或中斷方式(ADC0CN的AD0INT位)等待轉(zhuǎn)換完成。ADC輸出寄存器中的值就是與絕對溫度成正比的代碼。如何通過采樣值得到溫度的攝氏度數(shù)值:溫度傳感器產(chǎn)生一個與器件內(nèi)部絕對溫度成正比的電壓輸出。
Vtemp——溫度傳感器的輸出電壓;
Temp——器件內(nèi)部的攝氏溫度值。溫度傳感器的傳輸特性
A/D的輸出值為:
CODE——左對齊的ADC輸出代碼;
Gain——PGA的增益;
VREF——電壓基準的電壓值。假設Gain=2和VREF=2.43V,得到輸出溫度值為式
其中
Temp——溫度的攝氏度數(shù)值。
實際的環(huán)境溫度測量溫度傳感器測量的是器件的內(nèi)部溫度。如果希望測量環(huán)境溫度,則必須考慮器件的自熱效應。由于器件功率消耗的原因,測量值很可能比環(huán)境溫度值高幾度。
一種方法是在器件上電之后立即啟動一次轉(zhuǎn)換,得到一個“冷”溫度值;然后大約經(jīng)過1min之后再測量一次,得到一個“熱”溫度值。這兩個測量值的差就是因自熱而產(chǎn)生的溫度增加值。
另一種方法是讓器件從一個低的SYSCLK頻率開始工作,例如32kHz,進行一次溫度測量,然后再讓器件工作在較高頻率,例如16MHz的內(nèi)部振蕩器,取兩者之差。在時鐘頻率更低時自熱值是可忽略的,因為此時器件的功耗很低。
(1)查詢法程序ADC0配置為寫AD0BUSY作為轉(zhuǎn)換的開始信號;溫度傳感器的輸出轉(zhuǎn)換成攝氏溫度由UART0傳輸出去;通過PC機超級終端(或其他串口調(diào)試程序)來觀察溫度采樣值。假設在XTAL1和XTAL2之間連接22.1184MHz晶振系統(tǒng)時鐘頻率存儲在全局常量SYSCLK中,目標器件UART波特率存儲在全局常量BAUDRATE中
主程序voidmain(void){longtemperature; //溫度inttemp_int,temp_frac; //溫度的整數(shù)和小數(shù)部分WDTCN=0xde; //禁止看門狗定時器WDTCN=0xad;SYSCLK_Init(); //初始化振蕩器PORT_Init(); //初始化數(shù)據(jù)交叉開關和通用IO口UART0_Init(); //初始化UART0ADC0_Init(); //初始化和使能ADCwhile(1){AD0INT=0;
//清除轉(zhuǎn)換結(jié)束標記,見P246步驟AD0BUSY=1;
//啟動轉(zhuǎn)換while(AD0INT==0); //等待轉(zhuǎn)換結(jié)束temperature=ADC0; //讀ADC0數(shù)據(jù)temperature=temperature-41857;
//減去偏移量,對應0℃的值。temperature=(temperature*100L)/154; //計算出對應的溫度值temp_int=temperature/100; //得到溫度值的整數(shù)部分temp_frac=temperature-(temp_int*100); //得到溫度值的小數(shù)部分printf(“Temperatureis%+02d.%02d\n”,temp_int,temp_frac);//串口輸出}}問題:temperature為什么要定義成long類型?C51用其實現(xiàn)UART通信系統(tǒng)時鐘初始化//此程序初始化系統(tǒng)時鐘使用外部22.1184MHz晶體作為時鐘源voidSYSCLK_Init(void){inti; //延時計數(shù)器OSCXCN=0x67; //啟動外部振蕩器22.1184MHz晶體for(i=0;i<256;i++);//等待振蕩器啟動
(>1ms)while(!(OSCXCN&0x80)); //等待晶體振蕩器穩(wěn)定OSCICN=0x88;//選擇外部振蕩器為系統(tǒng)時鐘源并使能時鐘丟失檢測器}
詳見P75建議過程IO口初始化
//配置數(shù)據(jù)交叉開關和通用I/O口voidPORT_Init(void){XBR0=0x04; //使能UART0XBR1=0x00;//可去掉XBR2=0x40; //使能數(shù)據(jù)交叉開關和弱上拉P0MDOUT|=0x01; //使能TX0,推挽輸出}同P179串口交叉開關配置UART0初始化//配置UART0使用定時器1產(chǎn)生波特率voidUART0_Init(void){SCON0=0x50; //SCON0:模式1,8位UART,允許RXTMOD=0x20; //TMOD:1定時器,
模式2,
8位重裝TH1=-(SYSCLK/BAUDRATE/16);//T1重裝值,P193公式TR1=1; //啟動定時器1CKCON|=0x10; //定時器1使用系統(tǒng)時鐘為時基PCON|=0x80; //SMOD0=1TI0=1; //表示發(fā)送就緒}ADC0初始化//配置ADC0使用AD0BUSY作為轉(zhuǎn)換源,使用左對齊輸出模式,//使用正常跟蹤模式,測量片內(nèi)溫度傳感器器輸出//禁止ADC0轉(zhuǎn)換結(jié)束中斷和ADC0窗口比較器中斷voidADC0_Init(void){ADC0CN=0x81; //ADC0使能;正常跟蹤模式;寫AD0BUSY時啟動轉(zhuǎn)換;
//數(shù)據(jù)左對齊REF0CN=0x07; //使能溫度傳感器片內(nèi)VREF和VREF輸出緩沖器AMX0SL=0x0f; //選擇溫度傳感器作為ADC多路模擬轉(zhuǎn)換器輸出ADC0CF=(SYSCLK/2500000-1)<<3;//ADC轉(zhuǎn)換時鐘=2.5MHzADC0CF|=0x01; //PGA增益=2EIE2&=~0x02;
//禁止ADC0EOC中斷EIE1&=~0x04;
//禁止ADC0窗口比較器中斷}P244(2)中斷方式程序
在中斷模式使用T3溢出作為啟動轉(zhuǎn)換信號,
測量片內(nèi)溫度傳感器輸出。ADC0結(jié)果經(jīng)簡單的均值濾波處理,均值濾波計數(shù)值由常量INT_DEC給出。ADC結(jié)果經(jīng)計算得出溫度從UART0傳輸。假設在XTAL1和XTAL2之連接22.1184MHz晶體。系統(tǒng)時鐘頻率存儲在全局常量SYSCLK目標UART波特率存儲在全局常量BAUDRATE。
ADC0采樣率存儲在全局常量SAMPLERATE0。
主程序Timer3_Init(SYSCLK/SAMPLERATE0);//初始化定時器3溢出為采樣速率ADC0_Init(); //初始化ADCAD0EN=1; //使能ADC,也可以放在初始化里使能EA=1; //使能所有中斷while(1){EA=0; //禁止中斷temperature=result;EA=1; //重新使能中斷temperature=temperature-41857;//計算溫度(百分之一精度)temperature=(temperature*100L)/154;temp_int=temperature/100;temp_frac=temperature-(temp_int*100);printf(“Temperatureis%+02d.%02d\n”,temp_int,temp_frac);}ADC0初始化//配置ADC0使用定時器3溢出作為轉(zhuǎn)換源,轉(zhuǎn)換結(jié)束產(chǎn)生中斷//使用左對齊輸出模式允許ADC轉(zhuǎn)換結(jié)束中斷,禁止ADCvoidADC0_Init(void){ADC0CN=0x05; //ADC0禁止;正常跟蹤
mode;T3溢出開始轉(zhuǎn)換
//數(shù)據(jù)左對齊REF0CN=0x07; //允許溫度傳感器片內(nèi)VREF和VREF輸出緩沖器AMX0SL=0x0f; //選擇溫度傳感器作為ADC多路模擬轉(zhuǎn)換輸出ADC0CF=(SYSCLK/2500000-1)<<3;//ADC轉(zhuǎn)換時鐘=2.5MHzADC0CF|=0x01;//PGA增益=2EIE2|=0x02; //允許ADC中斷}定時器3初始化//配置定時器3,自動重裝間隔由“counts”指定,
不產(chǎn)生//中斷,使用系統(tǒng)時鐘為時基.voidTimer3_Init(intcounts){TMR3CN=0x02; //停止定時器3;清除
TF3;//使用系統(tǒng)時鐘為時基TMR3RL=-counts; //初始化重裝值TMR3=0xffff; //設置為立即重裝EIE2&=~0x01; //禁止定時器3中斷TMR3CN|=0x04; //起動定時器3}中斷服務程序//得到ADC0采樣值,將它加到運行總數(shù)accumulator中,//當int_dec為0時,在全局變量result放置數(shù)字濾波后的結(jié)果voidADC0_ISR(void)interrupt15{staticunsignedint_dec=INT_DEC;//數(shù)字濾波計數(shù)器,
//int_dec=0時重設新值staticlongaccumulator=0L;AD0INT=0; //清除ADC轉(zhuǎn)換結(jié)束標志accumulator+=ADC0; //讀ADC值并加到運行總數(shù)中int_dec--; //更新數(shù)字濾波計數(shù)器if(int_dec==0){ //如果為0,計算結(jié)果
int_dec=INT_DEC;
//重設計數(shù)器
result=accumulator>>8;
//除以256,求平均值(數(shù)字濾波)
accumulator=0L;
//復位accumulator}}2.多通道數(shù)據(jù)采集
ADC0工作在中斷模式,使用定時器3溢出作為開始轉(zhuǎn)換信號測量AIN0~AIN7的電壓和溫度傳感器轉(zhuǎn)換結(jié)果經(jīng)過計算所得電壓從UART0傳輸假設在XTAL1和XTAL2之間接22.1184MHz晶振系統(tǒng)時鐘頻率存儲在全局常量SYSCLK目標UART波特率存儲在全局常量BAUDRATEADC0采樣頻率存儲在全局常量SAMPLERATE0電壓參考值存儲在VREF0
主程序voidmain(void){longvoltage; //電壓以mV為單位inti; //循環(huán)計數(shù)器WDTCN=0xde; //禁止看門狗定時器WDTCN=0xad;SYSCLK_Init(); //初始化振蕩器PORT_Init(); //初始化數(shù)據(jù)交叉開關和通用IOUART0_Init(); //初始化UART0Timer3_Init(SYSCLK/SAMPLERATE0);//初始化T3溢出作為采樣率ADC0_Init(); //初始化ADCAD0EN=1; //允許ADCEA=1; //允許所有中斷while(1){for(i=0;i<9;i++){EA=0; //禁止中斷voltage=result[i]; //從全局變量取得ADC值EA=1; //重新使能中斷//計算電壓(mV)voltage=voltage*VREF0;voltage=voltage>>4;//右移4位,得到實際大小printf(“Channel‘%d’voltageis%ldmV\n”,i,voltage);}}}系統(tǒng)時鐘初始化
//此程序初始化系統(tǒng)時鐘使用22.1184MHz晶體作為系統(tǒng)時鐘voidSYSCLK_Init(void){inti; //延時計數(shù)器OSCXCN=0x67; //起動外部振蕩器22.1184MHz晶體for(i=0;i<256;i++); //等待振蕩器啟動(>1ms)while(!(OSCXCN&0x80));//等待晶體振蕩器穩(wěn)定OSCICN=0x88; //選擇外部振蕩器作為系統(tǒng)時鐘
//源并允許丟失時鐘檢測器}IO口初始化
//配置數(shù)據(jù)交叉開關和通用IO口voidPORT_Init(void){XBR0=0x04; //使能UART0XBR1=0x00;XBR2=0x40;
//
使能數(shù)據(jù)交叉開關和弱上拉P0MDOUT|=0x01;//使能TX0,推挽輸出}UART0初始化
//配置UART0使用定時1為波特率發(fā)生器voidUART0_Init(void){SCON0=0x50; //SCON0:模式1,8位UART,允許RXTMOD=0x20; //TMOD:定時器1,模式2,8位重裝TH1=-(SYSCLK/BAUDRATE/16);//按波特率設置T1重裝值TR1=1; //啟動定時器1CKCON|=0x10; //定時器1使用系統(tǒng)時鐘為時基PCON|=0x80; //SMOD0=1TI0=1; //表示TX0就緒}ADC0初始化
//配置ADC0使用定時器3溢出作為轉(zhuǎn)換源,轉(zhuǎn)換結(jié)束產(chǎn)生中斷使用左對齊輸出模式//使能ADC轉(zhuǎn)換結(jié)束中斷禁止ADC//注意:使能低功率跟蹤模式保證當改變通道時的跟蹤次數(shù)最少voidADC0_Init(void){ADC0CN=0x45; //ADC0禁止;低功率跟蹤模式
//當T3溢出時ADC0轉(zhuǎn)換開始;ADC0數(shù)據(jù)左對齊REF0CN=0x07; //使能溫度傳感器片內(nèi)VREF和VREF輸出緩沖器AMX0SL=0x00; //選擇AIN0為ADC多路模擬輸出ADC0CF=(SYSCLK/2500000)<<3;//ADC轉(zhuǎn)換時鐘=2.5MHzADC0CF&=~0x07; //PGA增益=1EIE2|=0x02; //允許ADC中斷}定時器3初始化
//配置定時器3,自動重裝間隔由“counts”指定
,不產(chǎn)生中斷,使用系統(tǒng)時鐘為時基。voidTimer3_Init(intcounts){TMR3CN=0x02; //停止定時器3;清除
TF3;//使用系統(tǒng)時鐘為時基TMR3RL=-counts; //初始化重裝值TMR3=0xffff; //設置為立即重裝EIE2&=~0x01; //禁止定時器3中斷TMR3CN|=0x04; //起動定時器3}中斷服務程序//ADC0轉(zhuǎn)換結(jié)束中斷服務程序//得當ADC0采樣值并存儲在全局數(shù)組
<result>.//同時選擇下一個通道轉(zhuǎn)換voidADC0_ISR(void)interrupt15{staticunsignedcharchannel=0; //ADC多路模擬通道(0-8)AD0INT=0; //清除ADC轉(zhuǎn)換結(jié)束標志result[channel]=ADC0; //讀ADC值channel++; //改變通道if(channel==9){channel=0;}AMX0SL=channel; //設置多路模擬轉(zhuǎn)換器到下一個通道}5.2數(shù)/模轉(zhuǎn)換器
5.2.1D/A轉(zhuǎn)換原理及性能指標
1.轉(zhuǎn)換原理D/A轉(zhuǎn)換器的原理很簡單,可以總結(jié)為“按權(quán)展開,然后相加”幾個字。D/A轉(zhuǎn)換器內(nèi)部必須有一個解碼網(wǎng)絡,以實現(xiàn)按權(quán)值分別進行D/A轉(zhuǎn)換。解碼網(wǎng)絡通常有兩種:二進制加權(quán)電阻網(wǎng)絡T型電阻網(wǎng)絡T型電阻網(wǎng)絡D/A轉(zhuǎn)換原理框圖01RfIRfA-+VOUTDCBR2R2R2RVREFR2RI0I2I3I1IL0IL2IL3IL1b3
b2
b1
b0四位DAC寄存器OAS001S101S201S3IOUT1IOUT2運算放大器電子開關T型電阻網(wǎng)絡虛地點T型電阻網(wǎng)絡轉(zhuǎn)換原理由圖可得I0=IL0,根據(jù)基爾霍夫電流定律:IL1=IL0+I0,分析C點到A點的電阻及到地線的電阻可得
I1=IL1,則I0=1/2I1,同理可推得I1=1/2I2、I2=1/2I3,所以可得如下關系:T型電阻網(wǎng)絡轉(zhuǎn)換原理T型電阻網(wǎng)絡轉(zhuǎn)換原理事實上,S3~S0的狀態(tài)是受b3b2b1b0控制的,并不一定是全“1”,所以流入A點的電流應該是:選取Rf=R,并考慮A點為虛地,則有可以得到:對于n位T型電阻網(wǎng)絡T型電阻網(wǎng)絡D/A轉(zhuǎn)換原理框圖01RfIRfA-+VOUTDCBR2R2R2RVREFR2RI0I2I3I1IL0IL2IL3IL1b3
b2
b1
b0四位DAC寄存器OAS001S101S201S3IOUT1IOUT2性能指標(1)分辨率(resolution)指D/A轉(zhuǎn)換器能分辨的最小輸出模擬增量,為滿量程值的2-n倍。例如,滿量程為10V的8位D/A芯片的分辨率為10V×2-8=39mV;而16位的D/A是10V×2-16=153μV。(2)
轉(zhuǎn)換精度(conversionaccuracy)轉(zhuǎn)換精度是指滿量程時D/A的實際模擬輸出值和理論值的接近程度。例如,滿量程時理論輸出值為10V,實際輸出值是在9.99~10.01之間,則其轉(zhuǎn)換精度為±10mV。通常為LSB/2。LSB(LeastSignificantBit)是分辨率,指最低1位數(shù)字變化引起輸出電壓幅度的變化量。性能指標(3)偏移量誤差(offseterror)偏移量誤差是指輸入數(shù)字量為零時,輸出模擬量對零的偏移值。這種誤差通??梢酝ㄟ^D/A轉(zhuǎn)換器的外接VREF和電位器加以調(diào)整。(4)線性度(linearity)線性度是指D/A轉(zhuǎn)換器的實際轉(zhuǎn)換特性曲線和理想直線之間的最大偏差。通常線性度不應超出±1/2LSB。除此以外,指標還有轉(zhuǎn)換速度、溫度靈敏度等,通常這些參數(shù)都很小,一般不予考慮。
5.2.2C8051F020的DAC功能C8051F020有兩個片內(nèi)12位電壓方式數(shù)/模轉(zhuǎn)換器。每個DAC的輸出擺幅均為0~(VREF-1LSB)V,對應的輸入碼范圍是0x000到0xFFF??刂萍拇嫫鱀AC0CN和DAC1CN使能/禁止DAC0和DAC1。在被禁止時,DAC的輸出保持在高阻狀態(tài),DAC的供電電流降到1μA或更小。每個DAC的電壓基準由VREFD引腳提供。如果使用內(nèi)部電壓基準,為了使DAC輸出有效,該基準必須被使能。
DAC功能框圖
使能控制輸出更新方式數(shù)字量輸入控制DAC工作的主要是控制寄存器DAC0CN和DAC1CN??刂萍拇嫫鱎/WR/WR/WR/WR/WR/WR/WR/W復位值DAC0EN--DAC0MD1DAC0MD0DAC0DF2DAC0DF1DAC0DF000000000位7位6位5位4位3位2位1位0SFR地址:0xD4位7(DAC0EN):DAC0使能位控制寄存器位4-3(DAC0MD1~DAC0MD10):DAC0更新方式位。00:寫DAC0H時更新。01:定時器3溢出時更新。10:定時器4溢出時更新。11:定時器2溢出時更新。位2-0(DAC0DF2~DAC0DF20):DAC0數(shù)據(jù)格式位:000:DAC0數(shù)據(jù)字的高4位在DAC0H[3:0],低字節(jié)在DAC0L中。
其余類推??刂萍拇嫫鱀AC0HDAC0L
MSB
LSB001:DAC0數(shù)據(jù)字的高5位在DAC0H[4:0],低7位在DAC0L[7:1]。
DAC0HDAC0L
MSB
LSB
5.2.3DAC輸出更新每個DAC都具有靈活的輸出更新機制,允許全量程內(nèi)平滑變化并支持無抖動輸出更新,適合于波形發(fā)生器應用。1.根據(jù)軟件命令更新輸出在缺省方式下(DAC0CN.[4:3]=00),DAC0的輸出在寫DAC0H時更新。注意:寫DAC0L時數(shù)據(jù)被保持,對DAC0輸出沒有影響,直到對DAC0H的寫操作發(fā)生。
5.2.3DAC輸出更新2.基于定時器溢出的輸出更新當DAC0MD位(DAC0CN.[4:3])被設置為01、10或11時(分別為定時器3、定時器4或定時器2),對DAC數(shù)據(jù)寄存器的寫操作被保持,直到相應的定時器溢出事件發(fā)生時DAC0H:DAC0L的內(nèi)容才被復制到DAC輸入鎖存器,允許DAC數(shù)據(jù)改變?yōu)樾轮怠?.2.4.DAC輸出定標/調(diào)整
對DAC0進行寫入操作之前應對輸入數(shù)據(jù)移位,以正確調(diào)整DAC輸入寄存器中的數(shù)據(jù)。這種操作一般需要一個或多個裝入和移位指令,因而增加軟件開銷和降低DAC的數(shù)據(jù)通過率。數(shù)據(jù)格式化功能為用戶提供了一種能對數(shù)據(jù)寄存器DAC0H和DAC0L中的數(shù)據(jù)格式編程的手段。三個DAC0DF位(DAC0CN.[2:0])允許用戶在5種數(shù)據(jù)字格式指定一種,見DAC0CN寄存器定義。5.2.5數(shù)模轉(zhuǎn)換舉例
D/A轉(zhuǎn)換器的編程相對A/D轉(zhuǎn)換器要簡單。按照要求設置好輸出更新的條件,將要轉(zhuǎn)換的數(shù)值量送到DAC數(shù)據(jù)寄存器即可。下面是產(chǎn)生階梯波和鋸齒波的示例。將DAC0設置成輸出更新發(fā)生在寫DAC0H時,即軟件更新,產(chǎn)生階梯波。DAC1設置成輸出更新發(fā)生在定時器2溢出時,產(chǎn)生鋸齒波。
1、產(chǎn)生階梯波
//DAC0用軟件更新輸出,產(chǎn)生一個階梯波形。voidmain(void){ inti; config(); for(i=0;i<=4095;i+UP) //形成階梯波形
{ DAC0=i;//送數(shù)字量到DAC0直接更新輸出
d1ms(T); }}
TUP04095軟件延時函數(shù)voidd1ms(intcount)//延時count毫秒{ intj; while(count--!=0) { for(j=0;j<100;j++);//約1ms }}配置程序
voidconfig(void){intn=0;
WDTCN=0xDE; //禁止看門狗,刪除WDTCN=0x07;WDTCN=0xAD;
OSCXCN=0x67;
//外部振蕩器寄存器,采用11.0952MHz for(n=0;n<255;n++);//等待振蕩器啟動
while((OSCXCN&0x80)==0);//等待晶振穩(wěn)定,while(!(OSCXCN&0x80))OSCICN=0x88;//P73,使用外部時鐘4步,P260例程
REF0CN=0x03; //內(nèi)部偏壓發(fā)生器工作
DAC0CN=0x80; //允許DAC0,程序直接更新輸出,數(shù)據(jù)右對齊
DAC0L=0x00; //DAC1數(shù)據(jù)寄存器初值,或DAC0=0x00;
DAC0H=0x00; }voidmain(void){ config(); //配置
EA=1; //開中斷
while(1);}2、產(chǎn)生鋸齒波
中斷程序voidT2_ISR()interrupt5{ TF2=0; //清中斷標志
DAC1++;
//因為是T2溢出更新DAC1輸出,
if(DAC1>=0x1000) DAC1=0; //形成鋸齒波}配置程序voidconfig(void){
intn=0;
WDTCN=0xDE; //禁止看門狗
WDTCN=0xAD;
OSCXCN=0x67;
//外部振蕩器寄存器,采用11.0952MHz for(n=0;n<255;n++);
//等待振蕩器啟動
while((OSCXCN&0x80)==0);//等待晶振穩(wěn)定
OSCICN=0x88;
REF0CN=0x03;
//內(nèi)部偏壓發(fā)生器工作
DAC1CN=
0x98;//允許DAC1、T2溢出中斷更新,數(shù)據(jù)右對齊
DAC1=0x00; RCAP2H=0x05;
//重新裝入的時間常數(shù)
RCAP2L=0x00; TH2=0x05; TL2=0x00;//初始值
T2CON=0x04;
//T2方式0,啟動T2} 方波發(fā)生器:寫DAC0H時更新 $include(c8051f020.inc) org0000h ajmpmain org100hmain:movwdtcn,#0deh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年會計行業(yè)求職者面試考核要點參考集
- 2026年建筑工程師面試題及答案版
- 2026年工程造價師面試問題與答案速查
- 2026年物流行業(yè)面試題集物流師篇
- 2026年烘焙部經(jīng)理面試題集
- 經(jīng)編機操作工安全生產(chǎn)意識水平考核試卷含答案
- 2026年行政部人事專員考試題含答案
- 電光源裝配工崗前技術(shù)評優(yōu)考核試卷含答案
- 網(wǎng)約配送員操作管理水平考核試卷含答案
- 2026年會計從業(yè)資格證考試沖刺寶典含答案
- 日歷表2026年日歷 英文版 橫向排版 周一開始
- 2025版人教版高中物理精講精練必修1專題強化03:水平和傾斜傳送帶模型 原卷版
- 統(tǒng)編版四年級上冊語文期末專題復習課件2-6-文言文之超級訪問
- 湘少版英語-6年級上冊-單詞表(帶音標)
- 新概念英語第一冊隨堂練習-Lesson53~54 有答案
- 2020年智慧樹知道網(wǎng)課《非英語國家文化(山東聯(lián)盟)》課后章節(jié)測試滿分答案
- 壅水計算完整版本
- 07FJ02防空地下室建筑構(gòu)造
- 外研版(三起)(2024)三年級上冊英語Unit 2 My school things單元測試卷(含答案)
- 化工建設綜合項目審批作業(yè)流程圖
- 馬工程《經(jīng)濟法學》教學
評論
0/150
提交評論