打印
[技术问答]

请问N76E003如何实现多通道采集ADC

[复制链接]
4688|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
飘雪殇|  楼主 | 2018-6-1 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned int ADC_CollectionWait(unsigned char Channel)
{
        UINT16 ADC_Value = 0;
       
        ADCCON0 &= 0xF0;
       
        if (Channel == 0x05)
        {
                Enable_ADC_AIN5;
        }
        else if (Channel == 0x06)
        {
                Enable_ADC_AIN6;
        }

        clr_ADCF;
        set_ADCS;                                                                        // ADC start trig signal
        while(ADCF == 0);
        ADC_Value = (ADCRH << 4) + ADCRL;
       
        ADC_Value = ADC_Value / 4;

        return ADC_Value;
}

请问问题出在哪里啊?当通道六的AD值比较小(小于90)的时候,就会出现AD值不准确(有时AD值会变为65535),求大神来帮看下
沙发
gx_huang| | 2018-6-1 16:45 | 只看该作者
(ADCRH << 4)肯定有问题,这是8bit变量,又不是16bit的

使用特权

评论回复
板凳
yjgna| | 2018-6-1 16:49 | 只看该作者
ADC_Value= ADCRH;
    ADC_Value= auValue << 4;
    ADC_Value+= ADCRL;

使用特权

评论回复
地板
飘雪殇|  楼主 | 2018-6-1 19:29 | 只看该作者

谢谢 但是不是这个问题 已经找到原因了

使用特权

评论回复
5
xinxianshi| | 2018-6-1 21:03 | 只看该作者
什么原因,硬件问题?

使用特权

评论回复
6
tianxj01| | 2018-6-2 09:42 | 只看该作者
都搞错003的ADC结果寄存器用法了,003的结果寄存器,ADCRH是全8位有效,ADCRL是高4位有效。
因此,读取时候,
ADC_Value= ADCRH<< 4;
ADC_Value+=ADCRL>>4;
这个是12位有效的用法。
ADC_Value= ADCRH<<2;
ADC_Value+=ADCRL>>6;
这个是10位有效的用法。
ADC_Value= ADCRH;
这个是8位有效的用法。

使用特权

评论回复
7
飘雪殇|  楼主 | 2018-6-2 10:53 | 只看该作者
xinxianshi 发表于 2018-6-1 21:03
什么原因,硬件问题?

我把AD值放进一个数组里面的 数组的地址有问题

使用特权

评论回复
8
dongnanxibei| | 2018-6-2 13:09 | 只看该作者
飘雪殇 发表于 2018-6-2 10:53
我把AD值放进一个数组里面的 数组的地址有问题


这样啊,下次我也要试试看。

使用特权

评论回复
9
小明的同学| | 2018-6-3 13:55 | 只看该作者
直接读出来肯定没问题的。

使用特权

评论回复
10
小灵通2018| | 2018-6-3 18:34 | 只看该作者
多谢楼主分享自己的经验。

使用特权

评论回复
11
IoTCatcher| | 2018-6-6 16:58 | 只看该作者
tianxj01 发表于 2018-6-2 09:42
都搞错003的ADC结果寄存器用法了,003的结果寄存器,ADCRH是全8位有效,ADCRL是高4位有效。
因此,读取时候 ...


你确定是这样的吗?

使用特权

评论回复
12
tianxj01| | 2018-6-7 18:16 | 只看该作者
IoTCatcher 发表于 2018-6-6 16:58
你确定是这样的吗?

我都用在机器上了,你说有问题么?10 11 12 3种情况都有。

使用特权

评论回复
13
IoTCatcher| | 2018-6-8 10:30 | 只看该作者
tianxj01 发表于 2018-6-7 18:16
我都用在机器上了,你说有问题么?10 11 12 3种情况都有。

ADCRL – ADC Result Low Byte
7 6 5  4 3 2 1 0
- - - -  ADCR[3:0]
- - - -  R
Address: C2H Reset value: 0000 0000b

以上复制自手册,这样看你原来说的"ADCRL是高四位有效"就是错误的,并且你"ADC_Value += ADCRL>>4"这个操作,因为右移高位补0,所以你的结果是对的.但是从严谨的角度来说,你这个右移四位是因为你误解了ADCRL,就算你"ADC_Value += ADCRL>>1",你得到的结果也会是正确的,只是,这刚好是碰巧,而不是理解.

使用特权

评论回复
14
tianxj01| | 2018-6-8 11:59 | 只看该作者
IoTCatcher 发表于 2018-6-8 10:30
ADCRL – ADC Result Low Byte
7 6 5  4 3 2 1 0
- - - -  ADCR[3:0]

高8位是对的,但是低4位我还真是看错了,低4位是右对齐,
这样我处理的结果,以12位来说,其实对整个量程来说,有效的高8位是正确的,但是低4位实际上等于丢掉了,虽然没影响最后等效量程,但是低4位有效数字都变0了。
所以程序正常运行是没错,但是实际上细化分辨率就有问题了。

使用特权

评论回复
评论
david-lau 2019-1-21 11:42 回复TA
可以转换成汇编指令看下是否真的会有问题 
15
xinxianshi| | 2018-6-9 17:17 | 只看该作者
硬件搞对,软件上划分清楚,一般就没啥问题

使用特权

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

本版积分规则

5

主题

20

帖子

1

粉丝