軟件環境:CodeWarrior 11.1
硬件環境:NXP S9KEAZ64A
傳感器參數:NTC熱敏電阻(R25 = 50k,B25-50 3950)
寫在前面
最近做小項目需要用到NTC電阻,因此寫一個調試備忘錄記錄下。
什么是NTC電阻?
NTC熱敏電阻就是負溫度系數的電阻,當溫度升高時,電阻降低(反之則為PTC電阻)。NTC電阻靈敏度高,溫度分辨率高,但
是測量溫度范圍較窄,通常低於100攝氏度。
NTC電阻與溫度之間的關系
NTC熱敏電阻溫度和電阻關系最常見的公式就是如下圖基於參數“β”的指數公式,公式比較簡單,也是非常常用的公式。(其中的
β,有些資料也稱為B)

其中,

因此,如果知道了RT2 、T2和B的值,就可以計算出任意溫度下NTC熱敏電阻的阻值,或者計算出任意NTC熱敏電阻阻值對應的溫
度值。常規應用中,廠家一般會給出T=298.15k下的阻值和B值,不同型號的NTC熱敏電阻其參數也是不同。
NTC電阻的實際應用
在購買使用NTC電阻之前,我們需要先確認NTC電阻在25℃的阻值,然后設計溫度采樣電路。可以先和商家確認熱敏電阻的阻值表。
例如:下表部分阻值表的截圖,其中的R25=15KΩ就是熱敏電阻在25℃時候的阻值,B25/50就是25℃-50℃時候的B值。

因此如果我想檢測溫度的話,直接將檢測到的電阻值帶入上面的公式,就可以得到當前的溫度了。
當然,如果你檢測區間不在25℃-50℃,你也可以自己將阻值表里面的數據,帶入公式中,得出你目標區間的B值,進而在一定區間內比較精准的檢測溫度。
對於NTC熱敏電阻的檢測電路,直接使用最簡單的分壓電路就可以了。如下圖:

RT1阻值的計算方法為:R = (adc_value * 20 * 1.0 / (adc_all - adc_value)) ;
其中,adc_all 為你的ADC采樣精度,例如8位精度就是0xFF,adc_value為你的ADC實際采樣值,20為電路中的分壓電阻,20K。1.0是為了確保有小數結果。
所以最終的溫度為:
ADC_Channel_Vlaue = ADC_Read(ch); //Read ADC value from channel n R = (20 * ADC_Channel_Vlaue * 1.0 /(255 - ADC_Channel_Vlaue)); //8位精度 Temperature1_Value = 1/ (log( R / R25 ) / B + 1 / (273.15 + 25)); Temperature1_Value = Temperature1_Value - 273.15;
Temperature1_Value 為最終的溫度。
附上函數的全部代碼
float Temperature_Measurement(UINT8 ch)
{
UINT8 Temperature_Counter = 0;
UINT8 ADC_Channel_Vlaue = 0;
float Temperature1_Value;
float Temperature1_Sum_Value = 0;
float Temperature1_Average_Value = 0;
float R25 = 50;
float R = 0;
float B = 3950;
while(Temperature_Counter<100)
{
Temperature_Counter++;
ADC_Channel_Vlaue = ADC_Read(ch); //Read ADC value from channel n
R = (20 * ADC_Channel_Vlaue * 1.0 /(255 - ADC_Channel_Vlaue)); //
Temperature1_Value = 1/ (log( R / R25 ) / B + 1 / (273.15 + 25));
Temperature1_Value = Temperature1_Value - 273.15;
Temperature1_Sum_Value = Temperature1_Sum_Value + Temperature1_Value;
ADC_SC1 = 0 ;
}
Temperature1_Average_Value = Temperature1_Sum_Value / Temperature_Counter;
return (Temperature1_Average_Value);
}
