关于NTC热敏电阻读取温度的问题
最近在做一个加热水的设备,用NTC热敏电阻感应水温,然后根据设定的温度作出相应的控制。由于之前一直用热电偶检
测温度,简单方便,可是其有一缺点就是短路后显示的是冷端的温度且没有反馈信号。可是NTC读取温度相对比较麻烦,除了
算出 0~100 摄氏度的电阻电压值,还要对每一次的温度值进行查表比较,效率很低。所以还请大伙不吝赐教,帮忙考虑一下
如何解决最简单,谢谢!
[解决办法]
最简便的办法就是查表,没有更好的办法,因为NTC是非线性器件,电阻与温度的关系不是线性的,很难去计算。
再一种办法是采用热电阻,如CU100,用电桥加运放后得到与温度成比例的电压值。
[解决办法]
一般的热电偶短路会导致温度急剧下降,你可以判断是否急剧下降,如果急剧下降,可发出报警
[解决办法]
用查表法效率还低,那你是不是觉得做浮点运算效率高,如果是这样的话做些实验导出这个电阻的非线性补偿公式,然后每次读得AD的值就做浮点运算算出温度值来。如果精度要求不高,可以不考虑非线性误差的话可以用简单的公式来算出温度,不用做浮点。
[解决办法]
将NTC两端留一定的电压用来判断是短路还是断路!查表挺好的!
以5V系统为例,ntc采用10K
使用一个10k的电阻对地下拉,
如果电压值为0,则为断路,如果为5V则为短路,正常工作时一般在0.5-4.8V之间!
[解决办法]
用铂电阻。。。
有PT100和PT1000两个标准
、、、、、、、、、、、、、
算出 0~100 摄氏度的电阻电压值,还要对每一次的温度值进行查表比较,效率很低。
查表这个是最快的了,如果再快点
你可以用EXCEL等软件算出对应的ADC值表
如果你能找到比这个更快的方法,我愿向大哥请教
求专利
[解决办法]
// 溫度表 -10 度到 105 度 const uint v_table[116]={ 895,932,969,1006,1045,1085,1125,1166,1208,1250, //-10 ---- -1 1294,1338,1382,1427,1473,1519,1566,1614,1661,1709,//0 ---- 9 1758,1807,1856,1905,1955,2004,2054,2104,2154,2204,//10 ---- 19 2253,2303,2353,2402,2451,2500,2549,2597,2645,2692,//20 ---- 29 2740,2786,2832,2878,2923,2968,3012,3056,3099,3141,//30 ---- 39 3183,3224,3265,3304,3344,3382,3420,3457,3493,3529,//40 ---- 49 3564,3599,3632,3665,3698,3729,3760,3791,3820,3849,//50 ---- 59 3878,3905,3932,3959,3985,4010,4034,4058,4082,4105,//60 ---- 69 4127,4149,4170,4191,4211,4231,4250,4269,4287,4304,//70 ---- 79 4322,4339,4355,4371,4387,4402,4417,4431,4445,4459,//80 ---- 89 4472,4485,4497,4510,4522,4533,4545,4556,4566,4577,//90 ---- 99 4587,4597,4607,4616,4625,4634};//100 ---- 105#pragma interrupt_handler adc_isr:iv_ADC void adc_isr(void) { uint temp; temp = ADCL; temp |= (int)ADCH<<8; temp = (49*temp)/10; v += temp; } void get_adc_value(uchar adc_pin) { uchar i; v = 0x0000; ADMUX = (1<<REFS0)|adc_pin; // for(i=0;i<2;i++) { // ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1); ADCSRA |= (1<<ADSC); delay_nms(1); // while((ADCSRA & (1<<ADIF))==0); ADCSRA &= ~(1<<ADSC); // ADCSRA &= ~(1<<ADIF); } // v = v/2; }uint get_degree(void) { uchar x,y; uint v_big,v_small,v_step; if (v<100) return 0x83E7; // 當沒有信號時顯示-99.9錯誤 for (x=0;x<115;x++) // 查表 { if (v_table[x] >= v) // 找出電壓區域 { v_big = v_table[x]; // 區域 高段 v_small = v_table[x-1]; //區域 低段 v_step = (v_big - v_small)/10; // 把區域細分成10份 for (y=0;y<10;y++) // 細分比較 { v_small += v_step; if (v < v_small) // 得出結果 { v = x*10+y;// 其中x*10 為整數部分, y 為小數部分 if (x<10) // 少於10時為負溫度 { v |= 0x8000; // 加入負號標記 } else { v -= 100; // 0 度修正 } return v; }; }; }; WDR(); } return v; }