[技术问答] 请问N76E003如何实现多通道采集ADC

[复制链接]
 楼主| 飘雪殇 发表于 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 | 显示全部楼层

谢谢 但是不是这个问题 已经找到原因了
xinxianshi 发表于 2018-6-1 21:03 | 显示全部楼层
什么原因,硬件问题?
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位有效的用法。
 楼主| 飘雪殇 发表于 2018-6-2 10:53 | 显示全部楼层
xinxianshi 发表于 2018-6-1 21:03
什么原因,硬件问题?

我把AD值放进一个数组里面的 数组的地址有问题
dongnanxibei 发表于 2018-6-2 13:09 | 显示全部楼层
飘雪殇 发表于 2018-6-2 10:53
我把AD值放进一个数组里面的 数组的地址有问题


这样啊,下次我也要试试看。
小明的同学 发表于 2018-6-3 13:55 | 显示全部楼层
直接读出来肯定没问题的。
小灵通2018 发表于 2018-6-3 18:34 | 显示全部楼层
多谢楼主分享自己的经验。
IoTCatcher 发表于 2018-6-6 16:58 | 显示全部楼层
tianxj01 发表于 2018-6-2 09:42
都搞错003的ADC结果寄存器用法了,003的结果寄存器,ADCRH是全8位有效,ADCRL是高4位有效。
因此,读取时候 ...


你确定是这样的吗?
tianxj01 发表于 2018-6-7 18:16 | 显示全部楼层
IoTCatcher 发表于 2018-6-6 16:58
你确定是这样的吗?

我都用在机器上了,你说有问题么?10 11 12 3种情况都有。
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",你得到的结果也会是正确的,只是,这刚好是碰巧,而不是理解.
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了。
所以程序正常运行是没错,但是实际上细化分辨率就有问题了。

评论

可以转换成汇编指令看下是否真的会有问题  发表于 2019-1-21 11:42
xinxianshi 发表于 2018-6-9 17:17 | 显示全部楼层
硬件搞对,软件上划分清楚,一般就没啥问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

1

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