版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章
模/數(shù)和數(shù)/模轉(zhuǎn)換器模擬量隨時(shí)間連續(xù)變化的量可以是電量,如模擬電壓、電流,也可以是非電量,如溫度、濕度、壓力、氣體濃度等數(shù)字量離散變化的量A/D轉(zhuǎn)換器(ADC:AnalogtoDigitalConverter)是一種能把模擬量轉(zhuǎn)換成相應(yīng)的數(shù)字量的電子器件。一般先用傳感器或變送器采集非電模擬量轉(zhuǎn)換成電模擬量D/A轉(zhuǎn)換器(DAC:DigitaltoAnalogConverter)則相反,它能把數(shù)字量轉(zhuǎn)換成相應(yīng)的模擬量。數(shù)據(jù)采集過程控制單片機(jī)實(shí)時(shí)閉環(huán)控制系統(tǒng)示意圖
多路開關(guān)A/D其它功能
D/A被控實(shí)體單片機(jī)傳感器傳感器模擬→數(shù)字?jǐn)?shù)字→模擬非電模擬量→電模擬量選擇一路5.1模/數(shù)轉(zhuǎn)換器5.2數(shù)/模轉(zhuǎn)換器
5.3電壓基準(zhǔn)
5.4比較器第5章
模/數(shù)和數(shù)/模轉(zhuǎn)換器5.1模/數(shù)轉(zhuǎn)換器5.1.1模數(shù)轉(zhuǎn)換原理和性能指標(biāo)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ù)字量的器件。模擬量可以是電壓、電流等電信號,也可以是聲、光、壓力、濕度、溫度等隨時(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)換原理即性能指標(biāo)1.轉(zhuǎn)換原理種類(按轉(zhuǎn)換原理分)計(jì)數(shù)式簡單、速度慢,很少使用并行式速度最快、結(jié)構(gòu)復(fù)雜、價(jià)格高,用于速度要求極高場合雙積分式抗干擾能力強(qiáng)、精度高、速度較慢,用于儀器儀表逐次逼近式
結(jié)構(gòu)簡單、速度較高,計(jì)算機(jī)測控中常用轉(zhuǎn)換原理—計(jì)數(shù)式時(shí)鐘復(fù)位數(shù)字輸出比較器模擬輸入計(jì)數(shù)器D/A轉(zhuǎn)換器轉(zhuǎn)換結(jié)束以最低位為增減量的逐步計(jì)數(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對應(yīng)的數(shù)字量。轉(zhuǎn)換原理—雙積分式
也稱二重積分式,其實(shí)質(zhì)是測量和比較兩個積分的時(shí)間。一個是對輸入模擬電壓積分的時(shí)間T0,此時(shí)間往往是固定的;另一個是以充電后的電壓Vi為初值,對參考電源Vref反向積分,積分電容被放電至零所需的時(shí)間Ti(Vref
與Vi符號相反)。模擬輸入電壓Vi與參考電壓Vref之比,等于上述兩個時(shí)間之比。由于Vref
、T0
固定,而放電時(shí)間Ti可以測出,因而可計(jì)算出模擬輸入電壓的大小。
雙積分式A/D轉(zhuǎn)換器工作原理圖Ti1tA控制邏輯B-+計(jì)數(shù)器時(shí)鐘Vi模擬輸入Vref標(biāo)準(zhǔn)電壓Vi2Vi1Ti2固定積分時(shí)間積分輸出開始斜率固定(b)積分原理(a)原理框圖T02.性能指標(biāo)(1)衡量A/D性能的主要參數(shù)是:(1)
分辨率(resolution)分辨率是指輸出的數(shù)字量變化一個相鄰的值所對應(yīng)的輸入模擬量的變化值;取決于輸出數(shù)字量的二進(jìn)制位數(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.性能指標(biāo)(2)(2)滿刻度誤差(fullscaleerror) 滿刻度誤差也稱增益誤差,即輸出全1時(shí)輸入電壓與理想輸入量之差。(3)轉(zhuǎn)換速率(conversionrate) 轉(zhuǎn)換速率是指完成一次A/D轉(zhuǎn)換所需時(shí)間的倒數(shù),A/D轉(zhuǎn)換器型號不同,轉(zhuǎn)換速度差別很大。(4)轉(zhuǎn)換精度(conversionaccuracy) 轉(zhuǎn)換精度由模擬誤差和數(shù)字誤差組成。模擬誤差屬于非固定誤差,由器件質(zhì)量決定,數(shù)字誤差和A/D輸出數(shù)字量的位數(shù)有關(guān),位數(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進(jìn)行選擇和配置??梢詫MUX輸入對編程為差分或單端方式。5.1.3模擬多路選擇器和PGA(2)配置寄存器AMX0CF的格式如下:
R/WR/WR/WR/WR/WR/WR/WR/W復(fù)位值----AIN67ICAIN45ICAIN23ICAIN01IC00000000位7位6位5位4位3位2位1位0SFR地址:0xBA位3:AIN67IC:AIN6、AIN7輸入對配置位
0:AIN6和AIN7為獨(dú)立的單端輸入
1:AIN6,AIN7為+,-差分輸入對注:差分通道輸出的數(shù)據(jù)格式是2的補(bǔ)碼5.1.3模擬多路選擇器和PGA(3)通道選擇寄存器AMX0SL的格式如下:
R/WR/WR/WR/WR/WR/WR/WR/W復(fù)位值----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,復(fù)位后的默認(rèn)增益為1。注意,PGA0的增益對溫度傳感器也起作用。P244ADC0CF格式5.1.4ADC的工作方式
(1)1.轉(zhuǎn)換過程由控制寄存器ADC0CN來設(shè)置和控制,其格式如下:R/WR/WR/WR/WR/WR/WR/WR/W復(fù)位值A(chǔ)D0ENAD0TMAD0INTAD0BUSYAD0CM1AD0CM0AD0WINTAD0LJST00000000位7使能位
位6跟蹤方式位5轉(zhuǎn)換結(jié)束中斷位4忙標(biāo)志
位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時(shí)啟動01:定時(shí)器3溢出時(shí)啟動10:CNVSTR上升沿啟動11:定時(shí)器2溢出時(shí)啟動AD0BUSY位在轉(zhuǎn)換期間為1,轉(zhuǎn)換結(jié)束后復(fù)0,并置中斷標(biāo)志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)換之前都必須有一段最小的跟蹤時(shí)間,以保證得到精確的轉(zhuǎn)換結(jié)果ADC0CN中的AD0TM位控制ADC0的跟蹤保持方式。在缺省狀態(tài),除了轉(zhuǎn)換期間ADC0輸入被連續(xù)跟蹤。當(dāng)AD0TM=1,ADC0工作在低功耗跟蹤保持方式。每次轉(zhuǎn)換之前都有3個SAR時(shí)鐘的跟蹤周期(在啟動轉(zhuǎn)換信號有效之后)。當(dāng)CNVSTR信號用于在低功耗跟蹤保持方式啟動轉(zhuǎn)換時(shí),ADC0只在CNVSTR為低電平時(shí)跟蹤;在CNVSTR的上升沿開始轉(zhuǎn)換。當(dāng)整個芯片處于低功耗待機(jī)或休眠方式時(shí),跟蹤可以被禁止(關(guān)斷)。12位ADC跟蹤和轉(zhuǎn)換時(shí)序
CNVSTR低電平跟蹤,上升沿開始轉(zhuǎn)換只跟蹤3個周期轉(zhuǎn)換結(jié)束進(jìn)入低功耗狀態(tài)除轉(zhuǎn)換外一直跟蹤3.建立時(shí)間要求當(dāng)ADC0輸入配置發(fā)生改變時(shí)(AMUX或PGA的選擇發(fā)生變化),在進(jìn)行一次精確的轉(zhuǎn)換之前需要有一個最小的跟蹤時(shí)間,稱建立時(shí)間。對于一個給定的建立精度(SA),所需要的ADC0建立時(shí)間可以用方程估算:
ADC0建立時(shí)間
:SA是建立精度,用一個LSB的分?jǐn)?shù)表示(例如,建立精度0.25對應(yīng)1/4LSB);t為所需要的建立時(shí)間,以秒為單位;RTOTAL為ADC0模擬多路器電阻與外部信號源電阻之和;n為ADC0的分辨率,用比特表示。
ADC0等效輸入電路
4.轉(zhuǎn)換結(jié)果格式12位轉(zhuǎn)換結(jié)果存放在ADC0H、ADC0L中。AD0LJST=0:數(shù)據(jù)右對齊,ADC0H的位7-4為位3的符號擴(kuò)展位、位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。符號擴(kuò)展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ù)(右對齊,高四位為補(bǔ)碼符號擴(kuò)展)高4位為符號擴(kuò)展低4位為05.1.5ADC0可編程窗口檢測器
ADC0可編程窗口檢測器提供一個中斷,當(dāng)ADC0轉(zhuǎn)換值在下限(大于)寄存器ADC0GTH:ADC0GTL和上限(小于)寄存器ADC0LTH:ADC0LTL范圍之內(nèi),并且中斷開啟時(shí),引發(fā)相應(yīng)中斷。下限值<上限值時(shí),檢測值位于極限值內(nèi)時(shí)有效,可引起中斷。下限值>上限值時(shí),檢測值位于極限值以外時(shí)有效,可引起中斷。默認(rèn)下限值為0xffff,上限值為0x0000,全范圍不引發(fā)中斷。ADC0右對齊的單端數(shù)據(jù)窗口中斷示例
數(shù)據(jù)在此范圍中斷ADC0右對齊的差分?jǐn)?shù)據(jù)窗口中斷示例數(shù)據(jù)在此范圍中斷ADC0左對齊的單端數(shù)據(jù)窗口中斷示例數(shù)據(jù)在此范圍中斷ADC0左對齊的差分?jǐn)?shù)據(jù)窗口中斷示例數(shù)據(jù)在此范圍中斷5.1.6ADC1(8位ADC)
C8051F020還有一個ADC1子系統(tǒng),包括一個8通道(無內(nèi)置的溫度通道)的可配置模擬多路開關(guān)(AMUX1),一個可編程增益放大器(PGA1)和一個500ksps、8位分辨率的逐次逼近型ADC,該ADC中集成了跟蹤保持電路。
與ADC1工作有關(guān)的SFR有ADC1配置寄存器ADC1CF、AMUX配置寄存器AMX1SL、ADC1控制寄存器ADC1CN、ADC1數(shù)據(jù)寄存器ADC1。
與ADC0區(qū)別:無窗口比較功能,無差分方式,只有4種增益倍數(shù),啟動方式增加到5種。ADC1原理框圖
選擇通道
放大倍數(shù)
轉(zhuǎn)換時(shí)鐘頻率
3.跟蹤方式
ADC1CN中的AD1TM位控制ADC1的跟蹤保持方式。工作原理與過程同ADC0類似。ADC1跟蹤和轉(zhuǎn)換時(shí)序舉例
內(nèi)容回顧A/D轉(zhuǎn)換器把模擬量轉(zhuǎn)換成相應(yīng)數(shù)字量的電子器件。數(shù)據(jù)采集按原理分類并行式、計(jì)數(shù)式、逐次逼近式、雙積分式分辨率:滿量程電壓/2nD/A轉(zhuǎn)換器把數(shù)字量轉(zhuǎn)換成相應(yīng)模擬量的電子器件。自動控制單片機(jī)實(shí)時(shí)閉環(huán)控制系統(tǒng)示意圖
多路開關(guān)A/D其它功能
D/A被控實(shí)體單片機(jī)傳感器傳感器數(shù)據(jù)采集自動控制內(nèi)容回顧通道配置與選擇差分、單端AMX0CF、AMX0SL增益放大與轉(zhuǎn)換時(shí)鐘控制0.5、1、2、4、8、16ADC0CF啟動方式向AD0BUSY位寫1T3溢出T2溢出外部信號啟動(CNVSTR上升沿)跟蹤方式每次ADC轉(zhuǎn)換之前必須有一段最小的跟蹤時(shí)間,以保證得到精確的轉(zhuǎn)換結(jié)果連續(xù)跟蹤(默認(rèn))低功耗跟蹤(轉(zhuǎn)換啟動后跟蹤3個SAR時(shí)鐘周期或CNVSTR為低時(shí)跟蹤)數(shù)據(jù)對齊方式左對齊、右對齊內(nèi)容回顧—ADC0組成內(nèi)容回顧可編程窗口檢測器下限值<上限值時(shí),檢測值位于極限值內(nèi)時(shí)有效,可引起中斷。下限值>上限值時(shí),檢測值位于極限值以外時(shí)有效,可引起中斷。軟件啟動轉(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ù)學(xué)運(yùn)算可以轉(zhuǎn)換成度數(shù)表示的溫度。溫度轉(zhuǎn)換器的典型應(yīng)用有系統(tǒng)環(huán)境檢測、系統(tǒng)過熱測試和在基于熱電偶的應(yīng)用中測量冷端溫度。本例使用左對齊,這樣可使代碼的權(quán)值與ADC的位數(shù)(12或10)無關(guān)。ADC轉(zhuǎn)換步驟
(1)通過將TEMPE(REF0CN.2,P276)設(shè)置為1來允許溫度傳感器工作。模擬偏置發(fā)生器和內(nèi)部電壓基準(zhǔn)的允許位REF0CN.1和REF0CN.0也要置1。即:movREF0CN,#07h;允許溫度傳感器、模擬偏置發(fā)生器和電壓基準(zhǔn)(2)選擇溫度傳感器作為ADC的輸入。這可以通過寫AMX0SL來完成,例如:movAMX0SL,#0fh;選擇溫度傳感器作ADC輸入,1×××(3)設(shè)置位于ADC0CF中的ADC0SAR時(shí)鐘分頻系數(shù),特別是ADC轉(zhuǎn)換時(shí)鐘的周期至少應(yīng)為500ns。ADC轉(zhuǎn)換步驟(4)選擇ADC的增益。如果使用內(nèi)部電壓基準(zhǔn),則該值大約為2.4V。溫度傳感器所能產(chǎn)生的最大電壓值稍大于1V。因此,可以安全地將ADC的增益設(shè)置為2,以提高溫度分辨率。設(shè)置ADC增益的配置位在ADC0CF中。所以,有
movADC0CF,#61h;設(shè)置ADC的時(shí)鐘為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——電壓基準(zhǔn)的電壓值。假設(shè)Gain=2和VREF=2.43V,得到輸出溫度值為式
其中
Temp——溫度的攝氏度數(shù)值。
實(shí)際的環(huán)境溫度測量溫度傳感器測量的是器件的內(nèi)部溫度。如果希望測量環(huán)境溫度,則必須考慮器件的自熱效應(yīng)。由于器件功率消耗的原因,測量值很可能比環(huán)境溫度值高幾度。
一種方法是在器件上電之后立即啟動一次轉(zhuǎn)換,得到一個“冷”溫度值;然后大約經(jīng)過1min之后再測量一次,得到一個“熱”溫度值。這兩個測量值的差就是因自熱而產(chǎn)生的溫度增加值。
另一種方法是讓器件從一個低的SYSCLK頻率開始工作,例如32kHz,進(jìn)行一次溫度測量,然后再讓器件工作在較高頻率,例如16MHz的內(nèi)部振蕩器,取兩者之差。在時(shí)鐘頻率更低時(shí)自熱值是可忽略的,因?yàn)榇藭r(shí)器件的功耗很低。
(1)查詢法程序ADC0配置為寫AD0BUSY作為轉(zhuǎn)換的開始信號;溫度傳感器的輸出轉(zhuǎn)換成攝氏溫度由UART0傳輸出去;通過PC機(jī)超級終端(或其他串口調(diào)試程序)來觀察溫度采樣值。假設(shè)在XTAL1和XTAL2之間連接22.1184MHz晶振系統(tǒng)時(shí)鐘頻率存儲在全局常量SYSCLK中,目標(biāo)器件UART波特率存儲在全局常量BAUDRATE中
主程序voidmain(void){longtemperature; //溫度inttemp_int,temp_frac; //溫度的整數(shù)和小數(shù)部分WDTCN=0xde; //禁止看門狗定時(shí)器WDTCN=0xad;SYSCLK_Init(); //初始化振蕩器PORT_Init(); //初始化數(shù)據(jù)交叉開關(guān)和通用IO口UART0_Init(); //初始化UART0ADC0_Init(); //初始化和使能ADCwhile(1){AD0INT=0;
//清除轉(zhuǎn)換結(jié)束標(biāo)記,見P246步驟AD0BUSY=1;
//啟動轉(zhuǎn)換while(AD0INT==0); //等待轉(zhuǎn)換結(jié)束temperature=ADC0; //讀ADC0數(shù)據(jù)temperature=temperature-41857;
//減去偏移量,對應(yīng)0℃的值。temperature=(temperature*100L)/154; //計(jì)算出對應(yīng)的溫度值temp_int=temperature/100; //得到溫度值的整數(shù)部分temp_frac=temperature-(temp_int*100); //得到溫度值的小數(shù)部分printf(“Temperatureis%+02d.%02d\n”,temp_int,temp_frac);//串口輸出}}問題:temperature為什么要定義成long類型?C51用其實(shí)現(xiàn)UART通信系統(tǒng)時(shí)鐘初始化//此程序初始化系統(tǒng)時(shí)鐘使用外部22.1184MHz晶體作為時(shí)鐘源voidSYSCLK_Init(void){inti; //延時(shí)計(jì)數(shù)器OSCXCN=0x67; //啟動外部振蕩器22.1184MHz晶體for(i=0;i<256;i++);//等待振蕩器啟動
(>1ms)while(!(OSCXCN&0x80)); //等待晶體振蕩器穩(wěn)定OSCICN=0x88;//選擇外部振蕩器為系統(tǒng)時(shí)鐘源并使能時(shí)鐘丟失檢測器}
詳見P75建議過程IO口初始化
//配置數(shù)據(jù)交叉開關(guān)和通用I/O口voidPORT_Init(void){XBR0=0x04; //使能UART0XBR1=0x00;//可去掉XBR2=0x40; //使能數(shù)據(jù)交叉開關(guān)和弱上拉P0MDOUT|=0x01; //使能TX0,推挽輸出}同P179串口交叉開關(guān)配置UART0初始化//配置UART0使用定時(shí)器1產(chǎn)生波特率voidUART0_Init(void){SCON0=0x50; //SCON0:模式1,8位UART,允許RXTMOD=0x20; //TMOD:1定時(shí)器,
模式2,
8位重裝TH1=-(SYSCLK/BAUDRATE/16);//T1重裝值,P193公式TR1=1; //啟動定時(shí)器1CKCON|=0x10; //定時(shí)器1使用系統(tǒng)時(shí)鐘為時(shí)基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時(shí)啟動轉(zhuǎn)換;
//數(shù)據(jù)左對齊REF0CN=0x07; //使能溫度傳感器片內(nèi)VREF和VREF輸出緩沖器AMX0SL=0x0f; //選擇溫度傳感器作為ADC多路模擬轉(zhuǎn)換器輸出ADC0CF=(SYSCLK/2500000-1)<<3;//ADC轉(zhuǎn)換時(shí)鐘=2.5MHzADC0CF|=0x01; //PGA增益=2EIE2&=~0x02;
//禁止ADC0EOC中斷EIE1&=~0x04;
//禁止ADC0窗口比較器中斷}P244(2)中斷方式程序
在中斷模式使用T3溢出作為啟動轉(zhuǎn)換信號,
測量片內(nèi)溫度傳感器輸出。ADC0結(jié)果經(jīng)簡單的均值濾波處理,均值濾波計(jì)數(shù)值由常量INT_DEC給出。ADC結(jié)果經(jīng)計(jì)算得出溫度從UART0傳輸。假設(shè)在XTAL1和XTAL2之連接22.1184MHz晶體。系統(tǒng)時(shí)鐘頻率存儲在全局常量SYSCLK目標(biāo)UART波特率存儲在全局常量BAUDRATE。
ADC0采樣率存儲在全局常量SAMPLERATE0。
主程序Timer3_Init(SYSCLK/SAMPLERATE0);//初始化定時(shí)器3溢出為采樣速率ADC0_Init(); //初始化ADCAD0EN=1; //使能ADC,也可以放在初始化里使能EA=1; //使能所有中斷while(1){EA=0; //禁止中斷temperature=result;EA=1; //重新使能中斷temperature=temperature-41857;//計(jì)算溫度(百分之一精度)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使用定時(shí)器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)換時(shí)鐘=2.5MHzADC0CF|=0x01;//PGA增益=2EIE2|=0x02; //允許ADC中斷}定時(shí)器3初始化//配置定時(shí)器3,自動重裝間隔由“counts”指定,
不產(chǎn)生//中斷,使用系統(tǒng)時(shí)鐘為時(shí)基.voidTimer3_Init(intcounts){TMR3CN=0x02; //停止定時(shí)器3;清除
TF3;//使用系統(tǒng)時(shí)鐘為時(shí)基TMR3RL=-counts; //初始化重裝值TMR3=0xffff; //設(shè)置為立即重裝EIE2&=~0x01; //禁止定時(shí)器3中斷TMR3CN|=0x04; //起動定時(shí)器3}中斷服務(wù)程序//得到ADC0采樣值,將它加到運(yùn)行總數(shù)accumulator中,//當(dāng)int_dec為0時(shí),在全局變量result放置數(shù)字濾波后的結(jié)果voidADC0_ISR(void)interrupt15{staticunsignedint_dec=INT_DEC;//數(shù)字濾波計(jì)數(shù)器,
//int_dec=0時(shí)重設(shè)新值staticlongaccumulator=0L;AD0INT=0; //清除ADC轉(zhuǎn)換結(jié)束標(biāo)志accumulator+=ADC0; //讀ADC值并加到運(yùn)行總數(shù)中int_dec--; //更新數(shù)字濾波計(jì)數(shù)器if(int_dec==0){ //如果為0,計(jì)算結(jié)果
int_dec=INT_DEC;
//重設(shè)計(jì)數(shù)器
result=accumulator>>8;
//除以256,求平均值(數(shù)字濾波)
accumulator=0L;
//復(fù)位accumulator}}2.多通道數(shù)據(jù)采集
ADC0工作在中斷模式,使用定時(shí)器3溢出作為開始轉(zhuǎn)換信號測量AIN0~AIN7的電壓和溫度傳感器轉(zhuǎn)換結(jié)果經(jīng)過計(jì)算所得電壓從UART0傳輸假設(shè)在XTAL1和XTAL2之間接22.1184MHz晶振系統(tǒng)時(shí)鐘頻率存儲在全局常量SYSCLK目標(biāo)UART波特率存儲在全局常量BAUDRATEADC0采樣頻率存儲在全局常量SAMPLERATE0電壓參考值存儲在VREF0
主程序voidmain(void){longvoltage; //電壓以mV為單位inti; //循環(huán)計(jì)數(shù)器WDTCN=0xde; //禁止看門狗定時(shí)器WDTCN=0xad;SYSCLK_Init(); //初始化振蕩器PORT_Init(); //初始化數(shù)據(jù)交叉開關(guān)和通用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; //重新使能中斷//計(jì)算電壓(mV)voltage=voltage*VREF0;voltage=voltage>>4;//右移4位,得到實(shí)際大小printf(“Channel‘%d’voltageis%ldmV\n”,i,voltage);}}}系統(tǒng)時(shí)鐘初始化
//此程序初始化系統(tǒng)時(shí)鐘使用22.1184MHz晶體作為系統(tǒng)時(shí)鐘voidSYSCLK_Init(void){inti; //延時(shí)計(jì)數(shù)器OSCXCN=0x67; //起動外部振蕩器22.1184MHz晶體for(i=0;i<256;i++); //等待振蕩器啟動(>1ms)while(!(OSCXCN&0x80));//等待晶體振蕩器穩(wěn)定OSCICN=0x88; //選擇外部振蕩器作為系統(tǒng)時(shí)鐘
//源并允許丟失時(shí)鐘檢測器}IO口初始化
//配置數(shù)據(jù)交叉開關(guān)和通用IO口voidPORT_Init(void){XBR0=0x04; //使能UART0XBR1=0x00;XBR2=0x40;
//
使能數(shù)據(jù)交叉開關(guān)和弱上拉P0MDOUT|=0x01;//使能TX0,推挽輸出}UART0初始化
//配置UART0使用定時(shí)1為波特率發(fā)生器voidUART0_Init(void){SCON0=0x50; //SCON0:模式1,8位UART,允許RXTMOD=0x20; //TMOD:定時(shí)器1,模式2,8位重裝TH1=-(SYSCLK/BAUDRATE/16);//按波特率設(shè)置T1重裝值TR1=1; //啟動定時(shí)器1CKCON|=0x10; //定時(shí)器1使用系統(tǒng)時(shí)鐘為時(shí)基PCON|=0x80; //SMOD0=1TI0=1; //表示TX0就緒}ADC0初始化
//配置ADC0使用定時(shí)器3溢出作為轉(zhuǎn)換源,轉(zhuǎn)換結(jié)束產(chǎn)生中斷使用左對齊輸出模式//使能ADC轉(zhuǎn)換結(jié)束中斷禁止ADC//注意:使能低功率跟蹤模式保證當(dāng)改變通道時(shí)的跟蹤次數(shù)最少voidADC0_Init(void){ADC0CN=0x45; //ADC0禁止;低功率跟蹤模式
//當(dāng)T3溢出時(shí)ADC0轉(zhuǎn)換開始;ADC0數(shù)據(jù)左對齊REF0CN=0x07; //使能溫度傳感器片內(nèi)VREF和VREF輸出緩沖器AMX0SL=0x00; //選擇AIN0為ADC多路模擬輸出ADC0CF=(SYSCLK/2500000)<<3;//ADC轉(zhuǎn)換時(shí)鐘=2.5MHzADC0CF&=~0x07; //PGA增益=1EIE2|=0x02; //允許ADC中斷}定時(shí)器3初始化
//配置定時(shí)器3,自動重裝間隔由“counts”指定
,不產(chǎn)生中斷,使用系統(tǒng)時(shí)鐘為時(shí)基。voidTimer3_Init(intcounts){TMR3CN=0x02; //停止定時(shí)器3;清除
TF3;//使用系統(tǒng)時(shí)鐘為時(shí)基TMR3RL=-counts; //初始化重裝值TMR3=0xffff; //設(shè)置為立即重裝EIE2&=~0x01; //禁止定時(shí)器3中斷TMR3CN|=0x04; //起動定時(shí)器3}中斷服務(wù)程序//ADC0轉(zhuǎn)換結(jié)束中斷服務(wù)程序//得當(dāng)ADC0采樣值并存儲在全局?jǐn)?shù)組
<result>.//同時(shí)選擇下一個通道轉(zhuǎn)換voidADC0_ISR(void)interrupt15{staticunsignedcharchannel=0; //ADC多路模擬通道(0-8)AD0INT=0; //清除ADC轉(zhuǎn)換結(jié)束標(biāo)志result[channel]=ADC0; //讀ADC值channel++; //改變通道if(channel==9){channel=0;}AMX0SL=channel; //設(shè)置多路模擬轉(zhuǎn)換器到下一個通道}5.2數(shù)/模轉(zhuǎn)換器
5.2.1D/A轉(zhuǎn)換原理及性能指標(biāo)
1.轉(zhuǎn)換原理D/A轉(zhuǎn)換器的原理很簡單,可以總結(jié)為“按權(quán)展開,然后相加”幾個字。D/A轉(zhuǎn)換器內(nèi)部必須有一個解碼網(wǎng)絡(luò),以實(shí)現(xiàn)按權(quán)值分別進(jìn)行D/A轉(zhuǎn)換。解碼網(wǎng)絡(luò)通常有兩種:二進(jìn)制加權(quán)電阻網(wǎng)絡(luò)T型電阻網(wǎng)絡(luò)T型電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換原理框圖01RfIRfA-+VOUTDCBR2R2R2RVREFR2RI0I2I3I1IL0IL2IL3IL1b3
b2
b1
b0四位DAC寄存器OAS001S101S201S3IOUT1IOUT2運(yùn)算放大器電子開關(guān)T型電阻網(wǎng)絡(luò)虛地點(diǎn)T型電阻網(wǎng)絡(luò)轉(zhuǎn)換原理由圖可得I0=IL0,根據(jù)基爾霍夫電流定律:IL1=IL0+I(xiàn)0,分析C點(diǎn)到A點(diǎn)的電阻及到地線的電阻可得
I1=IL1,則I0=1/2I1,同理可推得I1=1/2I2、I2=1/2I3,所以可得如下關(guān)系:T型電阻網(wǎng)絡(luò)轉(zhuǎn)換原理T型電阻網(wǎng)絡(luò)轉(zhuǎn)換原理事實(shí)上,S3~S0的狀態(tài)是受b3b2b1b0控制的,并不一定是全“1”,所以流入A點(diǎn)的電流應(yīng)該是:選取Rf=R,并考慮A點(diǎn)為虛地,則有可以得到:對于n位T型電阻網(wǎng)絡(luò)T型電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換原理框圖01RfIRfA-+VOUTDCBR2R2R2RVREFR2RI0I2I3I1IL0IL2IL3IL1b3
b2
b1
b0四位DAC寄存器OAS001S101S201S3IOUT1IOUT2性能指標(biāo)(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)換精度是指滿量程時(shí)D/A的實(shí)際模擬輸出值和理論值的接近程度。例如,滿量程時(shí)理論輸出值為10V,實(shí)際輸出值是在9.99~10.01之間,則其轉(zhuǎn)換精度為±10mV。通常為LSB/2。LSB(LeastSignificantBit)是分辨率,指最低1位數(shù)字變化引起輸出電壓幅度的變化量。性能指標(biāo)(3)偏移量誤差(offseterror)偏移量誤差是指輸入數(shù)字量為零時(shí),輸出模擬量對零的偏移值。這種誤差通??梢酝ㄟ^D/A轉(zhuǎn)換器的外接VREF和電位器加以調(diào)整。(4)線性度(linearity)線性度是指D/A轉(zhuǎn)換器的實(shí)際轉(zhuǎn)換特性曲線和理想直線之間的最大偏差。通常線性度不應(yīng)超出±1/2LSB。除此以外,指標(biāo)還有轉(zhuǎn)換速度、溫度靈敏度等,通常這些參數(shù)都很小,一般不予考慮。
5.2.2C8051F020的DAC功能C8051F020有兩個片內(nèi)12位電壓方式數(shù)/模轉(zhuǎn)換器。每個DAC的輸出擺幅均為0~(VREF-1LSB)V,對應(yīng)的輸入碼范圍是0x000到0xFFF??刂萍拇嫫鱀AC0CN和DAC1CN使能/禁止DAC0和DAC1。在被禁止時(shí),DAC的輸出保持在高阻狀態(tài),DAC的供電電流降到1μA或更小。每個DAC的電壓基準(zhǔn)由VREFD引腳提供。如果使用內(nèi)部電壓基準(zhǔn),為了使DAC輸出有效,該基準(zhǔn)必須被使能。
DAC功能框圖
使能控制輸出更新方式數(shù)字量輸入控制DAC工作的主要是控制寄存器DAC0CN和DAC1CN??刂萍拇嫫鱎/WR/WR/WR/WR/WR/WR/WR/W復(fù)位值DAC0EN--DAC0MD1DAC0MD0DAC0DF2DAC0DF1DAC0DF000000000位7位6位5位4位3位2位1位0SFR地址:0xD4位7(DAC0EN):DAC0使能位控制寄存器位4-3(DAC0MD1~DAC0MD10):DAC0更新方式位。00:寫DAC0H時(shí)更新。01:定時(shí)器3溢出時(shí)更新。10:定時(shí)器4溢出時(shí)更新。11:定時(shí)器2溢出時(shí)更新。位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都具有靈活的輸出更新機(jī)制,允許全量程內(nèi)平滑變化并支持無抖動輸出更新,適合于波形發(fā)生器應(yīng)用。1.根據(jù)軟件命令更新輸出在缺省方式下(DAC0CN.[4:3]=00),DAC0的輸出在寫DAC0H時(shí)更新。注意:寫DAC0L時(shí)數(shù)據(jù)被保持,對DAC0輸出沒有影響,直到對DAC0H的寫操作發(fā)生。
5.2.3DAC輸出更新2.基于定時(shí)器溢出的輸出更新當(dāng)DAC0MD位(DAC0CN.[4:3])被設(shè)置為01、10或11時(shí)(分別為定時(shí)器3、定時(shí)器4或定時(shí)器2),對DAC數(shù)據(jù)寄存器的寫操作被保持,直到相應(yīng)的定時(shí)器溢出事件發(fā)生時(shí)DAC0H:DAC0L的內(nèi)容才被復(fù)制到DAC輸入鎖存器,允許DAC數(shù)據(jù)改變?yōu)樾轮怠?.2.4.DAC輸出定標(biāo)/調(diào)整
對DAC0進(jìn)行寫入操作之前應(yīng)對輸入數(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)換器要簡單。按照要求設(shè)置好輸出更新的條件,將要轉(zhuǎn)換的數(shù)值量送到DAC數(shù)據(jù)寄存器即可。下面是產(chǎn)生階梯波和鋸齒波的示例。將DAC0設(shè)置成輸出更新發(fā)生在寫DAC0H時(shí),即軟件更新,產(chǎn)生階梯波。DAC1設(shè)置成輸出更新發(fā)生在定時(shí)器2溢出時(shí),產(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í)函數(shù)voidd1ms(intcount)//延時(shí)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,使用外部時(shí)鐘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; //清中斷標(biāo)志
DAC1++;
//因?yàn)槭荰2溢出更新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í)間常數(shù)
RCAP2L=0x00; TH2=0x05; TL2=0x00;//初始值
T2CON=0x04;
//T2方式0,啟動T2} 方波發(fā)生器:寫DAC0H時(shí)更新 $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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版工業(yè)地皮購置與交易全程稅務(wù)籌劃合同3篇
- 二零二五年教育培訓(xùn)機(jī)構(gòu)兼職教師雇傭協(xié)議書3篇
- 蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學(xué)院《電液控制工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五版生態(tài)環(huán)保型建筑材料銷售合同3篇
- 二零二五年度定制化餐盒包裝解決方案合同3篇
- 2025年度高新技術(shù)企業(yè)研發(fā)項(xiàng)目財(cái)務(wù)擔(dān)保合同會計(jì)處理細(xì)則3篇
- 2024版茶樓活動策劃合同2篇
- 二零二五年服裝店導(dǎo)購員培訓(xùn)與激勵合同范本3篇
- 山西鐵道職業(yè)技術(shù)學(xué)院《矯正社會工作》2023-2024學(xué)年第一學(xué)期期末試卷
- 廈門海洋職業(yè)技術(shù)學(xué)院《創(chuàng)意表現(xiàn)圖案》2023-2024學(xué)年第一學(xué)期期末試卷
- 公路工程施工現(xiàn)場安全檢查手冊
- 公司組織架構(gòu)圖(可編輯模版)
- 1汽輪機(jī)跳閘事故演練
- 陜西省銅川市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)
- 禮品(禮金)上交登記臺賬
- 北師大版七年級數(shù)學(xué)上冊教案(全冊完整版)教學(xué)設(shè)計(jì)含教學(xué)反思
- 2023高中物理步步高大一輪 第五章 第1講 萬有引力定律及應(yīng)用
- 青少年軟件編程(Scratch)練習(xí)題及答案
- 浙江省公務(wù)員考試面試真題答案及解析精選
- 系統(tǒng)性紅斑狼瘡-第九版內(nèi)科學(xué)
- 全統(tǒng)定額工程量計(jì)算規(guī)則1994
評論
0/150
提交評論