各位高手,帮忙看看:ntc测温,查表法出问题

[复制链接]
5748|15
 楼主| 赤火隐士 发表于 2011-4-11 23:13 | 显示全部楼层 |阅读模式
ntc热敏电阻测温,用折半查表法,单片机是stc12c5410ad带10位ad,表的数据ntctab[]=1024*Rm/(Rm+Rntc),显示的结果为00,请各位高手帮帮忙!!程序如下:

void NTCADC(void)
{
WORD ADC_TEMP = 0;//转换后的数据
BYTE i,M= 0,CHBSTART=0,CHBEND=99;//用于折半查表,0-99摄氏度
//主程序中已经打开了adc电源
ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START;
    _nop_();                        
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
ADC_TEMP = ((ADC_DATA<<2)|(ADC_LOW2&0x03));

for(i=0;i<7;i++)     //搜索全表
{
  M=CHBSTART+(BYTE)(CHBEND-CHBSTART)/2;
  if(NTCTAB[M]<ADC_TEMP) CHBSTART = M;
  else if(NTCTAB[M]>ADC_TEMP) CHBEND = M;
  else     //查到相等的节点
   DISDGUF[4] = M/10;
   DISDGUF[5] = M%10;
}
}
 楼主| 赤火隐士 发表于 2011-4-12 06:17 | 显示全部楼层
各位大虾,帮帮小弟啊!
 楼主| 赤火隐士 发表于 2011-4-12 06:21 | 显示全部楼层
还有个问题,ntctab[]=1024*V输入/V参考,V输入=V参考*Rm/(Rm+Rntc),这样ntctab[]=1024*Rm/(Rm+Rntc),不是与参考电压无关??不知小弟理解是否正确
mmax 发表于 2011-4-12 07:11 | 显示全部楼层
仔细看了你的代码,问题很多。
很中肯的建议是:你自己一步一步的debug,就会挨个找出来。
 楼主| 赤火隐士 发表于 2011-4-12 15:32 | 显示全部楼层
4# mmax
谢谢,我的折半查表的方法是对的吗?
 楼主| 赤火隐士 发表于 2011-4-12 15:45 | 显示全部楼层
5# 赤火隐士

我调试到 while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
就无法继续了,adc转换标志不为1啊,请您指点问题所在,谢谢!
 楼主| 赤火隐士 发表于 2011-4-12 15:46 | 显示全部楼层
4# mmax


我调试到 while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
就无法继续了,adc转换标志不为1啊,请您指点问题所在,谢谢!
 楼主| 赤火隐士 发表于 2011-4-12 15:48 | 显示全部楼层
各位编程高手,帮帮忙啊
mmax 发表于 2011-4-12 16:00 | 显示全部楼层
二分法查表,貌似是对的。

你可以先将AD的部分屏蔽掉。
程序直接给ADC_TEMP赋固定的值,看看你的查表代码如何。
 楼主| 赤火隐士 发表于 2011-4-12 16:09 | 显示全部楼层
9# mmax

谢谢,我试试
 楼主| 赤火隐士 发表于 2011-4-12 17:09 | 显示全部楼层
9# mmax
谢谢,循环里面的判断总是NTCTAB[M]<ADC_TEMP ,当NTCTAB[M]>ADC_TEMP也是执行if(NTCTAB[M]<ADC_TEMP) CHBSTART=M;
找不出原因,糊涂中。。。
code unsigned char NTCTAB[100] = {
   150,156,163,169,176,183,190,198,216,214,//0-9
   222,231,240,249,258,268,277,287,297,307,//10-19
   317,327,337,347,357,368,378,388,398,408,//20-29
   418,429,439,450,460,471,482,493,505,516,//30-39
   526,537,548,558,568,577,586,596,605,615,//40-49
   624,633,642,652,660,669,678,686,695,703,//50-59
   711,718,726,734,741,749,756,764,771,778,//60-69
   784,791,797,803,809,814,819,824,829,833,//70-79
   838,843,847,852,856,860,865,869,873,877,//80-89
   882,885,888,891,894,898,901,905,908,911 //90-99
};//5.6k


//    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
//   ADC_CONTR &= ~ADC_FLAG;         //Close ADC
// ADC_TEMP = ((ADC_DATA<<2)|(ADC_LOW2&0x03));
   ADC_TEMP=901;
for(i=0;i<7;i++)     //搜索全表
{
  M=CHBSTART+(BYTE)(CHBEND-CHBSTART)/2;
  if(NTCTAB[M]<ADC_TEMP) CHBSTART=M;
  else if(NTCTAB[M]>ADC_TEMP) CHBEND=M;
  else     //查到相等的节点
   CONTER3=M;
  
}
   DISDGUF[4]=CONTER3/10;
   DISDGUF[5]=CONTER3%10;
mmax 发表于 2011-4-12 18:49 | 显示全部楼层
大哥,unsigned char 在stc单片机里是8位,范围是0~256

你把NTCTAB定义换unsigned int 试试
 楼主| 赤火隐士 发表于 2011-4-12 22:15 | 显示全部楼层
12# mmax

哈哈,粗心了,谢谢mmax,问题解决了。谢谢!!
 楼主| 赤火隐士 发表于 2011-4-12 22:17 | 显示全部楼层
FJIYU 发表于 2011-4-27 21:50 | 显示全部楼层
由于NTC的离散性较大,精度不高.互换性不好,正确的方法要进行标定.表格值不能解决全部问题.
lubyudf 发表于 2013-8-7 16:08 | 显示全部楼层
最近也搞这个.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

98

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部