打印

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

[复制链接]
4702|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,就会挨个找出来。

使用特权

评论回复
5
赤火隐士|  楼主 | 2011-4-12 15:32 | 只看该作者
4# mmax
谢谢,我的折半查表的方法是对的吗?

使用特权

评论回复
6
赤火隐士|  楼主 | 2011-4-12 15:45 | 只看该作者
5# 赤火隐士

我调试到 while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
就无法继续了,adc转换标志不为1啊,请您指点问题所在,谢谢!

使用特权

评论回复
7
赤火隐士|  楼主 | 2011-4-12 15:46 | 只看该作者
4# mmax


我调试到 while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
就无法继续了,adc转换标志不为1啊,请您指点问题所在,谢谢!

使用特权

评论回复
8
赤火隐士|  楼主 | 2011-4-12 15:48 | 只看该作者
各位编程高手,帮帮忙啊

使用特权

评论回复
9
mmax| | 2011-4-12 16:00 | 只看该作者
二分法查表,貌似是对的。

你可以先将AD的部分屏蔽掉。
程序直接给ADC_TEMP赋固定的值,看看你的查表代码如何。

使用特权

评论回复
10
赤火隐士|  楼主 | 2011-4-12 16:09 | 只看该作者
9# mmax

谢谢,我试试

使用特权

评论回复
11
赤火隐士|  楼主 | 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;

使用特权

评论回复
12
mmax| | 2011-4-12 18:49 | 只看该作者
大哥,unsigned char 在stc单片机里是8位,范围是0~256

你把NTCTAB定义换unsigned int 试试

使用特权

评论回复
13
赤火隐士|  楼主 | 2011-4-12 22:15 | 只看该作者
12# mmax

哈哈,粗心了,谢谢mmax,问题解决了。谢谢!!

使用特权

评论回复
14
赤火隐士|  楼主 | 2011-4-12 22:17 | 只看该作者
:)

使用特权

评论回复
15
FJIYU| | 2011-4-27 21:50 | 只看该作者
由于NTC的离散性较大,精度不高.互换性不好,正确的方法要进行标定.表格值不能解决全部问题.

使用特权

评论回复
16
lubyudf| | 2013-8-7 16:08 | 只看该作者
最近也搞这个.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

98

帖子

1

粉丝