0

私は 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 で出力電圧は約 .7 V です。ADC 3 のみを基準電圧 2.56 V で使用した場合、ADCH と ADCL から取得される値は 0x118 です。同様に、ADC1 を通常状態で 2.48 ボルトを出力する電圧源に接続しました。基準電圧5ボルトでADC1のみを使用した場合、ADCHおよびADCLからの出力は509です。また、電圧の変化に伴い、ADCHおよびADCLレジスタもそれに応じて変化します。コードに示すように、ADC1 と ADC3 を 2 秒と 3 秒間隔で読み取る関数を呼び出したところ、同じ電圧で ADCH と ADCL の内容が上記とは異なりました。ADC3 の ADCH,L は 137 ~ 140、ADC1 の ADCH,L は 340 ~ 352 でした。

4

2 に答える 2