0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

噪聲和圖像信號A/D 轉(zhuǎn)換器深入解讀

AGk5_ZLG_zhiyua ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-11-20 08:54 ? 次閱讀

周立功教授新書《面向AMetal框架與接口編程(上)》,對AMetal框架進行了詳細介紹,通過閱讀這本書,你可以學(xué)到高度復(fù)用的軟件設(shè)計原則和面向接口編程的開發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實現(xiàn)企業(yè)和個人的共同進步。

第五章為深入淺出AMetal,本文內(nèi)容為5.7 A/D 轉(zhuǎn)換器。

5.7 A/D 轉(zhuǎn)換器

>>> 5.7.1 模數(shù)信號轉(zhuǎn)換

1. 基本原理

我們經(jīng)常接觸的噪聲和圖像信號都是模擬信號,要將模擬信號轉(zhuǎn)換為數(shù)字信號,必須經(jīng)過采樣、保持、量化與編碼幾個過程,詳見圖5.4。

圖5.4 模數(shù)信號轉(zhuǎn)換示意圖

將以一定的時間間隔提取信號的大小的操作稱為采樣,其值為樣本值,提取信號大小的時間間隔越短越能正確地重現(xiàn)信號。由于縮短時間間隔會導(dǎo)致數(shù)據(jù)量增加,所以縮短時間間隔要適可而止。注意,取樣頻率大于或等于模擬信號中最高頻率的2 倍,就能夠無失真地恢復(fù)原信號。

將采樣所得信號轉(zhuǎn)換為數(shù)字信號往往需要一定的時間,為了給后續(xù)的量化編碼電路提供一個穩(wěn)定值,采樣電路的輸出還必須保持一段時間,而采樣與保持過程都是同時完成的。雖然通過采樣將在時間軸上連續(xù)的信號轉(zhuǎn)換成了不連續(xù)的(離散的)信號,但采樣后的信號幅度仍然是連續(xù)的值(模擬量)。此時可以在振幅方向上以某一定的間隔進行劃分,決定個樣本值屬于哪一區(qū)間,將記在其區(qū)間的值分配給其樣本值。圖5.4 將區(qū)間分割為0~0.5、0.5~1.5、1.5~2.5,再用0、1、2……代表各區(qū)間,對小數(shù)點后面的值按照四舍五入處理,比如,201.6 屬于201.5~202.5,則賦值202;123.4 屬于122.5~123.5,則賦值123,這樣的操作稱為量化。

量化前的信號幅度與量化后的信號幅度出現(xiàn)了不同,這一差值在重現(xiàn)信號時將會以噪聲的形式表現(xiàn)出來,所以將此差值稱為量化噪聲。為了降低這種噪聲,只要將量化時階梯間的間隔減小就可以了。但減小量化間隔會引起階梯數(shù)目的增加,導(dǎo)致數(shù)據(jù)量增大。所以量化的階梯數(shù)也必須適當(dāng),可以根據(jù)所需的信噪比(S/N)確定。

將量化后的信號轉(zhuǎn)換為二進制數(shù),即用0 和1 的碼組合來表示的處理過程稱為編碼,“1”表示有脈沖,“0”表示無脈沖。當(dāng)量化級數(shù)取為64 級時,表示這些數(shù)值的二進制的位數(shù)必須是6 位;當(dāng)量化級數(shù)取為256 級時,則必須用8 位二進制數(shù)表示。

2. 基準(zhǔn)電壓

基準(zhǔn)電壓就是模數(shù)轉(zhuǎn)換器可以轉(zhuǎn)換的最大電壓,以8 位A/D 模數(shù)轉(zhuǎn)換器為例,這種轉(zhuǎn)換器可以將0V 到其基準(zhǔn)電壓范圍內(nèi)的輸入電壓轉(zhuǎn)換為對應(yīng)的數(shù)值表示。其輸入電壓范圍分別對應(yīng)4096 個數(shù)值(步長),其計算方法為:參考電壓/256=5/256=19.5mV。

看起來這里給出的10 位A/D 的步長電壓值,但上述公式還定義了該模數(shù)轉(zhuǎn)化器的轉(zhuǎn)換精度,無論如何所有A/D 的轉(zhuǎn)換精度都低于其基準(zhǔn)電壓的精度,而提高輸出精度的唯一方法只有增加定標(biāo)校準(zhǔn)電路。

現(xiàn)在很多MCU 都內(nèi)置A/D,即可以使用電源電壓作為其基準(zhǔn)電壓,也可以使用外部基準(zhǔn)電壓。如果將電源電壓作為基準(zhǔn)電壓使用的話,假設(shè)該電壓為5V,則對3V 輸入電壓的測量結(jié)果為:(輸入電壓/基準(zhǔn)電壓)×255=(3/5)×255=99H。顯然,如果電源電壓升高1%,則輸出值為(3/5.05)×255=97H。實際上典型電源電壓的誤差一般在2~3%,其變化對A/D 的輸出影響是很大的。

3. 轉(zhuǎn)換精度

A/D 的輸出精度是由基準(zhǔn)輸入和輸出字長共同決定的,輸出精度定義了A/D 可以進行轉(zhuǎn)換的最小電壓變化。轉(zhuǎn)換精度就是A/D 最小步長值,該值可以通過計算基準(zhǔn)電壓和最大轉(zhuǎn)換值的比例得到。對于上面給出的使用5V 基準(zhǔn)電壓的8位A/D來說,其分辨率為19.5mV,也就是說,所有低于19.5mV 的輸入電壓的輸出值都為0,在19.5mV~39mV 之間的輸入電壓的輸出值為1,而在39mV~58.6mV 之間的輸入電壓的輸出值為3,以此類推。

提高分辨率的一種方法是降低基準(zhǔn)電壓,如果將基準(zhǔn)電壓從5V 降到2.5V,則分辨率上升到2.5/256=9.7mV,但最高測量電壓降到了2.5V。而不降低基準(zhǔn)電壓又能提高分辨率的唯一方法是增加A/D 的數(shù)字位數(shù),對于使用5V 基準(zhǔn)電壓的12 位A/D 來說,其輸出范圍可達4096,其分辨率為1.22mV。

在實際的應(yīng)用場合是有噪音的,顯然該12 位A/D 會將系統(tǒng)中1.22mV 的噪音作為其輸入電壓進行轉(zhuǎn)換。如果輸入信號帶有10mV 的噪音電壓,則只能通過對噪音樣本進行多次采樣并對采樣結(jié)果進行平均處理,否則該轉(zhuǎn)換器無法對10mV 的真實輸入電壓進行響應(yīng)。

4. 累積精度

如果在放大器前端使用誤差5%的電阻,則該誤差將會導(dǎo)致12 位A/D 無法正常工作。也就是說,A/D 的測量精度一定小于其轉(zhuǎn)換誤差、基準(zhǔn)電壓誤差與所有模擬放大器誤差的累計之和。雖然轉(zhuǎn)換精度會受到器件誤差的制約,但通過對每個系統(tǒng)單獨進行定標(biāo),也能夠得到較為滿意的輸出精度。如果使用精確的定標(biāo)電壓作為標(biāo)準(zhǔn)輸入,且借助存儲在MCU 程序中的定標(biāo)電壓常數(shù)對所有輸入進行糾正,則可以有效地提高轉(zhuǎn)換精度,但無論如何無法對溫漂或器件老化而帶來的影響進行校正。

5. 基準(zhǔn)源選型

引起電壓基準(zhǔn)輸出電壓背離標(biāo)稱值的主要因素是:初始精度、溫度系數(shù)與噪聲,以及長期漂移等,因此在選擇一個電壓基準(zhǔn)時,需根據(jù)系統(tǒng)要求的分辨率精度、供電電壓、工作溫度范圍等情況綜合考慮,不能簡單地以單個參數(shù)為選擇條件。

比如,要求12 位A/D 分辨到1LSB,即相當(dāng)于1/212=244ppm。如果工作溫度范圍在10℃,那么一個初始精度為0.01%(相當(dāng)于100ppm),溫度系數(shù)為10ppm/℃(溫度范圍內(nèi)偏移100ppm)的基準(zhǔn)已能滿足系統(tǒng)的精度要求,因為基準(zhǔn)引起的總誤差為200ppm,但如果工作溫度范圍擴大到15℃以上,該基準(zhǔn)就不適用了。

6. 常用基準(zhǔn)源

(1)初始精度的確定

初始精度的選擇取決于系統(tǒng)的精度要求,對于數(shù)據(jù)采集系統(tǒng)來說,如果采用n 位的ADC,那么其滿刻度分辨率為1/2n,若要求達到1LSB 的精度,則電壓基準(zhǔn)的初始精度為:

如果考慮到其它誤差的影響,則實際的初始精度要選得比上式更高一些,比如,按1/2LSB 的分辨率精度來計算,即上式所得結(jié)果再除以2,即:

(2)溫度系數(shù)的確定

溫度系數(shù)是選擇電壓基準(zhǔn)另一個重要的參數(shù),除了與系統(tǒng)要求的精度有關(guān)外,溫度系數(shù)還與系統(tǒng)的工作溫度范圍有直接的關(guān)系。對于數(shù)據(jù)采集系統(tǒng)來說,假設(shè)所用ADC 的位數(shù)是n,要求達到1LSB 的精度,工作溫度范圍是ΔT,那么基準(zhǔn)的溫度系數(shù)TC 可由下式確定:

同樣地,考慮到其它誤差的影響,實際的TC 值還要選得比上式更小一些。溫度范圍ΔT通常以25℃為基準(zhǔn)來計算,以工業(yè)溫度范圍-40℃~+85℃為例,ΔT 可取60℃(85℃-25℃),因為制造商通常在25℃附近將基準(zhǔn)因溫度變化引起的誤差調(diào)到最小。

如圖5.5 所示是一個十分有用的速查工具,它以25℃為變化基準(zhǔn),溫度在1℃~00℃變化時,8~20 位ADC 在1LSB 分辨精度的要求下,將所需基準(zhǔn)的TC 值繪制成圖,由該圖表可迅速查得所需的TC 值。

圖5.5 系統(tǒng)精度與基準(zhǔn)溫度系數(shù)TC 的關(guān)系

TL431 和REF3325/3330 均為典型的電壓基準(zhǔn)源產(chǎn)品,詳見表5.19。TL431 的輸出電壓僅用兩個電阻就可以在2.5~36V 范圍內(nèi)實現(xiàn)連續(xù)可調(diào),負載電流1~100mA。在可調(diào)壓電源、開關(guān)電源、運放電路常用它代替穩(wěn)壓二極管。REF3325輸出2.5V,REF3330 輸出3.0V。

表5.19 電壓基準(zhǔn)源選型參數(shù)表

REF33xx 是一種低功耗、低壓差、高精密度的電壓基準(zhǔn)產(chǎn)品,采用小型的SC70-3 和SOT23-3 封裝。體積小和功耗低(最大電流為5μA)的特點使得REF33xx 系列產(chǎn)品成為眾多便攜式和電池供電應(yīng)用的最佳選擇。在負載正常的情況下,REF33xx 系列產(chǎn)品可在高于指定輸出電壓180mV 的電源電壓下工作,但REF3312 除外,因為它的最小電源電壓為1.8V。

從初始精度和溫漂特性來看,REF3325/3330 均優(yōu)于TL431,但是TL431 的輸出電壓范圍很寬,且工作電流范圍很大,甚至可以代替一些LDO。由于基準(zhǔn)的初始精度和溫漂特性是影響系統(tǒng)整體精度的關(guān)鍵參數(shù),因此它們都不能用于高精密的采集系統(tǒng)和高分辨率的場合。而對于12bits的AD 來說,由于精度要求在0.1%左右的采集系統(tǒng),到底選哪個型號呢?測量系統(tǒng)的初始精度,均可通過對系統(tǒng)校準(zhǔn)消除初始精度引入的誤差;對于溫漂的選擇,必須參考1LSB 分辨精度來進行選擇,詳見圖5.6。如果不是工作在嚴苛環(huán)境下,通常工作溫度為-10℃~50℃,溫度變化在60℃,如果考慮0.1%系統(tǒng)精度,溫度特性低于50ppm,則選擇REF3325/3330。

圖5.6 12bits 系統(tǒng)基準(zhǔn)選擇

>>> 5.7.2 初始化

在使用ADC 通用接口前,必須先完成ADC 的初始化,以獲取標(biāo)準(zhǔn)的ADC 實例句柄。LPC82x 僅包含一個ADC(ADC0),為方便用戶使用,AMetal 提供了與ADC0 對應(yīng)的實例初始化函數(shù),其函數(shù)原型為:

函數(shù)的返回值為am_adc_handle_t 類型的ADC 實例句柄,該句柄將作為ADC 通用接口中handle 參數(shù)的實參。類型am_adc_handle_t(am_adc.h)定義如下:

因為函數(shù)返回的ADC 實例句柄僅作為參數(shù)傳遞給ADC 通用接口,不需要對該句柄作其它任何操作,因此完全不需要對該類型作任何了解。需要特別注意的是,若函數(shù)返回的實例句柄的值為NULL,則表明初始化失敗,該實例句柄不能被使用。

如需使用ADC0,則直接調(diào)用ADC0 實例初始化函即可完成ADC0 的初始化,并獲取對應(yīng)的實例句柄:

ADC0 共支持12 個通道,可以采集12 路模擬信號進行模數(shù)轉(zhuǎn)換,每路模擬信號通過LPC824 的相應(yīng)I/O 口輸入到ADC0 中,各通道對應(yīng)的I/O 口詳見表5.20。

表5.20 各通道對應(yīng)的I/O 口

>>> 5.7.3 接口函數(shù)

AMetal 提供了5 個ADC 相關(guān)的接口函數(shù),詳見表5.21。

表5.21 ADC 通用接口函數(shù)

1. 獲取ADC 通道的采樣率

獲取當(dāng)前ADC 通道的采樣率。其函數(shù)原型為:

獲取到的采樣率的單位為Samples/s。如果返回AM_OK,說明獲取成功;如果返回-AM_EINVAL,說明因參數(shù)無效導(dǎo)致獲取失敗,其相應(yīng)的代碼詳見程序清單5.87。

程序清單5.87 am_adc_rate_get()范例程序

參數(shù)無效是由于handle 不是標(biāo)準(zhǔn)的ADC handle 或者通道號不支持造成的。

2. 設(shè)置ADC 通道的采樣率

設(shè)置ADC 通道的采樣率。實際采樣率可能與設(shè)置的采樣率存在差異,實際采樣率可由am_adc_rate_get()函數(shù)獲取。注意,在一個ADC 中,所有通道的采樣率往往是一樣的,因此設(shè)置其中一個通道的采樣率時,可能會影響其它通道的采樣率。其函數(shù)原型為:

如果返回AM_OK,說明設(shè)置成功;如果返回-AM_EINVAL,說明因參數(shù)無效導(dǎo)致設(shè)置失敗,其相應(yīng)的代碼詳見程序清單5.88。

程序清單5.88 am_adc_rate_set()范例程序

3. 獲取ADC 通道的參考電壓

獲取ADC 通道的參考電壓,其函數(shù)原型為:

如果返回值大于0,表示獲取成功,其值即為參考電壓(單位:mV);如果返回-AM_EINVAL,說明因參數(shù)無效導(dǎo)致獲取失敗,其相應(yīng)的代碼詳見程序清單5.89。

程序清單5.89 am_adc_vref_get()范例程序

4. 獲取ADC 通道的轉(zhuǎn)換位數(shù)

獲取ADC 通道的轉(zhuǎn)換位數(shù),其函數(shù)原型為:

如果返回值大于0,表示獲取成功,其值即為轉(zhuǎn)換位數(shù);如果返回-AM_EINVAL,說明因參數(shù)無效導(dǎo)致獲取失敗,其相應(yīng)的代碼詳見程序清單5.90。

程序清單5.90 am_adc_bits_get()范例程序

5. 讀取指定通道的電壓值

直接讀取ADC 通道的電壓值(單位:mV),該函數(shù)會等到電壓值讀取完畢后返回。其函數(shù)原型為:

其中p_mv 是指向存放電壓值的緩沖區(qū),類型am_adc_val_t 在am_adc.h 中定義,即:

length 表示緩沖區(qū)的長度,決定了實際獲取電壓值的個數(shù)。如要返回AM_OK,表示讀取通道電壓值成功,相應(yīng)緩沖區(qū)中已經(jīng)填充好了讀取到的電壓值;如果返回-AM_EINVAL,說明因參數(shù)無效導(dǎo)致獲取失敗,其相應(yīng)的代碼詳見程序清單5.91。

程序清單5.91 am_adc_read_mv()范例程序

>>> 5.7.4 溫度采集

1. 電壓采集

熱敏電阻器屬于敏感元件類型,按照溫度系數(shù)的不同可分為正溫度系數(shù)熱敏電阻器(PTC)和負溫度系數(shù)熱敏電阻器(NTC)。熱敏電阻器的典型特點是對溫度敏感,在不同的溫度下其電阻值不一樣。正溫度系數(shù)熱敏電阻器(PTC)在溫度越高時電阻值越大,負溫度系數(shù)熱敏電阻器在溫度越高時電阻值越小。

AM824-Core 上有一個負溫度系數(shù)熱敏電阻器RT1,硬件電路詳見圖5.7。熱敏電阻RT1 和2KΩ的R14 構(gòu)成了分壓電路,選用MF52E-103F3435FB-A,C8 使電路輸出更加穩(wěn)定。當(dāng)測溫范圍在0~85℃時,電阻變化范圍為27.6~1.45KΩ。當(dāng)溫度變化時,熱敏電阻的阻值發(fā)生變化,單片機采集到的ADC 值也會發(fā)生變化。只要將J6 通過跳線帽短接,則R14 電阻的電壓直接通過PIO0_19 輸入到了ADC的通道7,即可使用ADC 采集其電壓值。

圖5.7 熱敏電阻電路

如程序清單5.92 所示的ntc.c 的兩個函數(shù),其中的一個用于初始化,另一個用于讀取電壓值。由于最終的接口還不確定,所以只創(chuàng)建了ntc.h。

程序清單5.92 采集電壓值相關(guān)函數(shù)編寫(ntc.c)

ntc_init()僅用于初始化ADC,獲取一個標(biāo)準(zhǔn)的ADC 實例句柄。ntc_vol_get()用于獲取ADC 通道7 對應(yīng)的電壓值,使用了am_adc_read_mv()函數(shù)。

為了使結(jié)果更加可信,電壓采集時使用了中值平均濾波法(防脈沖干擾平均濾波法),即去掉采樣數(shù)據(jù)中的最大值和最小值,再取余下數(shù)據(jù)的平均值作為最終結(jié)果。程序中,首先使用am_adc_read_mv()函數(shù)采集了12 個電壓值,然后將所有電壓值求和,并找出最大值和最小值,最后從和值中減去最大值和最小值后除以10 作為電壓采集值并返回。

2. 獲取阻值

假設(shè)采集的電壓值為vol,通過RT1R14 分壓后,則有:

通過簡單轉(zhuǎn)換后可得:

利用該公式,可以將采集的電壓值轉(zhuǎn)換為RT1 的電阻值,詳見程序清單5.93,同樣將程序直接添加到ntc.c 中。

程序清單5.93 獲取熱敏電阻的阻值(ntc.c)

為了避免小數(shù)計算,電壓的單位統(tǒng)一為毫伏(mV),電阻的單位統(tǒng)一為歐姆(Ω)。

3. 阻值與溫度的關(guān)系

在獲取熱敏電阻阻值后,將如何找到與該電阻值對應(yīng)的溫度呢?不妨先從分析熱敏電阻阻值與溫度的關(guān)系開始。負溫度系數(shù)熱敏電阻的電阻值(RT)和溫度(T)呈指數(shù)關(guān)系:

其中,RT 是在溫度T(單位為K,即開爾文)時的NTC 熱敏電阻阻值,RN 是在額定溫度TN(K)的NTC 熱敏電阻阻值,B 為NTC 熱敏電阻的材料常數(shù),又叫熱敏指數(shù)。由于該關(guān)系式是經(jīng)驗公式,因此只在額定溫度 TN 或額定電阻阻值 RN 的有限范圍內(nèi)才具有一定的精確度。

如何得到材料常數(shù)B 的值呢?顯然,只能通過實驗測得。假定在實驗環(huán)境下,測得在溫度 T1 ( K )時的零功率電阻值為RT1,在溫度 T2 ( K )時的零功率電阻值為RT2。零功率電阻是指在某一溫度下測量熱敏電阻值時,加在熱敏電阻上的功耗極低,低到因其功耗引起的熱敏電阻阻值變化可以忽略不計。額定零功率電阻是在環(huán)境溫度25℃條件下測得的零功率電阻值,標(biāo)記為R25,通常所說NTC 熱敏電阻阻值就是指該值。

根據(jù)T1、RT1、T2、RT2 和溫度與電阻值的關(guān)系式,可以得到:

將兩個等式相除可得:

等式兩邊同時對e 取對數(shù)(ln)可得:

經(jīng)過變換,可以得到B 值的計算公式為:

由此可見,只要測得兩個溫度點對應(yīng)的零功率電阻值,就可以求得B 值。由于精確的測量需要有高精度的溫度測量儀和高精度的電阻測量儀,一般條件下很難完成,因此,廠家往往都會提供一些溫度點對應(yīng)的零功率電阻值。比如,AM824-Core 使用的熱敏電阻,廠家提供了兩個溫度點對應(yīng)的零功率電阻值:R25 = 10000Ω,R85 = 1451Ω。

根據(jù)這兩個溫度值,即可求得B 值:

注意,表達式中的溫度都是以開爾文(K)為單位的,因此需要將攝氏度(℃)轉(zhuǎn)換為開爾文溫度。其轉(zhuǎn)換關(guān)系為:

當(dāng)求得B 值后,可以使用電阻值和溫度的關(guān)系式求得某溫度下的電阻值。阻值與溫度的關(guān)系式中RN 為在額定溫度TN(K)下的阻值,可以直接使用R25 對應(yīng)的值,即RN=10000Ω,TN=(25+273.15)K。以60℃為例計算對應(yīng)的阻值:

由此可見,上述計算過程是非常繁瑣的,且還要涉及到復(fù)雜的指數(shù)運算,所以往往會采用查表法。即先將各個溫度對應(yīng)的電阻值存儲到一個表格中,當(dāng)需要使用時直接查表即可。

AM824-Core 的熱敏電阻,廠家提供了如表5.22 所示的R-T 表。根據(jù)實際應(yīng)用場合,這里僅列出了-20℃~ 87℃對應(yīng)的電阻值,而實際上該熱敏電阻支持-40℃~125℃的溫度測量。

表5.22 熱敏電阻R-T 表

通過查表可知60℃對應(yīng)的阻值為3002Ω,而計算出來的值卻是2981Ω。由于前面的公式僅僅是經(jīng)驗公式,計算值與實測值往往會存在少量差異,但總體上是非常相近的,即2981Ω最接近60℃。由于溫度是連續(xù)的,且以1℃為間距,因此僅需一維數(shù)組即可存儲所有的阻值,即數(shù)組的0 號元素對應(yīng)-20℃的阻值,107 號元素對應(yīng)87℃的阻值。要想獲得溫度對應(yīng)的阻值,則將溫度值加上20 作為數(shù)組索引即可。

由于最大阻值為70988Ω,因此每個阻值需要一個32 位的數(shù)據(jù)來保存,則數(shù)組元素的類型設(shè)定為uint32_t 類型。-20℃~87℃共計對應(yīng)108 個阻值,數(shù)組大小即為108,共計108個4 字節(jié)存儲單元,即108*4 = 423 字節(jié)。注意,表格中僅-20℃和-19℃對應(yīng)的阻值超過了65535,其它溫度值對應(yīng)的阻值均可用16 位來表示。因此可以做一些特殊的處理,比如,將-20℃和-19℃對應(yīng)的阻值單獨保存。如果測溫范圍不包含這兩個溫度,則可以去掉這兩個溫度值對應(yīng)的阻值。保存溫度對應(yīng)阻值的ntc.c 詳見程序清單5.94。

程序清單5.94 定義保存各個溫度值對應(yīng)阻值的數(shù)組

由于數(shù)組的起始元素為-20℃對應(yīng)的阻值,因此對應(yīng)溫度與數(shù)組索引的關(guān)系如下:

  • 對應(yīng)溫度=數(shù)組索引-20

  • 數(shù)組索引=對應(yīng)溫度+20

由于數(shù)組索引與溫度存在20 的差值,如果需得到25℃對應(yīng)的阻值,則應(yīng)該在使用溫度值的基礎(chǔ)上加上20 作為數(shù)組的索引。即:

4. 獲取溫度值

雖然已經(jīng)得到了熱敏電阻阻值與溫度的對應(yīng)關(guān)系,但是如何獲取阻值對應(yīng)的溫度呢?如果阻值對應(yīng)的溫度剛好是整數(shù),即阻值會與數(shù)組中某個元素相等,則只需要掃描一遍數(shù)組,如果掃描到阻值相等,即可得到對應(yīng)的溫度,詳見程序清單5.95。

程序清單5.95 獲取溫度值(1)

雖然該程序?qū)崿F(xiàn)起來很簡單,卻不實用,因為得到的阻值恰好是整數(shù)溫度的概率太小了。而事實上得到的阻值往往處于某個區(qū)間之內(nèi),比如,7500Ω對應(yīng)的溫度范圍為32℃~ 33℃,那么該如何確定其溫度值呢?7500Ω與32℃對應(yīng)的7712Ω相差212Ω,與33℃對應(yīng)的7437Ω相差63Ω,顯然與33℃更加接近,那是不是直接取33℃就好了呢?如果對精度要求不高,得到的溫度全為整數(shù)值,如果希望更加精確,比如,要求精確到小數(shù)點后兩位?

盡管指數(shù)關(guān)系是非線性關(guān)系,其對應(yīng)的阻值-溫度關(guān)系圖是曲線圖,但可以將這一曲線分解為若干小段,將每一小段中的阻值-溫度關(guān)系近似為線性關(guān)系。如將1℃溫度區(qū)間內(nèi)的阻值-溫度關(guān)系近似為線性關(guān)系進行處理。假設(shè)已知區(qū)間的兩個端點(R1,T1)、(R2,T2),那么使用已知兩點求直線方程的方法,很容易得到阻值R(R1≤R≤R2)對應(yīng)的溫度為:

對于上述例子來說,若測得電阻阻值為7500Ω,則區(qū)間的兩個端點為(7712,32)和(7437,33),使用上述式子可得到溫度值:

顯然,這樣求得的溫度更加精確,其相應(yīng)的代碼詳見程序清單5.96。

程序清單5.96 根據(jù)溫度區(qū)間獲取溫度值

程序中使用的是帶符號數(shù),而電阻值是用無符號數(shù)表示的,因此必須將無符號的電阻值事先存放到有符號數(shù)中再進行計算。當(dāng)無符號數(shù)與有符號數(shù)混合運算時,由于無符號數(shù)優(yōu)先級高,因此會先將有符號數(shù)轉(zhuǎn)換為無符號數(shù)再作運算,特別是在有負數(shù)參與運算的場合,往往會得到意想不到的結(jié)果。比如:

為什么結(jié)果等于0?因為a 是無符號數(shù),在計算a/b 時,按照無符號數(shù)計算,則會先將-32轉(zhuǎn)換為無符號數(shù),即4294967264,96 整除一個這個大的數(shù),結(jié)果自然就為0 了。同時,為了避免小數(shù)的計算,將運算結(jié)果擴大了256 倍。由于測量的溫度范圍為-20℃~87℃,即便擴大256 倍后也不會超過16 位帶符號數(shù)的范圍,因此最終返回一個16 位的帶符號數(shù)。

為何要擴大256 倍而不是100 倍呢?當(dāng)然,100 倍更好理解,如果擴大100 倍,即表示保留2 位小數(shù),最小表示數(shù)值為0.01。其實擴大256 倍也是一樣的,其最小表示數(shù)值為1/256= 0.00390625,具有更高的精度。前面我們已經(jīng)使用的LM75B 采集溫度值,讀取溫度值的lm75_read()函數(shù)返回的實際測量溫度值也擴大了256 倍。這樣一來,如果這里返回的溫度值同樣也擴大256 倍,則之前的程序就完全可以復(fù)用了。

為了使用ntc_temp_get_from_range()函數(shù)得到溫度值,還需要找出阻值對應(yīng)溫度所在的溫度區(qū)間。如何獲取區(qū)間呢?由于阻值是順序遞減的,最簡單的方法就是順序?qū)ふ?,只要找到測得的電阻值大于阻值表中某個溫度對應(yīng)的阻值時,即可確定其處在的區(qū)間。如順序?qū)ふ易柚?500 的區(qū)間時,找到溫度為33℃對應(yīng)的阻值7437 時,發(fā)現(xiàn)比其小,則說明33℃為其右邊界,左邊界為上一個溫度值,即32℃,其相應(yīng)的代碼詳見程序清單5.97。

程序清單5.97 獲取溫度值(2)

實際上,當(dāng)前的搜索方法效率太低,如果溫度是87℃,則要搜索108 次,直到將數(shù)組元素全部遍歷一遍為止。由于阻值是順序遞減的,則不妨用二分法。即每次與中間的數(shù)比較,根據(jù)比較結(jié)果即可將搜索范圍縮小一半,接著繼續(xù)與新的搜索范圍中的中間值比較,同樣可以根據(jù)比較結(jié)果將搜索范圍縮小一半,依此類推,每次比較都可以直接將搜索范圍縮小一半。

下面還是以7500Ω為例,數(shù)組元素總共有108 個,索引為0 ~ 107,用兩個變量low 和high 分別表示搜索范圍的下界和上界,mid 表示中間位置。

(1) 初始時,則low = 0,high = 107,中間位置即為(low+high)/2 = 53(直接按照C語言整數(shù)除法),53 位置(即溫度33℃,直接查表5.22)對應(yīng)的阻值為7437,7437 小于7500,因此搜索范圍鎖定至上半部分,因此更新high = 53;

(2) 繼續(xù)搜索,low = 0,high = 53,mid = 26,26 位置對應(yīng)的阻值為21363,21363 大于7500,因此搜索范圍一定在后半部分,更新low = 26;

(3) low = 26,high = 53,mid = 39,39 位置對應(yīng)的阻值為12596,12596 大于7500,因此搜索范圍還是在后半部分,更新low = 39;

(4) low = 39,high = 53,mid = 46,46 位置對應(yīng)的阻值為9630,9630 大于7500,因此搜索范圍還是在后半部分,更新low = 46;

(5) low = 46,high = 53,mid = 49,49 位置對應(yīng)的阻值為8610,8610 大于7500,因此搜索范圍還是在后半部分,更新low = 49;

(6) low = 49,high = 53,mid = 51,51 位置對應(yīng)的阻值為7999,7999 大于7500,因此搜索范圍還是在后半部分,更新low = 51;

(7) low = 51,high = 53,mid = 52,52 位置對應(yīng)的阻值為7712,7712 大于7500,因此搜索范圍還是在后半部分,更新low = 52。至此,由于low 與high 之間只差1,無法再繼續(xù)分成兩部分,因此,確定要找的值一定在位置52 與53 之間,也就是阻值對應(yīng)的溫度范圍為32℃~ 33℃,到此為止搜索結(jié)束。

針對108 個元素,按照二分法搜索,最多搜索7 次,其相應(yīng)的代碼詳見程序清單5.98。

程序清單5.98 獲取溫度值(3)

至此,即可直接調(diào)用ntc_temp_read()獲取溫度值。相關(guān)函數(shù)編寫完畢,將ntc_init()和ntc_temp_read()函數(shù)聲明詳見程序清單5.99(ntc.h),其具體實現(xiàn)詳見程序清單5.100(ntc.c)。

程序清單5.99 ntc.h 文件內(nèi)容

程序清單5.100 ntc.c 文件內(nèi)容

ntc.c 相比于之前的代碼,新增了兩個變量:

(1) 新增變量res_val_num 用于表示數(shù)組元素的個數(shù)

在范圍搜索時,將之前的固定值107 修改為數(shù)組元素個數(shù),這樣一來數(shù)組元素就可以繼續(xù)向后增加,比如,增加至-20℃~125℃,則所有代碼都無需任何修改。

(2) 新增變量temp_start 用于表示阻值表的起始溫度值

之前的代碼固定了起始溫度為-20℃,如果向前擴展溫度范圍為-40℃~125℃,則程序必須做相應(yīng)的修改。當(dāng)增加該變量后,向前擴展溫度范圍時,僅需修改該變量的值即可,此時數(shù)組的起始元素就是temp_start 溫度對應(yīng)的阻值,因此對應(yīng)溫度與數(shù)組索引存在如下關(guān)系:

對應(yīng)溫度 = 數(shù)組索引+temp_start,數(shù)組索引 = 對應(yīng)溫度-temp_start

范例程序可以直接修改此前編寫的“智能溫控儀”程序,使用熱敏電阻獲取溫度值替換之前的LM75 獲取溫度值。僅需修改3 行代碼即可:“#include "lm75.h" 修改為 #include"ntc.h",am_main()函數(shù)中的lm75_init()修改為ntc_init(),am_main()函數(shù)中的lm75_read()修改為ntc_temp_read()”,而其它復(fù)雜的鍵盤處理和數(shù)碼管顯示等均可復(fù)用。



聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    8602

    瀏覽量

    146716
  • 信號處理
    +關(guān)注

    關(guān)注

    48

    文章

    992

    瀏覽量

    103154
  • 周立功
    +關(guān)注

    關(guān)注

    38

    文章

    130

    瀏覽量

    37556

原文標(biāo)題:周立功:深入淺出AMetal——A/D 轉(zhuǎn)換器

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    D/A轉(zhuǎn)換器簡介

    數(shù)模轉(zhuǎn)換器,又稱D/A轉(zhuǎn)換器,簡稱DAC,它是把數(shù)字量轉(zhuǎn)變成模擬的器件。D/A
    發(fā)表于 09-30 15:50 ?1.2w次閱讀
    <b class='flag-5'>D</b>/<b class='flag-5'>A</b><b class='flag-5'>轉(zhuǎn)換器</b>簡介

    四種A/D轉(zhuǎn)換器轉(zhuǎn)換原理

    A/D轉(zhuǎn)換器是將模擬信號變換成相應(yīng)的數(shù)字信號的裝置。今天來介紹幾種不同類型的A/
    發(fā)表于 11-02 14:58 ?6081次閱讀
    四種<b class='flag-5'>A</b>/<b class='flag-5'>D</b><b class='flag-5'>轉(zhuǎn)換器</b>的<b class='flag-5'>轉(zhuǎn)換</b>原理

    幾種不同類型的A/D轉(zhuǎn)換器轉(zhuǎn)換原理

    A/D轉(zhuǎn)換器是將模擬信號變換成相應(yīng)的數(shù)字信號的裝置。今天來介紹幾種不同類型的A/
    的頭像 發(fā)表于 12-31 16:33 ?2940次閱讀
    幾種不同類型的<b class='flag-5'>A</b>/<b class='flag-5'>D</b><b class='flag-5'>轉(zhuǎn)換器</b>的<b class='flag-5'>轉(zhuǎn)換</b>原理

    A/D轉(zhuǎn)換器的工作原理是什么?

    將模擬信號轉(zhuǎn)換成數(shù)字信號的電路,稱為模數(shù)轉(zhuǎn)換器(簡稱a/d轉(zhuǎn)換器或adc,analog to d
    發(fā)表于 10-22 09:01

    CMOS圖像傳感集成A/D轉(zhuǎn)換器技術(shù)的研究

    CMOS圖像傳感集成A/D轉(zhuǎn)換器技術(shù)的研究:片上集成A/D
    發(fā)表于 01-18 08:23 ?47次下載

    A/D轉(zhuǎn)換器原理

    A/D轉(zhuǎn)換器原理 A/D轉(zhuǎn)換器是用來通過一定的電路將模擬量轉(zhuǎn)變?yōu)閿?shù)字量。 模擬量可以是電壓、
    發(fā)表于 01-14 13:17 ?2.7w次閱讀
    <b class='flag-5'>A</b>/<b class='flag-5'>D</b><b class='flag-5'>轉(zhuǎn)換器</b>原理

    采用乘法D-A轉(zhuǎn)換器IC的廉價8位D-A轉(zhuǎn)換器

    采用乘法D-A轉(zhuǎn)換器IC的廉價8位D-A轉(zhuǎn)換器 電路的功能 8位D-A轉(zhuǎn)換器
    發(fā)表于 05-07 15:18 ?891次閱讀
    采用乘法<b class='flag-5'>D-A</b><b class='flag-5'>轉(zhuǎn)換器</b>IC的廉價8位<b class='flag-5'>D-A</b><b class='flag-5'>轉(zhuǎn)換器</b>

    D/A、A/D轉(zhuǎn)換器

    在數(shù)字電子技術(shù)的很多應(yīng)用場合往往需要把模擬量轉(zhuǎn)換為數(shù)字量,稱為模/數(shù)轉(zhuǎn)換器A/D轉(zhuǎn)換器,簡稱ADC);或把數(shù)字量
    發(fā)表于 04-05 12:44 ?200次下載

    常用D/A轉(zhuǎn)換器A/D轉(zhuǎn)換器介紹

    常用D/A轉(zhuǎn)換器A/D轉(zhuǎn)換器介紹 下面我們介紹一下其它常用
    發(fā)表于 09-05 14:48 ?308次下載
    常用<b class='flag-5'>D</b>/<b class='flag-5'>A</b><b class='flag-5'>轉(zhuǎn)換器</b>和<b class='flag-5'>A</b>/<b class='flag-5'>D</b><b class='flag-5'>轉(zhuǎn)換器</b>介紹

    你知道使用直方圖技術(shù)測量A / D轉(zhuǎn)換器噪聲么?

    使用直方圖來確定A / D轉(zhuǎn)換器均方根噪聲的技術(shù),參考輸入。它可以通過應(yīng)用直流模擬電壓并在A / D
    的頭像 發(fā)表于 04-15 15:30 ?3843次閱讀
    你知道使用直方圖技術(shù)測量<b class='flag-5'>A</b> / <b class='flag-5'>D</b><b class='flag-5'>轉(zhuǎn)換器</b><b class='flag-5'>噪聲</b>么?

    四種A/D轉(zhuǎn)換器的特點及原理

    A/D轉(zhuǎn)換器是將模擬信號變換成相應(yīng)的數(shù)字信號的裝置。今天來介紹幾種不同類型的A/
    發(fā)表于 02-09 09:47 ?4305次閱讀
    四種<b class='flag-5'>A</b>/<b class='flag-5'>D</b><b class='flag-5'>轉(zhuǎn)換器</b>的特點及原理

    A/D轉(zhuǎn)換器的原理 A/D轉(zhuǎn)換步驟

      A/D轉(zhuǎn)換器即模擬數(shù)字轉(zhuǎn)換器簡稱ADC,通常是指一個將模擬信號轉(zhuǎn)變?yōu)閿?shù)字信號的電子元件。通常
    發(fā)表于 02-22 17:19 ?4453次閱讀

    請問A/D轉(zhuǎn)換器的模擬地和數(shù)字地如何分割才能更好的降低噪聲?

    請問A/D轉(zhuǎn)換器的模擬地和數(shù)字地如何分割才能更好的降低噪聲A/D
    的頭像 發(fā)表于 11-09 10:02 ?1108次閱讀

    A/D轉(zhuǎn)換器的作用是什么?

    A/D轉(zhuǎn)換器(模數(shù)轉(zhuǎn)換器)的作用是將模擬信號轉(zhuǎn)換為數(shù)字信號
    的頭像 發(fā)表于 11-16 15:54 ?1529次閱讀

    簡單認識雙積分型A/D轉(zhuǎn)換器

    雙積分型A/D轉(zhuǎn)換器是一種重要的模擬到數(shù)字轉(zhuǎn)換器(Analog-to-Digital Converter,簡稱A/
    的頭像 發(fā)表于 09-06 16:22 ?622次閱讀