NTC負溫度係數的熱敏電阻——通過ADC檢測計算出相應溫度值
NTC作為一種負溫度係數熱敏電阻,其阻值隨溫度升高而降低。利用熱敏電阻的特性可以做溫度感測器檢測溫度應用在微控制器中。下面簡單介紹下,在微控制器中AD檢測熱敏電阻電壓值,然後轉換成電阻值,求出當前的實際溫度。
一、熱敏電阻公式
NTC 熱敏電阻溫度計算公式:Rt = R *EXP(B*(1/T1-1/T2))
其中,T1和T2指的是K度,即開爾文溫度。
Rt 是熱敏電阻在T1溫度下的阻值。
R是熱敏電阻在T2常溫下的標稱阻值。100K的熱敏電阻25℃的值為100K(即R=100K)。T2=(273.15+25)
EXP是e的n次方
B值是熱敏電阻的重要引數
通過轉換可以得到溫度T1與電阻Rt的關係T1=1/(ln(Rt/R)/B+1/T2) (所以對應只有一個Rt未知數即可求出T1實時溫度)
對應的攝氏溫度t=T1-273.15,同時+0.5的誤差矯正。
二、硬體連線方式
微控制器通過ADC檢測熱敏電阻電壓值,或者相關分壓值。一般在熱敏電阻上串聯與Rt阻值相同的分壓電阻。因為計算T1公式中需要知道Rt/R的比值關係,所以在這樣的串聯分壓電路時電阻比值即等於電壓比值,不需要將測得電壓值再換算成電阻值。具體電路圖如下:
圖中的檢測電壓是測分壓電阻R3的,一般來說直接測RTC更為直觀。R2由於微控制器IO的高阻態等設定,R2上相當於開路,所以測得電壓可以當作為R3上的電壓。
三、程式實現
ADC獲取過程就不再贅述了,相關程式可以在前一篇部落格中檢視,我這邊直接將獲取了相應溫度後如何處理程式展示下:
uint16_t TempValue_Calculate( float TempADCValue )
{
float TempValue = 0;
float res_proportion = (vdd_value-TempADCValue)/TempADCValue;
//電阻比值相當於電壓比值,根據電路圖計算,
TempValue = 1.0/( (log(res_proportion))/3950.0 + 1.0/(273.15+25.0) ) - 273.15;
//JlinkPrintf("current temp is %.2f\r\n,", TempValue);
return (uint16_t)TempValue;
} // vdd_value為內部電壓值,TempADCValue為對應AD檢測的電壓值(在這邊是電路圖中的R3電壓)
補充下知識點:
數學中的公式和c語言中有小小的區別。
1、數學中
log是對數符號,右邊寫真數和底數(上面是真數,下面是底數)
lg是以10為底數(例lg100=2)(lg為常用對數)
ln是以e為底數(lne2=2)(ln為自然對數 e=2.7182818284590452353602874713527...)
2、c語言中
c語言裡面只有兩個函式log和log10
其中
函式 log(x) 表示是以e為底的自然對數,即 ln(x)
函式 log10(x) 以10為底的對數,即 lg(x)
以其它數為底的對數用換底公式來表示
函式如下:
double logab(double a,double b)
{
return log(b)/log(a);
}