2016-09-22 5 views
0

ATMEGA328pのADC0から値を読み取ろうとしています。予想される値は0〜5Vです。これはADC0がXplainedミニの5V出力に接続されたポテンショメータに接続されているためです。私は通常0Vか5Vのいずれかを得ています。ポテンショメータを変更しても変化はありません。私は複数のADCの例とチュートリアルをオンラインで見ましたが、私のコードでエラーを見つけることができません。コード内のADC変換エラーATMEGA328p

void adc_initialise(){ 
    //set vref to AVcc, channel selection is initially ADC0 as wanted 
    ADMUX |= (1<<6); 
    //set ADC enable, Set adc clock prescalar 64 
    ADCSRA |= (1<<7)|(1<<2)|(1<<1); 
} 

uint16_t adc_read(){ 
    ADCSRA |= (1<<6); // start conversion 
    while(ADCSRA & (1<<ADSC)); //wait until conversion is complete 
    return ADCW; 
} 

float adc_calculation(uint16_t adcValue){ 
    float stepSize = (5.0/1024.0); 
    float voltageIn = adcValue*stepSize; 
    return voltageIn; 
} 

はその後、私のメインの中で私は

while(1){ 
    adc_initialise(); 
    uint16_t adcValue = adc_read(); 
    float voltageIn = adc_calculation(adcValue); 
    adcConverterToUART(voltageIn);//I know that this part of the code is working as I have hardcoded many test values and all have transmitted correctly. 
} 

を持っていると私はエラーがどこかに上記のADCコードで私のUARTのコードではありませんが、知っている上述したように。あらゆる助けを事前に乾杯してください。

+0

整数値をどこかに格納し、メモリを検査したり、そこにブレークポイントを置きます。また、もちろん、マルチメータを使って、実際にADCが接続されている時点で電圧が変化していることを確認してください。エレクトロニクスは難しい。 :) – unwind

答えて

0

私はいくつか言及することができます。それが助けがあれば試してみることができます。

  1. while(1)の前にadc_initialise()を実行してください。 これを何度も何度も初期化します。
  2. while(ADCSRA & (1<<ADSC));ここでは、コンパイラがコードから最適化しないNOPを追加する必要があります。

残りは私の目によく見えます。

変換の価値はありますか?

MFG

EDIT1:

私は私の古いファイルのいずれかに見えました。 このようにして、ADCから値を取得するようにしました。

// Get count value 
    adValue = ADCL; 
    adValue |= (UI_16_t)(ADCH << 8); 

ADCLは値の下位バイトであり、上位バイトをADCHします。 下位バイトの先頭の上位バイトをシフトして値を取得しました。

+0

はい私のvoltatgeIn私はいつも平らな0vまたは4.99vポテンショメータが変更されたときに変更なしと思われる – AmatuerCoder101

+0

私は中にadc_initialiseを持っている場合もそれは問題ですか?私はそれがなぜ外にあるべきか理解していますが、もともと私は若干異なるコードを持っていて、whileループでそれを置くこともできると思いました。 – AmatuerCoder101

+0

@ AmatuerCoder101私は少なくとも意味が成立しないという意味で「重要」です。 :)予期せぬ、奇妙なもので、少なくとも少し混乱した人が書いたコードを読んだ人には、「警報」のように働くことができます。通常、何かを初期化するという全体のポイントは、あなたがそれを使うことができるようにするためです。init関数の存在は、一度だけ実行する必要のある操作があることを意味します。 – unwind