打印
[家电应用]

79F6488 AD通道切换后无AD结果的问题

[复制链接]
922|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gyd1126|  楼主 | 2017-4-24 23:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gyd1126 于 2017-4-24 23:53 编辑

  请教大神
       我现在用79F6488调一个项目,在AD这里遇到这样的问题。
   我打开了AD中断,如果一直检测固定的AD输入通道,则AD检测没问题,AD转换率也正确。但是我在AD中断里改变了AD检测通道的话,就不正常了,AD检测值为0,而且中断速率也完全不对,中断特别快。
   我的相关代码如下:

void ADC_init(void)
{
    REGCON = 0X03;          //3.3V VDDR
        //参考电压、输入通道
        ADCH = (3<<6);          //Vref = 0.4VDDR

        //根据ADC输入口配置相应IO
        ADCH |= BIT(4);          //P16 for AN3
        ADCH |= BIT(5);          //P10 for AVDD ref
        ADCH |= BIT(0);          //P11 P12

    //设置ADC时钟
        ADT =  0XF4;      //adcclk=1Mhz,转换率250hz
        ADCDS = 0X00;          //双极性输出

        ADCON = 0x00;          //内部基准电压
        PGAM = 0;
        ChangeAdcChanle(0);
        
        ADCON |= BIT(7);   //ADC EN
        ADC_IE(1);
}

u8 xdata g_AdcChsBuff[3]; //ADC输入通道及增益
#define ADC_INPUT(PGA_GAIN,INPUT_CHS)  (u8)((PGA_GAIN<<4)|INPUT_CHS)
g_AdcChsBuff[0] = ADC_INPUT(PGA_GAIN_1X,ADC_CHS_AN3);
g_AdcChsBuff[1] = ADC_INPUT(PGA_GAIN_1X,ADC_CHS_Vref_P);
g_AdcChsBuff[2] = ADC_INPUT(PGA_GAIN_32X,ADC_CHS_AIN0);

//切换AD通道
void ChangeAdcChanle(u8 chanle)
{
         u8 tmp;
         ADCON &= ~BIT(7);  //关AD
         tmp = PGAM & 0x0f;
         PGAM = (g_AdcChsBuff[chanle]&0xf0)|tmp;
         
         tmp = ADCON & 0xf0;
         ADCON = (g_AdcChsBuff[chanle]&0x0f) | tmp;
         ADCON |= BIT(7);   //启动转换
}

//AD中断
void ADC_ISR(void) interrupt ADC_INT
{
        if(ADCON&BIT(6))
        {
            ADCON &= ~BIT(6);  //ADCIF
                //adc_value = ADDL;         //
                ((u8 *)&adc_value)[0] = ADDH;
                ((u8 *)&adc_value)[1] = ADDM;
               
                if(adcChsIndex >=3)
                        adcChsIndex =0;
                                                                                                                                       
                g_ADC_res[adcChsIndex] = adc_value;

                if(++adcChsIndex >= 3)
                        adcChsIndex = 0;
                ChangeAdcChanle(adcChsIndex);
                ADCIsrCnt++;               
        }
}

如果在切换AD通道是去掉 ADCON &= ~BIT(7);  //关AD  这一句,则中断速率正常,而且有AD值,但是AD值不正确,通道间相互干扰。如果在AD中断里不改变通道,但每次中断后都先关AD,再使能AD,也会出现同样的问题。所以问题可能就出在关AD上,但是不关AD,转换值
也不对啊。

请教一下,有没有人有这方面经验呀?现在不知道怎么处理了,又必须要同时检测2个通道以上。


好尴尬,刚发帖出来,然后又有点思路试了一下,然后问题解决了。都怪中颖的datasheet上没有写清楚。
      首次使能AD后,AD中断转换值是不准的,但是4次转换后就基本准确了,所以切换通道必须等4次转换后取值。
结贴。
沙发
黑夜之狼| | 2017-4-25 10:19 | 只看该作者
使能AD后最好不要马上转换数据,可以考虑稍加delay

使用特权

评论回复
板凳
gyd1126|  楼主 | 2017-5-5 22:58 | 只看该作者
黑夜之狼 发表于 2017-4-25 10:19
使能AD后最好不要马上转换数据,可以考虑稍加delay

在中断里切换的,没法delay

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝