代码ATMEGA328p中的ADC转换错误

时间:2016-09-22 09:26:15

标签: c atmega atmel adc atmelstudio

我正在尝试从ATMEGA328p上读取ADC0的值。预期值在0-5v之间。这是因为ADC0连接到连接到Xplained mini的5v输出的电位器。我通常会得到0v或5v。电位计改变时没有变化。我已经在线查看了多个ADC示例和教程,但无法在我的代码中找到错误。

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.
}

如上所述,我知道错误不在我的UART代码中,而是在上面的ADC代码中。提前为您提供帮助。

1 个答案:

答案 0 :(得分:0)

我可以提一些事情。如果它有帮助你可以试试。

  1. 您应该在adc_initialise()之前执行while(1)。 你一次又一次地初始化它。
  2. while( ADCSRA & (1<<ADSC) );在这里你应该添加NOP,编译器不会在代码中优化它。
  3. 其余的看起来很好看。

    您获得转换的任何价值吗?

    MFG

    EDIT1:

    我查看了一个旧文件。 在那里我们这样做是为了从ADC获得价值。

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

    ADCL是值的低字节,ADCH是高字节。 我们将低字节前面的高字节移位以获得值。