当前位置: 代码迷 >> 单片机 >> 关于NTC热敏电阻读取温度的有关问题
  详细解决方案

关于NTC热敏电阻读取温度的有关问题

热度:75   发布时间:2016-04-28 16:12:52.0
关于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值表

如果你能找到比这个更快的方法,我愿向大哥请教

求专利
------解决方案--------------------
探讨
……
算出 0~100 摄氏度的电阻电压值,还要对每一次的温度值进行查表比较,效率很低。
……

------解决方案--------------------
对了,又想到一个更快的

当然,还是空间换时间

LZ用多少位的ADC?

你就建立这个字长的满表

然后,ADC值作为下标,直接索引数组

这样,无需任何比较,直接取得温度值

不知道还有更快的不?

PS:LS,那句话是LZ说的。谢谢
------解决方案--------------------
我最近也做NTC热敏电阻测温度,我感觉查表挺快的,在肉眼看来和其他的没什么区别,如果你不是要求很高速的反馈温度就没有必要选其他的方法了,但是如果有我也希望学习学习。还有我想楼主一定有NTC热敏电阻的真值表吧可否借兄弟参考一下啊,[email protected]!!!
------解决方案--------------------
那个计算软件可不可以给我一个?[email protected] 谢谢!
我现在使用的就是查表,很快的。
C/C++ code
// 溫度表 -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;     }
  相关解决方案