文中我以MF58 玻壳测温型 NTC 热敏电阻器为例,测量范围为:-50度~250度; 因为项目原因,我的测温范围只需要从-20度~180度就可以了。
NTC 5K B值:3950
如果直接用拟合二次方程计算,就会有小数,乘法,除法,指数运算,对于单片机的话,就要花很多的时间去处理。 查表法则可以很好地提高处理效率。
电路非常简单,如果要实现多路温度检测,则单片机只需要增加多路模拟开关就好了。
根据对应型号的NTC的温度-阻表对照表(见本底)。 而我们只需要按每10度,取几个点。 我在程序中从-20度~180度,取了21个点。
再EXCEL里,拉个表,计算一下。 我使用的是MSP430F249,ADC为12位,满度为:4096
计算公式为:=ROUND(B2*1000/(B2*1000+10000)*4096,0)
然后转为16进制,不转也成,16进制看着舒服。
转换公式为:="0x"&DEC2HEX(C2)&","
实际取值为:-20度至180度。
然后我们在程序里建一个表。我不需要小数,所以直接将最终结果转换成了整数。如果你需要小数位,就把程序适当地改一下。
查表算法非常简单,根据当前ADC读到的值对表里查找接近值,取得整数部分, 然后再把相差的值,去和 前后范围做比例计算。 这样就得到了后面的小数部分。
如果你采用PTC,也是基本同样的思路。比如电机测量常用的KTY84-130。 有时间下次再也出个PTC的。
//----------------------------------------------------------------------------////-20 ~ 180,adc raw vaule R2/(R1+R2)*4096 | R1=10000(ohm) on board //MF58_B3950 1%#define INVALID_TEMP (int)32767#define MAX_NTC_TABLE_CT 21 const int Table_NTC[MAX_NTC_TABLE_CT]={//0xF21,0xE6D, 0xD52,0xBCF,0x9F7, 0x800,0x629,0x496,0x35A,0x26F, 0x1C5,0x14B,0x0F3,0x0B5,0x088, 0x068,0x050,0x03F,0x031,0x028, 0x020,0x01A,0x016, };//----------------------------------------------------------------------------//// MF58 B3950 1% Table_NTC//----------------------------------------------------------------------------//int Temp_Convert_NTC_By_Table(uint16 adc_raw_value){ int i,tmp=INVALID_TEMP; for(i=MAX_NTC_TABLE_CT-1;i>=0;i--) { if (adc_raw_value <= Table_NTC[i]) { tmp=i*10-20; //calculate decimal part if ((i>=0)&&(i<MAX_NTC_TABLE_CT-1)) { tmp=tmp+(int)(((float)(Table_NTC[i]-adc_raw_value)/(float)(Table_NTC[i]-Table_NTC[i+1]))*10.0+0.5); } break; } } return tmp;}