[技术问答] N76E003采集热敏电阻AD值超出4095,如何处理

[复制链接]
4576|24
 楼主| aa911 发表于 2019-2-17 14:11 | 显示全部楼层 |阅读模式
本帖最后由 aa911 于 2019-2-17 22:37 编辑

N76E003采集热敏电阻AD值超出4095,如何处理.热敏电阻阻值10K,分压电阻1K。
  1. unsigned long GetResult(void)
  2. {
  3.         clr_ADCF;
  4.         set_ADCS;
  5.         while(ADCF == 0);
  6.         temp_H=ADCRH;
  7.         temp_L=ADCRL;
  8.         ADCtemp=((temp_H<<4)|(temp_L&0x0F));
  9.         return ADCtemp;
  10. }

  11. void ntc_ADC()
  12. {

  13.         P12 = 0;


  14.         Enable_ADC_AIN0;                //PIN14
  15.    Timer0_Delay1ms(100);
  16.    data1 = GetResult();         
  17.    Timer0_Delay1ms(100);
  18.    data1 = GetResult();         

  19.    printf ("\n ntc = %d", data1);

QQ截图20190130180347.png.thumb.jpg
二九结狐六体 发表于 2019-2-17 14:46 | 显示全部楼层
我来看看吧~~~
zhuomuniao110 发表于 2019-2-17 20:51 | 显示全部楼层
怎么可能超过呢?那个怎么变化也不会超过VCC吧
zhuomuniao110 发表于 2019-2-17 20:57 | 显示全部楼层
一般上拉电阻等于光敏电阻变化的中间值。
小灵通2018 发表于 2019-2-17 22:22 | 显示全部楼层
啥意思,满量程不是4095吗
小灵通2018 发表于 2019-2-17 22:25 | 显示全部楼层
转换结果存放在ADCRH (高8位) 及ADCRL (低4位)中。
然而你的是
ADCtemp=((temp_H<<4)|(temp_L&0x0F));
小灵通2018 发表于 2019-2-17 22:26 | 显示全部楼层
我怎么看怎么不对,高八位你左移4位不就是丢弃了,这样不就数据不对了。
小灵通2018 发表于 2019-2-17 22:28 | 显示全部楼层


你这里直接输出原始测量数据看看对不对,如果对,就是你数据类型和处理过程搞错了
小灵通2018 发表于 2019-2-17 22:29 | 显示全部楼层
没有看到你的全部代码不清楚你的处理过程是不是有问题。
 楼主| aa911 发表于 2019-2-17 22:32 | 显示全部楼层
小灵通2018 发表于 2019-2-17 22:26
我怎么看怎么不对,高八位你左移4位不就是丢弃了,这样不就数据不对了。

temp_H定义为16位的了。我说的不清楚,打印出来的AD值几乎都是4095,而且我用热源靠近热敏电阻AD值也没有变化。
 楼主| aa911 发表于 2019-2-17 22:33 | 显示全部楼层
zhuomuniao110 发表于 2019-2-17 20:57
一般上拉电阻等于光敏电阻变化的中间值。

没有超过,是我没有表述清楚。串口打印出来的数据几乎都是4095.
小灵通2018 发表于 2019-2-17 22:33 | 显示全部楼层
你这样,你把热敏电阻替换成普通电阻或者可变电阻试试,先确保是芯片或者程序问题。
小灵通2018 发表于 2019-2-17 22:35 | 显示全部楼层
就是先确保你的热敏电阻是正常工作的。你先用电阻串联测ADC检测。
如果不行,确认是程序问题,这段代码换成官方例子里的。再测试
 楼主| aa911 发表于 2019-2-17 22:40 | 显示全部楼层
小灵通2018 发表于 2019-2-17 22:29
没有看到你的全部代码不清楚你的处理过程是不是有问题。

这就是全部代码了, 我只在main函数调用 ntc_ADC()
 楼主| aa911 发表于 2019-2-17 22:41 | 显示全部楼层
小灵通2018 发表于 2019-2-17 22:29
没有看到你的全部代码不清楚你的处理过程是不是有问题。

这就是全部代码了, 我只在main函数调用 ntc_ADC()
 楼主| aa911 发表于 2019-2-17 22:41 | 显示全部楼层
小灵通2018 发表于 2019-2-17 22:33
你这样,你把热敏电阻替换成普通电阻或者可变电阻试试,先确保是芯片或者程序问题。 ...

好的,我先这样试试,谢谢你朋友
小灵通2018 发表于 2019-2-17 22:52 | 显示全部楼层
en ,不客气,你先试试电阻,用万用表测也行,先确认外部电路是没毛病的,目前你的情况好像这个热敏好像断路一样。。
gnaijnaoul 发表于 2019-2-18 08:29 | 显示全部楼层
完全还没有工程师的排查故障的思维。
分解为多个可以分别检查的阶段,理论计算->实际测试对比->不符合理论的地方找出原因->理论计算->实际测试对比
1.硬件的正确性检查:假设环境温度25度,Vcc=3.3V,R7=10k,Uadc0=3.0V。万用表检查此处电压是否符合计算,符合计算值再检查软件。
2.Uadc0=3.0V,理论上AD转换值为3.0/3.3*4096=3723,在MCU调试器里查看ADCRH和ADCRL组成的值再此值附近就说明AD转换OK。
3.在程序ADCtemp=((temp_H<<4)|(temp_L&0x0F));设个断点,在MCU调试器里单步运行查看ADCtemp结果是否符合你的理论计算。
你这个AD转换值的处理是取b8~b12bit和b0~b3bit组成一个字节,不知道你要干什么。
 楼主| aa911 发表于 2019-2-18 10:22 | 显示全部楼层
gnaijnaoul 发表于 2019-2-18 08:29
完全还没有工程师的排查故障的思维。
分解为多个可以分别检查的阶段,理论计算->实际测试对比->不符合理论 ...

1、我用万用表测热敏电阻两端没有电压显示。正在检查电路。
2、ADCtemp=((temp_H<<4)|(temp_L&0x0F));这句是把AD结果转成十进制。
谢谢您给的思路,希望以后能多和您讨论
gxs64 发表于 2019-2-18 10:30 | 显示全部楼层
ad口是要设置的,否则为io口
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

69

帖子

0

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