私は 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 でした。