打印
[其它应用]

AD这里遇到这样的问题

[复制链接]
491|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanghuac|  楼主 | 2020-3-8 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

使用特权

评论回复
沙发
bqyj| | 2020-3-8 16:59 | 只看该作者


楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
huanghuac|  楼主 | 2020-3-8 17:02 | 只看该作者
相关代码如下:

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++;               
        }
}

使用特权

评论回复
地板
huanghuac|  楼主 | 2020-3-8 17:11 | 只看该作者
如果在切换AD通道是去掉 ADCON &= ~BIT(7);  //关AD  这一句,则中断速率正常,而且有AD值,但是AD值不正确,通道间相互干扰。如果在AD中断里不改变通道,但每次中断后都先关AD,再使能AD,也会出现同样的问题。所以问题可能就出在关AD上,但是不关AD,转换值
也不对啊。

使用特权

评论回复
5
wenfen| | 2020-3-8 17:14 | 只看该作者
必须要同时检测2个通道以上?

使用特权

评论回复
6
songqian17| | 2020-3-8 17:18 | 只看该作者
首次使能AD后,AD中断转换值是不准的

使用特权

评论回复
7
chenho| | 2020-3-8 17:21 | 只看该作者
使能AD后最好不要马上转换数据,可以考虑稍加delay

使用特权

评论回复
8
huanghuac|  楼主 | 2020-3-8 17:24 | 只看该作者
在中断里切换的,没法delay

使用特权

评论回复
9
huanghuac|  楼主 | 2020-3-8 17:30 | 只看该作者
唉,还是没有什么结果,算了,先结贴吧,多谢大家啦

使用特权

评论回复
10
eanry| | 2020-3-12 14:21 | 只看该作者
    ADCON &= ~BIT(7);  //关AD
这句会不会有问题? 从C的语法上感觉出错了.

使用特权

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

本版积分规则

772

主题

8473

帖子

6

粉丝