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

STC32G多路ADC中断方式读取

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 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的值呢?

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 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转换
                        }
                }
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 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);
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

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

点评

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

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

又学了一点
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:06 , Processed in 0.114913 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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