我正在尝试从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代码中。提前为您提供帮助。
答案 0 :(得分:0)
我可以提一些事情。如果它有帮助你可以试试。
adc_initialise()
之前执行while(1)
。
你一次又一次地初始化它。while( ADCSRA & (1<<ADSC) );
在这里你应该添加NOP,编译器不会在代码中优化它。 其余的看起来很好看。
您获得转换的任何价值吗?
MFG
EDIT1:
我查看了一个旧文件。 在那里我们这样做是为了从ADC获得价值。
// Get count value
adValue = ADCL;
adValue |= (UI_16_t)(ADCH << 8);
ADCL是值的低字节,ADCH是高字节。 我们将低字节前面的高字节移位以获得值。