Rs428 发表于 2025-2-22 17:18:53

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

大佬们,这是我目前adc的程序,adc中断会执行三次,分别切换3个通道一次之后就不进中断了是为啥啊

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


#define ADC_CHS10x00//模拟通道选择0~1111
#define ADC_CHS20x01
#define ADC_CHS30x04

//采样的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++;
      
}

_奶咖君_ 发表于 2025-2-22 17:43:33

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

_奶咖君_ 发表于 2025-2-22 17:45:48

<p>还有一个问题,,你这么写代码,,最后就都是测试ADC通道5了<img alt="touxiao" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/touxiao.gif" title="touxiao" /></p>

1325986650 发表于 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;}

DebugLab 发表于 2025-2-22 19:16:47


这里都改成=一直在|都变1了

Rs428 发表于 2025-2-22 20:12:41

_奶咖君_ 发表于 2025-2-22 17:43
ADC_CH==3的时候...下面没有响应的处理,你的中断里清楚了标志位之后,就没有再次触发采集了。自然就不会再 ...

谢谢大佬,搞定了!

Rs428 发表于 2025-2-22 20:13:18

DebugLab 发表于 2025-2-22 19:16
这里都改成=一直在|都变1了

谢谢大佬{:qiang:}

Rs428 发表于 2025-2-22 20:13:46

1325986650 发表于 2025-2-22 18:17
if(ADC_CH==0) {}
if(ADC_CH==1) {}
if(ADC_CH==2) {}


感谢大佬{:huaixiao:}

梁工 发表于 2025-2-22 21:03:47

中断里下面这句:
else if(ADC_CH == 0){
改为:
if(ADC_CH == 0){

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

Rs428 发表于 2025-2-24 16:40:05

梁工 发表于 2025-2-22 21:03
中断里下面这句:
else if(ADC_CH == 0){
改为:


好的谢谢大佬,问题已搞定
页: [1]
查看完整版本: 大佬求教!AI8H单片机ADC中断采样如何实现多通道切换