首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]QG8+热敏电阻测环境温度的问题

[求助]QG8+热敏电阻测环境温度的问题

感谢版主昨天关于AD问题的解答!
现有关于QG8采用热敏电阻来测量环境温度的问题请教:
AD初始化为:
void InitADC(void){
ADCSC1 = 0x1F; //初始化时禁止ADC
ADCSC2 = 0x00;
ADCCFG = 0xF8;
APCTL1 = 0x04; //管脚选择:APCTL1_ADPC2
}

处理程序:
void Envir_temperature(void)
{
uint8_t T;
uint16_t Temp;

ADCSC1_ADCH = 0x02; //通道选择:AD2
while (!ADCSC1_COCO ) {};
Temp = ((uint16_t)ADCRH)<<8 | (uint16_t)ADCRL;
ADCSC1_ADCH = 0x1F;
// T = Tnormal*(1-Tnormal*(log(1024/Temp-1))/Br);
T = Br*Tnormal/(Br-Tnormal*log(1024/Temp-1));
T = T-273.15;
SendMsg(T); //把T打到串口
}
请问:
1.处理程序对吗?
3.最后打到串口的T是实际温度吗?

谢谢您了!
我爱单片机。
你先写入芯片,运行一下,看看结果如何。
海纳百川  有容乃大
串口打出的T为0x19,也就是25。
如果用手接触热敏电阻,没变化;如果用冰接触,则直接打出0xEF;如果用热水(饮用白开水)接触,则显示从0x19直接到0x2C、0x38,再到0x41。
不知为什么没有其他中间值?
我设定3秒钟采集一次,在本次采集完到下次采集时,会不会是温度已经变了的这个原因。
或者还有QG8本身采集一次所需的时间。
我爱单片机。
3秒采样一次是太慢了。
海纳百川  有容乃大
时间问题也是一个原因,另外问题的关键是为什么温度变化时总是这几个值?
比如每次温度升高时,都是从0x19上升到0x2C,为什么总是0x2C?哪怕出来一个0x2D或0x2A、0x2B什么的。
我爱单片机。
看看AD转换结果寄存器的值到底是多少。
海纳百川  有容乃大
AD转换寄存器的值会变,比如:0x1F0、0x1ED等,但计算结果均为T=0x19;
当温度变化较大时(热敏电阻与热水接触),AD转换寄存器的值变化较大,计算结果才会变为T=0x2C;
试验现象好像就是:对于公式:
T = Br*Tnormal/(Br-Tnormal*log(1024/Temp-1));
T = T-273.15;
当温度(AD转换寄存器的值)变化较大时,计算的结果才会变;
当温度(AD转换寄存器的值)变化不大时,计算的结果几乎不变;

这两天有事,不能继续该问题,等回来继续。
我爱单片机。
那么这个计算过程肯定有问题。
海纳百川  有容乃大
strongchen,您好!

公式:T = Br*Tnormal/(Br-Tnormal*log(1024/Temp-1));

又做了下面试验:
1.常温下,采样值ADRH ADRL=01 F4,即Temp=500,带入上述公式,手动计算得T=299.3559K,即26摄氏度;而MCU计算出来的值为19摄氏度;
2.用手接触热敏电阻,采样值ADRH ADRL=01 9A,即Temp=410,带入上述公式,手动计算得T=302.71169K,即35摄氏度;而MCU计算出来的值为19摄氏度;
所以,估计公式没问题,而是MCU对浮点数的计算有问题。
您有什么解决办法吗?
我爱单片机。
对于8位MCU来说,最好不要进行这么复杂的计算。用查表的方法即快捷又高效。
海纳百川  有容乃大
版主你好,初学单片机,我还没有用过查表方式的,查表的怎么搞啊,精确性是不是不高啊?
普普通通一个人
查表就是事先将转换结果计算好,然后保存在程序中。需要时直接查表即得到结果。一般用数组的方式。
海纳百川  有容乃大
用查表法,就可以了。
感谢帮忙!谢谢!
我爱单片机。
返回列表