2016-11-17 10 views
2

私は、コミュテータのループの周りに、ADCのカップルの値を読み込むコードをいくつか持っています。私が見る何ADCはATMEGA324PAで一度しか動作しません

static uint16_t adc0; 
static uint16_t adc1; 

void init(void) { 
    ... 
    hw_configure_adcs(); 
    ... 
} 

void loop(void) { 
    ... 
    adc0 = hw_read_adc(0); 
    adc1 = hw_read_adc(1); 
    ... 
} 

void hw_configure_adcs(void) { 
    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); 
} 

uint16_t hw_read_adc(uint8_t n) { 
    ADMUX = (1<<REFS0) | (n & 0x07); 
    ADCSRA |= (1<<ADSC); // start conversion 
    uint16_t count; 
    for (count = 0; !(ADCSRA & (1<<ADIF)); count++); // wait for conversion to complete 
    // ADCSRA |= (1<<ADIF); // tried with and without this 
    return (ADCH << 8) | ADCL; // return ADC value 
} 

は奇数である:ADC0とADC1の値が同じ値に設定し、AVRチップが再起動されるまで再フラッシュ/、変更されることはありません。

(値は0.71Vで0x00d1かつ合理的なようだ1.00V、で0x0128です。)私が試してみました

  • は、電圧を下げ:ADC0とADC1は一定のままとだけ行きますAVRコードが再読み込みされたとき(したがってチップが再起動されたとき)
  • 電圧を上げる:adc0とadc1は一定のままで、AVRコードが再読み込みされたときにのみ上昇し、チップが再起動します。
  • ADC値の代わりにcounthw_read_adc()に戻します。これは、2つのADCで異なり、時間の経過とともに連続的に変化する0x34と0x38の間の変化する数値を返します。

これらのテストから、私はADCが読み込まれていると推測しますが、「明確なADCHとADCLがなくなり、新しい読み込みを受け入れる準備ができています。

私はhttp://www.atmel.com/images/Atmel-8272-8-bit-AVR-microcontroller-ATmega164A_PA-324A_PA-644A_PA-1284_P_datasheet.pdfのセクション23を何度も読んだことがありますが、明らかに重要なことを見落としてしまっています。

+0

@Staringlizard。 – fadedbee

+1

多分あなたは[this](http://extremeelectronics.co.in/avr-tutorials/using-adc-of-avr-microcontroller/)を試してみてください。おそらく、変換を行うたびに基準電圧を設定しようとせず、1回だけ設定してください。そして、割り込みフラグを再設定する方がよいでしょう。私はこれが正しい結果を得るために必須であると思う。 – ckruczek

+0

@ckruczekありがとうございますが、そのサンプルコードは私がやっていることを正確に実行しているようですが、バグがあります: 'ADMUX | = ch;'はReadADC()関数を選択したADC関数によって読み取られたすべての以前のADCのORed値。これはバグではない場合、あなたはそれを説明できますか? – fadedbee

答えて

1

ずっとグーグルの後、私が見つかりました:それは最初の高いレジスタを読み出すようにhttp://www.avrfreaks.net/forum/adc-only-happens-once-reset

問題は(ご想像のとおり)return (ADCH << 8) | ADCL;がコンパイルされたということでした。

データシートの252ページに「そうでない場合は、ADCLを最初に読み込んでからADCHを読み込む必要があります。

私のコードをreturn ADCに変更すると、問題が解決しました。

起こっていたことについての私の推測では、次のとおりです。

  • ADCHからの読み込みが発生しました。
  • ADCLから読み出すと、ADCの結果がロックされ、引き裂きを防止できます。
  • ADCの結果がロックされたため、次のADCの読み出しでは結果が書き込まれませんでした。
  • 繰り返し...私は私が試したし、ADIFをクリアせずにいたことが示された編集をした
+1

完璧な、問題を解決して聞いてよかった。実際には、私は自分のリポジトリにADC用のコードをいくつか持っていて、実際はADCのみを返しています。しかし、私はこれがこのような問題であり得ることに気づいていませんでした。 – ckruczek

+0

@ckruczek AVRで*読み込み*することさえ副作用があるかもしれない貴重な教訓を学びました。 – fadedbee

関連する問題