NTC測溫,尤其面對通過ADC轉(zhuǎn)換得到的數(shù)值時(shí),你是否會(huì)猶豫:用什么方式更為合理地將這個(gè)ADC值轉(zhuǎn)換為溫度T?
假設(shè)我們已經(jīng)對ADC的分辨率、準(zhǔn)確度,以及所選的NTC精度范圍都有了選擇。對于絕大多數(shù)的應(yīng)用而言,通過電阻分壓方式的配置就可以滿足我們所需的配置及所需的精度;個(gè)別高精度的NTC測溫會(huì)用到4線制以消除導(dǎo)線電阻帶來的誤差,這些暫不在我們今天討論的話題范圍。
因?yàn)樘峁┑腘TC的參數(shù)內(nèi)容不一樣,本文以我們之前除霧傳感器中的測量前擋風(fēng)玻璃溫度的NTC為例作為比較和說明。
查表方式的特點(diǎn)
查表方式的操作:二分法查找和線性插值;
通過R-T表獲取擬合NTC的R(T)特性公式;
公式計(jì)算方式的特點(diǎn)
對于查表和R-T公式計(jì)算方式測溫的兩種方法比較
查表方式的特點(diǎn)
相對的,對于測量精度要求不是太高,或者只提供了R-T表的,而且相應(yīng)溫度測量范圍不是太寬情況下的應(yīng)用,用查表方式一般可以解決問題。這里表內(nèi)存儲(chǔ)的元素為int類型的ADC值,而不是其他字節(jié)數(shù)長度更多的float或者double數(shù),否則無法達(dá)到節(jié)省代碼的目的,從而表占用的代碼空間就不會(huì)太大。當(dāng)利用查表方式使用NTC測溫時(shí),最好將制表的溫度分辨率不低于需要的測溫精度。例如,如果測溫精度要求為+/-1°C,那么表中的溫度參數(shù)間隔就至少不低于1°C;而位于表內(nèi)兩個(gè)鄰近溫度值之間的數(shù)值,則采用線性插值的方式進(jìn)行。
以除霧傳感器中的NTC為例。下側(cè)圖中:

R_NTC為當(dāng)前的NTC
Rs為串聯(lián)分壓電阻(9kohm)
Vcc為驅(qū)動(dòng)電壓(5V)
V_ADC為12位的分壓ADC數(shù)值。
在以上這種設(shè)定情況下,我們通過使用excel可以得到像以下一樣的表格:
| TEMP(°C) | R_NTC (kohm) | Vout | ADC(12bit) |
| 0 | 27.76 | 3.757009 | 3078 |
| 1 | 26.57 | 3.716083 | 3044 |
| 2 | 25.438 | 3.674521 | 3010 |
| 3 | 24.361 | 3.632344 | 2976 |
| 4 | 23.335 | 3.589651 | 2941 |
| 5 | 22.358 | 3.546371 | 2905 |
| 6 | 21.427 | 3.502596 | 2869 |
| 7 | 20.54 | 3.458323 | 2833 |
| 8 | 19.695 | 3.41365 | 2796 |
| 9 | 18.89 | 3.368501 | 2759 |
| 10 | 18.121 | 3.323023 | 2722 |
| 11 | 17.389 | 3.277182 | 2685 |
| 12 | 16.69 | 3.230993 | 2647 |
| 13 | 16.022 | 3.184605 | 2609 |
| 14 | 15.386 | 3.13788 | 2571 |
| … | … | … | … |
這樣,通過這個(gè)表,我們就可以建立溫度和分壓電路ADC之間的映射。從表中任意兩個(gè)相鄰溫度對應(yīng)的ADC值可以看到,還有許多ADC值將面對“空白”。
如果允許,一方面我們可以在兩個(gè)溫度值對應(yīng)的ADC之間進(jìn)行線性插值的方式進(jìn)行換算;另一方面,如果允許,還可以生成更多的數(shù)值對,以實(shí)現(xiàn)更高的查表分辨率。
另外,如果限于所使用器件(比如MCU的代碼空間尺寸)的限制,不得不使用當(dāng)前表格的分辨率,甚至需要減小表格的溫度分辨率時(shí)(比如從間隔1°C增加到2°C),如果允許,就更需要使用線性插值的方式來計(jì)算當(dāng)ADC值落入中間空白值時(shí)對應(yīng)的溫度,比如在上表中如果ADC=2700時(shí),那么對應(yīng)的溫度值將處于10°C和11°C之間。
我們看一下基于分壓電路的ADC值和溫度T之間的關(guān)系圖(如下)。

再比較一下NTC的原始R-T圖(如下)。

由于ADC值/T圖中的曲線更加平直,在橫軸上取溫度間隔?T很小時(shí),對應(yīng)的ADC—T曲線將非常近似于直線,這也是為什么可以在相鄰的表格溫度T與ADC值之間可以采用線性插值的理由。
查表方式的操作:二分法查找+線性插值
兩個(gè)步驟:(1)二分法找到當(dāng)前ADC對應(yīng)的表中索引位置;(2)線性插值計(jì)算溫度值。
相比于線性查找時(shí)間復(fù)雜度O(N),二分法查找的時(shí)間復(fù)雜度是O(LnN/Ln2),即總體上二分法所花的時(shí)間會(huì)更短。這都是在假設(shè)所查找值為一個(gè)隨機(jī)值情況下的統(tǒng)計(jì)。實(shí)際上由于NTC溫度探頭的響應(yīng)時(shí)間的存在,或者環(huán)境溫度的平緩變化,或者ADC采集頻率的提高,那么如果程序中記錄了前一次的查找值,那么在后一次根據(jù)ADC值查找過程中,是可以將前一次的查找索引值作為參考值來處理從而縮小查找范圍的,不過在實(shí)現(xiàn)上會(huì)增加一些代碼。
二分法查找的python示意代碼(C和Python代碼都可以在我們網(wǎng)站對應(yīng)文章頁面下載):
|
def binary_search(array, target): low, high = 0, len(array) - 1 while low <= high: mid = low + (high - low) // 2 mid_val = array[mid] if mid_val == target: return mid, mid elif mid_val < target: low = mid + 1 else: high = mid - 1 return high, low? |
|
if __name__ == '__main__': array = [1, 2, 4, 5, 6, 8, 11, 15, 20, 30] target = 7 low, high = binary_search(array, target) if low == high: print(f'Element {target} is at index {low}') else: print(f'Element {target} is between indexes {low} and {high}') |
上面的二分法查找代碼中有個(gè)小bug,讀者可以嘗試查找,或者在我們的網(wǎng)站文章頁面鏈接中下載修正之后的代碼。
以上代碼中,當(dāng)low==high,即二分法查找函數(shù)返回的數(shù)組索引值相等時(shí),此時(shí)ADC值剛好有對應(yīng)表值,否則,返回值表示當(dāng)前的ADC結(jié)果位于表中array [low]和array [high]兩個(gè)值之間。
當(dāng)ADC的值位于表中array [low]和array [high]兩個(gè)元素值之間時(shí),就可以考慮線性插值了。

如圖,在對應(yīng)的2個(gè)ADC值之間出現(xiàn)一個(gè)中間值A(chǔ)DC時(shí)(橙色線表示的坐標(biāo)點(diǎn)為待求值,圖中溫度間隔為1℃),由于ADC(n)和ADC(n+1)之間近于直線,則根據(jù)簡單的相似原理計(jì)算出?T后就可以得出當(dāng)前ADC(t)值對應(yīng)的溫度值。

得到:

所以,ADC(t)對應(yīng)的溫度值就是(T+)。這里ADC(n)和T之間存在簡單映射。讀者需要根據(jù)自己的溫度間隔設(shè)置來調(diào)整上面的公式。
在一些小型應(yīng)用中,如果因?yàn)镸CU的代碼空間限制問題導(dǎo)致無法使用更多的代碼,則可以簡單估算中間值,或者只好犧牲一些表格精度了。
可能會(huì)有人問,為什么一直在說MCU的代碼空間?如果有R-T公式,直接調(diào)用

通過R-T表獲取擬合NTC的R(T)特性公式
由于手邊只有R-T表,現(xiàn)在考慮通過擬合的方式獲取R-T特性公式。

其中,T(K)=t+273.15,T0=273.15+25=298.15(K),R_To在這里也是常數(shù),取25℃時(shí)的R值,可以從R-T表中讀取。通過處理lnR和1/T之間的線性關(guān)系,可得下圖所示的坐標(biāo)圖:

從擬合的公式中看到,可以取材料常數(shù)β=3365.8K。
余數(shù)部分經(jīng)核算也基本符合,和上圖擬合公式中的2.1166相差0.04。
到這一步,[式-2]中常數(shù)項(xiàng)都已經(jīng)得到,R-T特性公式也就定了。如果知道了NTC的當(dāng)前R值,就可以根據(jù)[式-2]計(jì)算溫度值。
公式計(jì)算方式的特點(diǎn)
由公式計(jì)算溫度值通過以下幾步完成:
讀取分壓電路的ADC值;
通過ADC值計(jì)算NTC的R(T)值;
將R(T)值代入[式-2]計(jì)算獲取溫度值。
直接代碼如下:
|
#include floatCalWindyScreenTemp(intinputTempADC) { floatbelta = 3365.8; floatR25 = 100000.0; //float_Serial=9000.0; //floatVcc= 5.0; floatVout = 5.0 * inputTempADC/4096.0;//GetVout if(Vout>=5.0)return(-100.0);//Error indicator floatR_NTC = Vout * 90000.0/(5.0-Vout);//R_NTC floattemperature =log(R_NTC/R25)/belta + 1/(273.15+25.0); temperature = 1/temperature - 273.15; return(temperature); } |
使用公式計(jì)算似乎更為方便。不著急,我們先看一下后續(xù)的比較。
對于查表和R-T公式計(jì)算方式測溫的兩種方法比較
單從表面的代碼長度上比較的話,用公式計(jì)算的代碼要比要查表的代碼簡單得多。不過我們還是先比較一下實(shí)際編譯后的可執(zhí)行代碼尺寸。
以下的數(shù)據(jù)基于STM32F103和STM32CubeIDE。
| Text | Data | Bss | Dec | 代碼內(nèi)容 | 代碼變化 |
|---|---|---|---|---|---|
| 寫入到flash | 初始化后數(shù)據(jù) | 未初始化數(shù)據(jù) | 前三部分總和 | ||
| 3512 | 20 | 1572 | 5104 | 無NTC測溫 | |
| 5888 | 20 | 1572 | 7480 | 查表測溫 | 2376 |
| 8188 | 100 | 1884 | 10172 | 公式測溫 | 4676 |
從上面的表中可以看到,看似代碼少的公式計(jì)算法反而需要更多的代碼空間。而查表的方法(+插值運(yùn)算)所需的代碼空間卻要更少些。
實(shí)際上,公式方式中單純調(diào)用log的計(jì)算所用到的函數(shù),就會(huì)占用1~2k的字節(jié)。如果用于計(jì)算我們另外一款SC30系列高精度互換型NTC,則在額外使用指數(shù)函數(shù)(可以用連乘方式替代)的時(shí)候,代碼還會(huì)再額外增加2k字節(jié)的樣子。
所以真要比較兩種計(jì)算方法,我們可以簡單羅列如下表:
| 比較內(nèi)容 | 查表插值法 | 公式法 |
|---|---|---|
| 優(yōu)勢 |
一定條件下占用代碼空間小 適用已知溫度特性和測溫范圍,一個(gè)表格即可滿足應(yīng)用 代碼執(zhí)行速度可能會(huì)稍快,尤其在R-T表精度本身就滿足應(yīng)用的情況下 在要求限制代碼尺寸的應(yīng)用中可以節(jié)省成本 |
代碼編寫和調(diào)用較為方便 結(jié)果輸出直觀,計(jì)算結(jié)果基本可以直接作為最終輸出 |
| 劣勢 |
代碼編寫稍復(fù)雜 應(yīng)用前需要選擇溫度范圍和精度來建表 超出表之外的溫度無法提供 |
不同溫度范圍需要不同的參數(shù) 實(shí)際代碼相比之下稍長,在限制代碼尺寸的應(yīng)用中可能會(huì)增加成本 在要求運(yùn)行速度的應(yīng)用中可能略微慢 |
[源碼鏈接在我們網(wǎng)站的同名應(yīng)用文檔中]
總結(jié)
應(yīng)用的選擇考慮,總是成本和效能的博弈結(jié)果。窮則迂回穿插,達(dá)則全域轟炸。
關(guān)于NTC,我們在公司網(wǎng)站及公眾號還有其他相關(guān)的文檔可以參考。
-
傳感器
+關(guān)注
關(guān)注
2577文章
55401瀏覽量
793425 -
NTC
+關(guān)注
關(guān)注
7文章
520瀏覽量
54726 -
adc
+關(guān)注
關(guān)注
100文章
7937瀏覽量
556777 -
測溫
+關(guān)注
關(guān)注
1文章
277瀏覽量
33151
原文標(biāo)題:NTC測溫—查表計(jì)算vs公式計(jì)算
文章出處:【微信號:安費(fèi)諾傳感器學(xué)堂,微信公眾號:安費(fèi)諾傳感器學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
一種基于NTC的控溫電路及軟件實(shí)現(xiàn)
常見的NTC類型有哪些
求助,關(guān)于NTC查表法獲得溫度的問題
步進(jìn)電機(jī)S加減速算法與查表方式哪個(gè)更好?
計(jì)算機(jī)尋址方式解析
計(jì)算機(jī)取證工具及方式
方法二 NTC熱敏電阻轉(zhuǎn)換溫度的計(jì)算方式
關(guān)于無線電力測溫的方式有哪些?
NTC測溫方式之查表方式和公式計(jì)算方式
評論