私は、コミュテータのループの周りに、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値の代わりに
count
をhw_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を何度も読んだことがありますが、明らかに重要なことを見落としてしまっています。
@Staringlizard。 – fadedbee
多分あなたは[this](http://extremeelectronics.co.in/avr-tutorials/using-adc-of-avr-microcontroller/)を試してみてください。おそらく、変換を行うたびに基準電圧を設定しようとせず、1回だけ設定してください。そして、割り込みフラグを再設定する方がよいでしょう。私はこれが正しい結果を得るために必須であると思う。 – ckruczek
@ckruczekありがとうございますが、そのサンプルコードは私がやっていることを正確に実行しているようですが、バグがあります: 'ADMUX | = ch;'はReadADC()関数を選択したADC関数によって読み取られたすべての以前のADCのORed値。これはバグではない場合、あなたはそれを説明できますか? – fadedbee