大佬求教!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++;
}
<p>ADC_CH==3的时候...下面没有响应的处理,你的中断里清楚了标志位之后,就没有再次触发采集了。自然就不会再进入中断了</p>
<p>还有一个问题,,你这么写代码,,最后就都是测试ADC通道5了<img alt="touxiao" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/touxiao.gif" title="touxiao" /></p>
if(ADC_CH==0) {}
if(ADC_CH==1) {}
if(ADC_CH==2) {}
ADC_CH++;
if(ADC_CH>2){ADC_CH = 0;}
这里都改成=一直在|都变1了
_奶咖君_ 发表于 2025-2-22 17:43
ADC_CH==3的时候...下面没有响应的处理,你的中断里清楚了标志位之后,就没有再次触发采集了。自然就不会再 ...
谢谢大佬,搞定了! DebugLab 发表于 2025-2-22 19:16
这里都改成=一直在|都变1了
谢谢大佬{:qiang:} 1325986650 发表于 2025-2-22 18:17
if(ADC_CH==0) {}
if(ADC_CH==1) {}
if(ADC_CH==2) {}
感谢大佬{:huaixiao:} 中断里下面这句:
else if(ADC_CH == 0){
改为:
if(ADC_CH == 0){
原来的逻辑错误:当执行这句: if(ADC_CH > 3) ADC_CH = 0; 并没有触发ADC,所以就停止了。 梁工 发表于 2025-2-22 21:03
中断里下面这句:
else if(ADC_CH == 0){
改为:
好的谢谢大佬,问题已搞定
页:
[1]