我用的单片机有多路模拟(大于8)输入,我想在同一个时刻(一个定时器控制采样速度)至少采样5路信号,可以实现吗?
那位大侠有过这方面的经验?我的考虑是在AD中断中通过交叉编译改变输入端口实现,是否可以?
怎样解决AD同时采样
全部回复(22)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
@sdjufeng
哦,愿听指教,咱们先不管速度如何,看看如何实现5路AD同时进行采样转换,看一看一个姑娘如何嫁给五个婆家!
可以的.不信你可以
void ADC0_ISR (void) interrupt 15 using 3
{
static unsigned char num_samples = 0; // ADC0采样计数器
AD0INT = 0; // 清除ADC0转换结束标志
AMX0SL = 0x00;
Samples0[num_samples] = ADC0; // 读和存储ADC0值
AMX0SL = 0x01;
Samples1[num_samples] = ADC0; // 读和存储ADC0值
AMX0SL = 0x02;
Samples2[num_samples] = ADC0; // 读和存储ADC0值
AMX0SL = 0x03;
Samples3[num_samples] = ADC0; // 读和存储ADC0值
AMX0SL = 0x04;
Samples4[num_samples] = ADC0; // 读和存储ADC0值
num_samples++; // 更新采样计数器
if (num_samples == NUM_SAMPLES)
{
num_samples = 0; // 复位采样计数器
EIE2 &= ~0x02; // 禁止ADC0中断
ADC0_DONE = 1; // 设置DONE标志
}
}
void ADC0_ISR (void) interrupt 15 using 3
{
static unsigned char num_samples = 0; // ADC0采样计数器
AD0INT = 0; // 清除ADC0转换结束标志
AMX0SL = 0x00;
Samples0[num_samples] = ADC0; // 读和存储ADC0值
AMX0SL = 0x01;
Samples1[num_samples] = ADC0; // 读和存储ADC0值
AMX0SL = 0x02;
Samples2[num_samples] = ADC0; // 读和存储ADC0值
AMX0SL = 0x03;
Samples3[num_samples] = ADC0; // 读和存储ADC0值
AMX0SL = 0x04;
Samples4[num_samples] = ADC0; // 读和存储ADC0值
num_samples++; // 更新采样计数器
if (num_samples == NUM_SAMPLES)
{
num_samples = 0; // 复位采样计数器
EIE2 &= ~0x02; // 禁止ADC0中断
ADC0_DONE = 1; // 设置DONE标志
}
}
0
回复
提示
@xinhua.liu
可以的.不信你可以voidADC0_ISR(void)interrupt15using3{ staticunsignedcharnum_samples=0; //ADC0采样计数器 AD0INT=0; //清除ADC0转换结束标志AMX0SL=0x00; Samples0[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x01; Samples1[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x02; Samples2[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x03; Samples3[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x04; Samples4[num_samples]=ADC0; //读和存储ADC0值 num_samples++; //更新采样计数器 if(num_samples==NUM_SAMPLES) {num_samples=0; //复位采样计数器 EIE2&=~0x02; //禁止ADC0中断 ADC0_DONE=1; //设置DONE标志 }}
哦,这就叫做五次采样啊?
你用的这种单片机是属于C8051系列的,是吧,这种器件我没有用过,但都差不多.应该看到,上面的这个过程是一次ADC采样完成后的中断过程,硬件电路只能给出一个结果,你把他分别传送到五个数组的某个位置,得到五个结果,那你不是浪费了四个数组的单元吗?
你用的这种单片机是属于C8051系列的,是吧,这种器件我没有用过,但都差不多.应该看到,上面的这个过程是一次ADC采样完成后的中断过程,硬件电路只能给出一个结果,你把他分别传送到五个数组的某个位置,得到五个结果,那你不是浪费了四个数组的单元吗?
0
回复
提示
@xinhua.liu
可以的.不信你可以voidADC0_ISR(void)interrupt15using3{ staticunsignedcharnum_samples=0; //ADC0采样计数器 AD0INT=0; //清除ADC0转换结束标志AMX0SL=0x00; Samples0[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x01; Samples1[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x02; Samples2[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x03; Samples3[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x04; Samples4[num_samples]=ADC0; //读和存储ADC0值 num_samples++; //更新采样计数器 if(num_samples==NUM_SAMPLES) {num_samples=0; //复位采样计数器 EIE2&=~0x02; //禁止ADC0中断 ADC0_DONE=1; //设置DONE标志 }}
改变通道以后,不用启动和等待就可以直接取结果啊?
五通道同时测量的意思是说转换过程时间比较长,为了节省时间,让它们的转换过程同时进行,如果像你上面的做法,即便是改变通道后能得到结果,那也是分时得到的,不是吗?
五通道同时测量的意思是说转换过程时间比较长,为了节省时间,让它们的转换过程同时进行,如果像你上面的做法,即便是改变通道后能得到结果,那也是分时得到的,不是吗?
0
回复
提示
@xinhua.liu
可以的.不信你可以voidADC0_ISR(void)interrupt15using3{ staticunsignedcharnum_samples=0; //ADC0采样计数器 AD0INT=0; //清除ADC0转换结束标志AMX0SL=0x00; Samples0[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x01; Samples1[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x02; Samples2[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x03; Samples3[num_samples]=ADC0; //读和存储ADC0值AMX0SL=0x04; Samples4[num_samples]=ADC0; //读和存储ADC0值 num_samples++; //更新采样计数器 if(num_samples==NUM_SAMPLES) {num_samples=0; //复位采样计数器 EIE2&=~0x02; //禁止ADC0中断 ADC0_DONE=1; //设置DONE标志 }}
建议用外部多路硬件采样保持电路解决这个问题.
0
回复
提示