AVR单片机多路采集数据,怎么不行啊??求救,,

我用的是ATmega48型号的单片机,它有8路模拟信号输入端,我想利用两路模拟端,一端采集电压,一端采集温度,怎么实现啊?? 我的思路是:先选AD0,采集信号,显示;然后选通AD1,采集信号,显示;然后循环,但是我试验了下,这样两路同时循环不能实现,但是我只选中一路,数据正常,不知道是什么原因?各位大侠有做过多路采集的么?希望解答,如有源码,能贴上让小弟膜拜下,感激不尽!
2026年09月28日 02:38
有1个网友回答
网友(1):

AVRAD转换使用注意: 绝对的应用经验!

1、注意采样保持时间要足够长 最少62us
2、注意AREF的稳定性
3、注意悬空的引脚无意义
4、注意切换通道后首次测量结果应该舍弃

AVR各种学习开发工具 搜索 “SHOP AVRVI”

给你一个tiny13写的多路AD采集的例子。
仅提供思路的主要部分,其余部分暂不方便提供,ICC编写。

程序自动采集并放入数组中,需要使用前调用GetAD将结果存到多维数组的最后,四个数取平均。

volatile unsigned char time_count=0,AD_datai=0,channer=0;
volatile unsigned char AD_data_buf[3][4];
unsigned char AD_sel[3]={0x00,0x03,0x02}; //对应P1 P2 P3 选通为AD输入

#pragma interrupt_handler adc_isr:10
void adc_isr(void)
{
//conversion complete, read value (int) using...
// value=ADCL; //Read 8 low bits first (important)
// value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
unsigned int value;
value=ADCL;
value|=(int)ADCH << 8;
AD_datai--;

if(AD_datai<4) //切换通道后首次结果抛弃,即=4抛弃
{
AD_data_buf[channer][AD_datai]=value;
}
if(AD_datai==0)
{
AD_datai=5;
channer++;
if(channer==3) channer=0;
ADCMUX = AD_sel[channer]; //切换通道
}

ADCSRA = 0xEE; //再次启动AD
}

// ADC initialize
// Conversion time: 86uS

void adc_init(void)
{
ADCSRA = 0x00; //disable adc
// ADCMUX = 0x03; //第二脚 ADC3 PB3 作为AD输入通道,10位精度 右对齐,VCC做参考电压
ADCMUX = 0x00;
ACSR = 0x80; //禁用模拟比较器
ADCSRB = 0x00; //自动触发 连续转换模式
ADCSRA = 0xEE; //ADC使能,ADC开始转换,ADC自动触发使能,ADC中断使能,128预分频
DIDR0 = ((1<}

//将AD结果放到多维数组最后
void GetAD(void)
{
unsigned int ADtemp=0;
unsigned char i=0,cha=0;
for(cha=0;cha<3;cha++)
{
for(i=0;i<4;i++)
{
ADtemp+=AD_data_buf[cha][i];
}
AD_data_buf[cha][4]=ADtemp>>2; //除以4
}
}