找回密码
 立即注册
查看: 64|回复: 5

STC32G多路ADC中断方式读取

[复制链接]
  • TA的每日心情
    开心
    昨天 07:32
  • 签到天数: 145 天

    [LV.7]常住居民III

    10

    主题

    97

    回帖

    628

    积分

    高级会员

    积分
    628
    发表于 2024-5-7 16:08:17 | 显示全部楼层 |阅读模式
    本帖最后由 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[10]={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的值呢?

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:32
  • 签到天数: 145 天

    [LV.7]常住居民III

    10

    主题

    97

    回帖

    628

    积分

    高级会员

    积分
    628
     楼主| 发表于 2024-5-7 16:13:16 | 显示全部楼层
    怎么编辑修改不了了。中断函数:
    void ADC_Isr(void) interrupt 5
                    {
                           u16 ADC_Val[10]={0};

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

    使用道具 举报

    该用户从未签到

    46

    主题

    3044

    回帖

    6863

    积分

    超级版主

    积分
    6863
    发表于 2024-5-9 10:31:58 | 显示全部楼层
    中断里用for循环重复读取重复触发10次?这是要干嘛呢?看不懂。

    //全局变量定义
    u8        index;        //ADC通道索引
    u16        xdata adc[16];        //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[index] = (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);
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:32
  • 签到天数: 145 天

    [LV.7]常住居民III

    10

    主题

    97

    回帖

    628

    积分

    高级会员

    积分
    628
     楼主| 发表于 2024-5-9 10:49:08 | 显示全部楼层
    梁工:我是想用中断方式循环读取多个ADC的值,在中断里不知怎么处理(编程)。你的程序给了明确的答案

    点评

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

    使用道具 举报

    该用户从未签到

    46

    主题

    3044

    回帖

    6863

    积分

    超级版主

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

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:32
  • 签到天数: 145 天

    [LV.7]常住居民III

    10

    主题

    97

    回帖

    628

    积分

    高级会员

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

    又学了一点
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 05:03 , Processed in 0.061667 second(s), 50 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表