Tuier 发表于 2024-5-7 16:08:17

STC32G多路ADC中断方式读取

本帖最后由 Tuier 于 2024-5-7 16:11 编辑

查询方式可以用读取函数设置读取通道,中断方式读取ADC,只设置了1个通道,该如何获取多通道的ADC值呢?

void ADC_Init( void )
                {
                        P1M0 = 0x00;                                       //设置P10为高阻输入
                        P1M1 = 0x01;
//                        ADC_CONTR |=0x00;   //ADC通道选择。通道0(P10)
                        ADCTIM = 0X3F;                                        //
                        ADCCFG = 0X2F;                                        //数据右对齐,时钟选择位SYSCLK/2/16最慢
                        ADC_POWER = 1;                                        //打开adc电源
                        EADC = 1;                                                    //打开ADC中断
                        ADC_START = 1;                                        //开启ADC转换
                }

                void ADC_Isr(void) interrupt 5
                {
                        ADC_FLAG = 0;                                                //清空读取标志位
                        ADC_VAL = (u16)((ADC_RES << 8) + ADC_RESL);      //读取adc的数值
                        ADC_START = 1;                                        //继续开启ADC转换
                }

我的理解是:转换结果寄存器是共用的,每次转换完成标志位清零。在中断里加for循环,上机测试结果是错误的:

void ADC_Isr(void) interrupt 5
                {
                     u16 ADC_Val={0};

                        u8 i;
                        for(i=0;i<10;i++)
                        {
                              ADC_FLAG = 0;                                                //清空读取标志位
                              ADC_CONTR |=i;                //重新设置ADC通道               
                              ADC_Val = (u16)((ADC_RES << 8) + ADC_RESL);      //读取adc的数值
                              ADC_START = 1;                                        //继续开启ADC转换
                        }
                }
请问各位老师该如何处理同时读取多通道ADC的值呢?

Tuier 发表于 2024-5-7 16:13:16

怎么编辑修改不了了。中断函数:
void ADC_Isr(void) interrupt 5
                {
                     u16 ADC_Val={0};

                        u8 i;
                        for(i=0;i<10;i++)
                        {
                              ADC_FLAG = 0;                                                //清空读取标志位
                              ADC_CONTR |=i;                //重新设置ADC通道               
                              ADC_Val = (u16)((ADC_RES << 8) + ADC_RESL);      //读取adc的数值
                              ADC_START = 1;                                        //继续开启ADC转换
                        }
                }

梁工 发表于 2024-5-9 10:31:58

中断里用for循环重复读取重复触发10次?这是要干嘛呢?看不懂。

//全局变量定义
u8        index;        //ADC通道索引
u16        xdata adc;        //adc结果

//主程序中初始化ADC后启动ADC, 之后中断自动轮流转换各通道,这种方式ADC的间隔时间主要取决于ADC初始化的各个时间参数设置。
index = 0;
        ADC_RES= 0;
        ADC_RESL = 0;
        ADC_CONTR = 0x80 | ADC_START | index;        //启动ADC
        NOP(5);
//中断里处理:
void ADC_ISR (void) interrupt ADC_VECTOR
{
        adc = (u16)ADC_RES * 256 + (u16)ADC_RESL;        //读ADC结果
        if(++index >= 16)        index = 0;        //下一个通道
        ADC_RES= 0;
        ADC_RESL = 0;
        ADC_CONTR = 0x80 | ADC_START | index;        //启动ADC
        NOP(5);
}

Tuier 发表于 2024-5-9 10:49:08

梁工:我是想用中断方式循环读取多个ADC的值,在中断里不知怎么处理(编程)。你的程序给了明确的答案{:4_196:}

梁工 发表于 2024-5-9 14:36:31

Tuier 发表于 2024-5-9 10:49
梁工:我是想用中断方式循环读取多个ADC的值,在中断里不知怎么处理(编程)。你的程序给了明确的答案 ...

很多情况下都需要一个确定的触发频率,一般使用定时器或PWM来做均匀触发采样,ADC中断里再触发其余通道。

Tuier 发表于 2024-5-9 15:15:45

梁工 发表于 2024-5-9 14:36
很多情况下都需要一个确定的触发频率,一般使用定时器或PWM来做均匀触发采样,ADC中断里再触发其余通道。 ...

又学了一点{:4_196:}
页: [1]
查看完整版本: STC32G多路ADC中断方式读取