一、NTC測溫原理
NTC熱敏電阻測溫,本質是將溫度變化轉化為可測量的電阻變化,再通過電路和算法轉換為溫度讀數(shù)。
1. NTC的核心特性 - 負溫度系數(shù)
NTC由對溫度敏感的半導體金屬氧化物材料制成。其內部的導電機制是“躍遷”導電。當溫度升高時,材料中被束縛的電子獲得更多能量,更容易掙脫束縛成為自由電子參與導電,同時材料本身也會產生更多的電子-空穴對。這導致材料的導電能力急劇增強,電阻值(Rt)呈指數(shù)規(guī)律顯著下降。這種電阻隨溫度升高而減小的特性稱為負溫度系數(shù)(NTC)。
2. 電路實現(xiàn) - 分壓測量
為了測量NTC的電阻變化,最常用的方法是將其與一個精度和溫漂都很好的固定參考電阻(Rs)串聯(lián),接入穩(wěn)定的直流電壓源(Vcc),形成一個分壓器。NTC電阻(Rt)上的分壓(Vout)即為測量點電壓:Vout = Vcc * (Rt / (Rs + Rt))。
3. 信號采集 - ADC轉換
使用微控制器(MCU)或其他數(shù)據(jù)采集系統(tǒng)內置的模數(shù)轉換器(ADC) 通道,采集NTC兩端的電壓Vout。這個模擬電壓值被ADC轉換為數(shù)字量(ADC Code)。
4. 數(shù)學轉換 - 溫度計算
得到ADC值后,結合已知的Vcc、Rs和ADC的參考電壓/分辨率,可以計算出當前的Rt值。最關鍵的一步是將Rt值轉換為溫度值。 由于NTC的Rt-T關系是高度非線性的,不能簡單地用線性公式。通常采用精度較高的Steinhart-Hart方程:1/T = A + B * ln(Rt) + C * (ln(Rt))^3其中,T是絕對溫度(單位:開爾文K),A, B, C 是NTC元件特定的常數(shù)(可從廠家數(shù)據(jù)手冊獲取)。或者使用精度稍低但計算更簡單的B值方程(β值方程):1/T = 1/T0 + (1/B) * ln(Rt/R0)其中,T0是參考溫度(通常為25°C=298.15K),R0是NTC在T0溫度下的標稱電阻值,B是材料常數(shù)(B值)。MCU通過程序執(zhí)行這些數(shù)學計算,最終得到精確的溫度值(通常轉換為攝氏度℃)。
二、NTC溫度采集實現(xiàn)
1、理論計算
我選用了一個B值是3950,25℃下阻值為10KΩ,精度為1%的NTC電阻,來實現(xiàn)溫度采集。首先是電路設計,使用3.3V供電,考慮到我的主要應用場景就是測室溫,所以分壓電阻選擇10K,目的是為了讓常溫下的ADC阻值剛好落在整個測溫范圍的中間。C16用來濾除電源上過來的干擾。如下圖所示:
下圖是該NTC電阻所匹配的溫度阻值對照表,一般NTC廠家均可提供。
下圖是根據(jù)溫度阻值表中各個溫度值對應的實時阻值、串聯(lián)電阻的阻值、ADC滿量程的數(shù)字值,計算出來對應溫度值的ADC數(shù)值。
2、代碼實現(xiàn)
然后使用查表及二分法實現(xiàn)溫度采集后的計算,以下代碼經(jīng)過測試驗證。
/********************************************************************
* name: : TspBinaryTableSearch( uint16_t adc_val )
* description : Calculation of NTC temperature by binary table lookup method (二分法)
* Input : adc_val current adc value
* Output : uint16_t tempdat
* Return : None
********************************************************************/
static uint16_t TspBinaryTableSearch( uint16_t adc_val )
{
uint16_t start = 0U, end = 0U, mid = 0U,tempdat = 0U;
/* Get the arry length */
end = ( sizeof( NTC_adc_table )/ sizeof( NTC_adc_table[0] ) ) - 1U;
/* Data anomaly judgment */
if( adc_val <= TSP_SHORT_CIRCUIT_THRESHOLD )
{
return 1U;
}
else if( adc_val >= TSP_OPEN_CIRCUIT_THRESHOLD )
{
return 2U;
}
else if( adc_val > NTC_adc_table[0] )
{
return 3U;
}
else if( adc_val < NTC_adc_table[end - 1U] )
{
return 4U;
}
while ( start <= end )
{
/* Get the mid value */
mid = (start + end) >> 1;
/* Just find */
if( adc_val == NTC_adc_table[mid] )
{
break;
}
/* Right in between two temperature points */
if( ( adc_val < NTC_adc_table[mid] ) && ( adc_val > NTC_adc_table[mid+1U] ) )
{
break;
}
/* The current AD value less than the middle of the array indicates
/* the second half of the number to look for
*/
if( adc_val < NTC_adc_table[mid] )
{
start = mid + 1U;
}
/* The current AD value greater than the middle of the array indicates
* that the number to be found is in the first half
*/
else if( adc_val > NTC_adc_table[mid] )
{
end = mid - 1U;
}
}
tempdat = ( NTC_Temperature_table[mid] + (float)( NTC_adc_table[mid] - adc_val ) / (float)( NTC_adc_table[mid] - NTC_adc_table[mid+1] ) + 0.5)*10;
return tempdat;
}
以上就是今天的內容,書不盡言,難免有疏漏之處,還請多加斟酌,這里做個記錄。