STC32G多路ADC中断方式读取
本帖最后由 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={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的值呢?
怎么编辑修改不了了。中断函数:
void ADC_Isr(void) interrupt 5
{
u16 ADC_Val={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转换
}
} 中断里用for循环重复读取重复触发10次?这是要干嘛呢?看不懂。
//全局变量定义
u8 index; //ADC通道索引
u16 xdata adc; //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 = (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);
}
梁工:我是想用中断方式循环读取多个ADC的值,在中断里不知怎么处理(编程)。你的程序给了明确的答案{:4_196:} Tuier 发表于 2024-5-9 10:49
梁工:我是想用中断方式循环读取多个ADC的值,在中断里不知怎么处理(编程)。你的程序给了明确的答案 ...
很多情况下都需要一个确定的触发频率,一般使用定时器或PWM来做均匀触发采样,ADC中断里再触发其余通道。 梁工 发表于 2024-5-9 14:36
很多情况下都需要一个确定的触发频率,一般使用定时器或PWM来做均匀触发采样,ADC中断里再触发其余通道。 ...
又学了一点{:4_196:}
页:
[1]