gpt4 book ai didi

c - 代码 ATMEGA328p 中的 ADC 转换错误

转载 作者:行者123 更新时间:2023-11-30 16:57:14 25 4
gpt4 key购买 nike

我正在尝试从 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. 你应该做你的adc_initialise()之前while(1) 。您一次又一次地初始化它。
  2. while( ADCSRA & (1<<ADSC) );在这里你应该添加也许编译器不会从代码中优化它的 NOP。

其余的在我看来都不错。

您获得转化的任何值(value)吗?

制造

编辑1:

我查看了一份旧文件。我们这样做是为了从 ADC 获取值。

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

ADCL 是值的低字节,ADCH 是值的高字节。我们将高字节移到低字节前面即可得到该值。

关于c - 代码 ATMEGA328p 中的 ADC 转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39635169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com