我一直在使用 ATmega128,现在我正在研究 ATmega2560。我已经在 128 中尝试过 ADC。当我在 2560 中尝试时,除了更改它时,我没有问题。我在 codevision 中编写了这段代码。仅使用单个通道时效果很好,但是在更改通道时会出现不稳定的行为。问题是什么 ?
这里的代码
void ADC_init(void)
{
PINF=0;
PORTF=0;
PINK=0;
PORTK=0;
ADMUX = 0b01000000;
ADCSRA =0x87; //ADEN=1,ADIE=0
ADCSRB=0x00;
}
void ADC1_read(void)// current - ADC1
{
ADMUX=0x41;
ADCSRA|=0x40; //ASSC=1 (ad_start)
ADCSRB=0x00;
while((ADCSRA&(1<<ADSC))); //while((ADCSRA&0x10)==0);
ADCSRA |= (1<<ADIF);
cur_l=ADCL;
cur_h=ADCH;
cur_buf=cur_h;//0x03;
cur_buf=(cur_buf<<8)|cur_l;
cur_vol = (unsigned long)(((unsigned long)cur_buf*500)/1023);
}
void ADC3_read(void) //temp sensor - ADC3
{
unsigned long temp_volt;
ADMUX = 0xC3;
ADCSRA|=0x40; //ASSC=1 (ad_start)
ADCSRB=0x00;
while((ADCSRA&0x10)==0);
ADCSRA |= (1<<ADIF);
temp_l=ADCL;
temp_h=ADCH;
temp_buf=temp_h;//0x03;
temp_buf<<=8;
temp_buf|=temp_l;
temp_volt = (unsigned long)(((unsigned long)temp_buf*256)/1023);
temp_analog = (unsigned long)(((unsigned long)temp_buf*256)/1023)-50;
}
Main里面的处理函数是这样的:
void process(void)
{
static unsigned char tick_2sec=0, tick_3sec=0;
unsigned char rx2;
if (tick_1sec){
tick_2sec++;
tick_3sec++;
tick_1sec = 0;
}
if (tick_2sec == 2){
tick_2sec = 0;
if (t2 == 1){
t2 = 0;
ADC3_read(); //temp
}
}
if (tick_3sec == 3){
tick_3sec = 0;
if (t3 == 1){
t3 = 0;
ADC1_read(); //current
}
}
}
我使用温度传感器 TMP36 输入 ADC3,在 20 C 时,输出电压约为 0.7 V。当仅使用 ADC 3 和 2.56 V 参考电压时,从 ADCH 和 ADCL 获取的值是 0x118。同样,我将 ADC1 连接到在正常情况下输出 2.48 伏的电压源。当我只使用参考电压为 5 伏的 ADC1 时,ADCH 和 ADCL 的输出为 509。随着电压的变化,ADCH 和 ADCL 寄存器也相应变化。当我调用函数以 2 和 3 秒的间隔读取 ADC1 和 ADC3 时,如代码所示,在相同的电压下,ADCH 和 ADCL 的内容与上面不同。ADC3 的 ADCH,L 为 137-140,ADC1 的 ADCH,L 为 340-352。