找回密码
 立即注册
查看: 231|回复: 9

大佬求教!AI8H单片机ADC中断采样如何实现多通道切换

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2025-2-22 17:18:53 | 显示全部楼层 |阅读模式
大佬们,这是我目前adc的程序,adc中断会执行三次,分别切换3个通道一次之后就不进中断了是为啥啊

#include "adc.h"
#include "stc8.h"
#include "intrins.h"


#define ADC_CHS1  0x00  //模拟通道选择0~1111
#define ADC_CHS2  0x01
#define ADC_CHS3  0x04

//采样的AD值
unsigned int ADC_Result = 0;
// 经过用户转换后的值
float ADC_Num = 0.0;

float ADC_Vol = 0.0;
float ADC_Cur = 0.0;
float ADC_Tmp = 0.0;

//ADC通道选择
unsigned char ADC_CH = 0;

        
void ADC_Init()
{
        ADC_CONTR |= ADC_POWER | ADC_CHS1 | ADC_START;  //打开ADC电源,选择模拟通道 转换启动
        ADCCFG |= RESFMT | SPEED;                     //转换结果右对齐,ADC工作时钟频率SYSclk/2/16
        ADCTIM |= CSSETUP | CSHOLD | SMSPDUTY;
        ADCEXCFG = 0x04;                                                                                                                        //转换x次取平均值
}


//ADC中断
void ADC_Isr() interrupt 5
{
        ADC_CONTR &= ~0x20;  //ADC完成标志位清零        
        
        ADC_Result = ADC_RES;        //高四位
        ADC_Result <<= 8;
        ADC_Result |= ADC_RESL;      //低八位
        
        ADC_Num = (float)ADC_Result * 0.001220703125;
        
        //ADC_Result *= (5/4096);

        if(ADC_CH > 3){
                ADC_CH = 0;
        }
        else if(ADC_CH == 0){
                //采集电压
                ADC_Vol = ADC_Num;
               //切换电流通道
                ADC_CONTR |= ADC_CHS2 | ADC_START;  // 选择通道并启动转换
        }
        else if(ADC_CH == 1){
                //采集电流
                ADC_Cur = ADC_Num;
               //切换温度通道
                ADC_CONTR |= ADC_CHS3 | ADC_START;  // 选择通道并启动转换
        }
        else if(ADC_CH == 2){
                //采集温度
                ADC_Tmp = ADC_Num;
                //切换电压通道
                ADC_CONTR |= ADC_CHS1 | ADC_START;  // 选择通道并启动转换
        }
        //通道+1
        ADC_CH++;
        
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-2-22 17:43:33 | 显示全部楼层

ADC_CH==3的时候...下面没有响应的处理,你的中断里清楚了标志位之后,就没有再次触发采集了。自然就不会再进入中断了

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-2-22 17:45:48 | 显示全部楼层

还有一个问题,,你这么写代码,,最后就都是测试ADC通道5了touxiao

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-05-01 09:11:48
已绑定手机

5

主题

28

回帖

315

积分

中级会员

积分
315
发表于 2025-2-22 18:17:26 | 显示全部楼层
if(ADC_CH==0) {  }
if(ADC_CH==1) {  }
if(ADC_CH==2) {  }
ADC_CH++;
if(ADC_CH>2)  {ADC_CH = 0;  }
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-22 19:16:47 | 显示全部楼层

这里都改成=一直在|都变1了
截图202502221915353445.jpg
DebugLab
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2025-2-22 20:12:41 | 显示全部楼层
_奶*** 发表于 2025-2-22 17:43
ADC_CH==3的时候...下面没有响应的处理,你的中断里清楚了标志位之后,就没有再次触发采集了。自然就不会再 ...

谢谢大佬,搞定了!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2025-2-22 20:13:18 | 显示全部楼层
Debu*** 发表于 2025-2-22 19:16
这里都改成=一直在|都变1了

谢谢大佬
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2025-2-22 20:13:46 | 显示全部楼层
13259*** 发表于 2025-2-22 18:17
if(ADC_CH==0) {  }
if(ADC_CH==1) {  }
if(ADC_CH==2) {  }

感谢大佬
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2025-2-22 21:03:47 | 显示全部楼层
中断里下面这句:
  else if(ADC_CH == 0){
改为:
if(ADC_CH == 0){

原来的逻辑错误:当执行这句: if(ADC_CH > 3)   ADC_CH = 0; 并没有触发ADC,所以就停止了。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2025-2-24 16:40:05 | 显示全部楼层
梁*** 发表于 2025-2-22 21:03
中断里下面这句:
  else if(ADC_CH == 0){
改为:

好的谢谢大佬,问题已搞定
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:26 , Processed in 0.163374 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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