[其它应用] AD这里遇到这样的问题

[复制链接]
1901|16
 楼主| huanghuac 发表于 2023-1-7 10:01 | 显示全部楼层 |阅读模式
我现在用79F6488调一个项目,在AD这里遇到这样的问题。   我打开了AD中断,如果一直检测固定的AD输入通道,则AD检测没问题,AD转换率也正确。但是我在AD中断里改变了AD检测通道的话,就不正常了,AD检测值为0,而且中断速率也完全不对,中断特别快。
 楼主| huanghuac 发表于 2023-1-7 10:09 | 显示全部楼层
相关代码如下:

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 发表于 2023-1-7 10:10 | 显示全部楼层
如果在切换AD通道是去掉 ADCON &= ~BIT(7);  //关AD  这一句,则中断速率正常,而且有AD值,但是AD值不正确,通道间相互干扰。如果在AD中断里不改变通道,但每次中断后都先关AD,再使能AD,也会出现同样的问题。所以问题可能就出在关AD上,但是不关AD,转换值
也不对啊。
zhanghqi 发表于 2023-1-7 10:17 | 显示全部楼层

必须要同时检测2个通道以上?
juventus9554 发表于 2023-1-7 10:20 | 显示全部楼层
首次使能AD后,AD中断转换值是不准的
dengdc 发表于 2023-1-7 10:22 | 显示全部楼层
使能AD后最好不要马上转换数据,可以考虑稍加delay
 楼主| huanghuac 发表于 2023-1-7 10:23 | 显示全部楼层

在中断里切换的,没法delay
zhaoxqi 发表于 2023-1-7 10:27 | 显示全部楼层
ADCON &= ~BIT(7);  //关AD
这句会不会有问题? 从C的语法上感觉出错了.
huangchui 发表于 2023-1-7 10:28 | 显示全部楼层
中断有问题吧
tpgf 发表于 2023-2-2 11:02 | 显示全部楼层
改变通道的话 相应的配置也要进行更改啊
qcliu 发表于 2023-2-2 11:10 | 显示全部楼层
配置代码估计肯定有问题 因为你更换通道了是不是相应的引脚也发生变化了呢
drer 发表于 2023-2-2 11:50 | 显示全部楼层
结果寄存器读取正确了吗  不同的通道 结果是存储在不同的寄存器里边的
coshi 发表于 2023-2-2 12:09 | 显示全部楼层
这个要看时钟的配置和理论是否相符合了 因为你的采样频率可能不对
kxsi 发表于 2023-2-2 12:17 | 显示全部楼层
楼主采用的是什么转换模式呢 是不是模式配置错误了啊
wiba 发表于 2023-2-2 13:10 | 显示全部楼层
改变通道的话 需要确认硬件连接是否也有所改变
您需要登录后才可以回帖 登录 | 注册

本版积分规则

772

主题

8473

帖子

6

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