打印
[其它应用]

AD这里遇到这样的问题

[复制链接]
1087|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个通道以上?

使用特权

评论回复
5
juventus9554| | 2023-1-7 10:20 | 只看该作者
首次使能AD后,AD中断转换值是不准的

使用特权

评论回复
6
dengdc| | 2023-1-7 10:22 | 只看该作者
使能AD后最好不要马上转换数据,可以考虑稍加delay

使用特权

评论回复
7
huanghuac|  楼主 | 2023-1-7 10:23 | 只看该作者

在中断里切换的,没法delay

使用特权

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

使用特权

评论回复
9
huangchui| | 2023-1-7 10:28 | 只看该作者
中断有问题吧

使用特权

评论回复
10
tpgf| | 2023-2-2 11:02 | 只看该作者
改变通道的话 相应的配置也要进行更改啊

使用特权

评论回复
11
qcliu| | 2023-2-2 11:10 | 只看该作者
配置代码估计肯定有问题 因为你更换通道了是不是相应的引脚也发生变化了呢

使用特权

评论回复
12
drer| | 2023-2-2 11:50 | 只看该作者
结果寄存器读取正确了吗  不同的通道 结果是存储在不同的寄存器里边的

使用特权

评论回复
13
coshi| | 2023-2-2 12:09 | 只看该作者
这个要看时钟的配置和理论是否相符合了 因为你的采样频率可能不对

使用特权

评论回复
14
kxsi| | 2023-2-2 12:17 | 只看该作者
楼主采用的是什么转换模式呢 是不是模式配置错误了啊

使用特权

评论回复
15
wiba| | 2023-2-2 13:10 | 只看该作者
改变通道的话 需要确认硬件连接是否也有所改变

使用特权

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

本版积分规则

772

主题

8473

帖子

6

粉丝