打印
[技术问答]

N76E003采集热敏电阻AD值超出4095,如何处理

[复制链接]
4037|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aa911|  楼主 | 2019-2-17 14:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 aa911 于 2019-2-17 22:37 编辑

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

void ntc_ADC()
{

        P12 = 0;


        Enable_ADC_AIN0;                //PIN14
   Timer0_Delay1ms(100);
   data1 = GetResult();         
   Timer0_Delay1ms(100);
   data1 = GetResult();         

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

QQ截图20190130180347.png.thumb.jpg (18.68 KB )

QQ截图20190130180347.png.thumb.jpg
沙发
二九结狐六体| | 2019-2-17 14:46 | 只看该作者
我来看看吧~~~

使用特权

评论回复
板凳
zhuomuniao110| | 2019-2-17 20:51 | 只看该作者
怎么可能超过呢?那个怎么变化也不会超过VCC吧

使用特权

评论回复
地板
zhuomuniao110| | 2019-2-17 20:57 | 只看该作者
一般上拉电阻等于光敏电阻变化的中间值。

使用特权

评论回复
5
小灵通2018| | 2019-2-17 22:22 | 只看该作者
啥意思,满量程不是4095吗

使用特权

评论回复
6
小灵通2018| | 2019-2-17 22:25 | 只看该作者
转换结果存放在ADCRH (高8位) 及ADCRL (低4位)中。
然而你的是
ADCtemp=((temp_H<<4)|(temp_L&0x0F));

使用特权

评论回复
7
小灵通2018| | 2019-2-17 22:26 | 只看该作者
我怎么看怎么不对,高八位你左移4位不就是丢弃了,这样不就数据不对了。

使用特权

评论回复
8
小灵通2018| | 2019-2-17 22:28 | 只看该作者


你这里直接输出原始测量数据看看对不对,如果对,就是你数据类型和处理过程搞错了

使用特权

评论回复
9
小灵通2018| | 2019-2-17 22:29 | 只看该作者
没有看到你的全部代码不清楚你的处理过程是不是有问题。

使用特权

评论回复
10
aa911|  楼主 | 2019-2-17 22:32 | 只看该作者
小灵通2018 发表于 2019-2-17 22:26
我怎么看怎么不对,高八位你左移4位不就是丢弃了,这样不就数据不对了。

temp_H定义为16位的了。我说的不清楚,打印出来的AD值几乎都是4095,而且我用热源靠近热敏电阻AD值也没有变化。

使用特权

评论回复
11
aa911|  楼主 | 2019-2-17 22:33 | 只看该作者
zhuomuniao110 发表于 2019-2-17 20:57
一般上拉电阻等于光敏电阻变化的中间值。

没有超过,是我没有表述清楚。串口打印出来的数据几乎都是4095.

使用特权

评论回复
12
小灵通2018| | 2019-2-17 22:33 | 只看该作者
你这样,你把热敏电阻替换成普通电阻或者可变电阻试试,先确保是芯片或者程序问题。

使用特权

评论回复
13
小灵通2018| | 2019-2-17 22:35 | 只看该作者
就是先确保你的热敏电阻是正常工作的。你先用电阻串联测ADC检测。
如果不行,确认是程序问题,这段代码换成官方例子里的。再测试

使用特权

评论回复
14
aa911|  楼主 | 2019-2-17 22:40 | 只看该作者
小灵通2018 发表于 2019-2-17 22:29
没有看到你的全部代码不清楚你的处理过程是不是有问题。

这就是全部代码了, 我只在main函数调用 ntc_ADC()

使用特权

评论回复
15
aa911|  楼主 | 2019-2-17 22:41 | 只看该作者
小灵通2018 发表于 2019-2-17 22:29
没有看到你的全部代码不清楚你的处理过程是不是有问题。

这就是全部代码了, 我只在main函数调用 ntc_ADC()

使用特权

评论回复
16
aa911|  楼主 | 2019-2-17 22:41 | 只看该作者
小灵通2018 发表于 2019-2-17 22:33
你这样,你把热敏电阻替换成普通电阻或者可变电阻试试,先确保是芯片或者程序问题。 ...

好的,我先这样试试,谢谢你朋友

使用特权

评论回复
17
小灵通2018| | 2019-2-17 22:52 | 只看该作者
en ,不客气,你先试试电阻,用万用表测也行,先确认外部电路是没毛病的,目前你的情况好像这个热敏好像断路一样。。

使用特权

评论回复
18
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组成一个字节,不知道你要干什么。

使用特权

评论回复
19
aa911|  楼主 | 2019-2-18 10:22 | 只看该作者
gnaijnaoul 发表于 2019-2-18 08:29
完全还没有工程师的排查故障的思维。
分解为多个可以分别检查的阶段,理论计算->实际测试对比->不符合理论 ...

1、我用万用表测热敏电阻两端没有电压显示。正在检查电路。
2、ADCtemp=((temp_H<<4)|(temp_L&0x0F));这句是把AD结果转成十进制。
谢谢您给的思路,希望以后能多和您讨论

使用特权

评论回复
20
gxs64| | 2019-2-18 10:30 | 只看该作者
ad口是要设置的,否则为io口

使用特权

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

本版积分规则

13

主题

69

帖子

0

粉丝