c - avr:atmega328p ADC 始终读取最大值

标签 c avr adc

我一直在尝试使用 c 中的 atmega328p 对模拟信号进行采样。以前我已经用过类似的东西,但不知何故,这次我无法让它工作。我尝试制作一个最小的示例,以获得相同的结果:

#include <avr/io.h>

uint8_t data[2];    

ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN);

ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
data[1] = ADCL;
data[0] = ADCH;

无论如何,此代码都会生成数组 data = {0b00000011, 0b11111111}。由于atmega328p有一个10位adc,这是最大值,所以我可能做错了什么,但我只是无法发现错误。

提前感谢您的回答

问候, 危害

最佳答案

看起来您正在尝试从 ADC0(引脚 PC0)读取数据。确保将 PC0 连接到 GND 或其他已知电压;如果它是 float 的,你会得到不可预测的结果。

您还应该尝试将 0x87 写入 ADMUX 以减慢 ADC 的时钟速度。

如果您需要更多帮助,您应该发布完整的代码和显示所有接线方式的图片。

关于c - avr:atmega328p ADC 始终读取最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43687681/

相关文章:

c - 声明结构指针时出错

c - ATMega48 - 如何注册外部PCINT2中断器?

c - 如何用C语言为时钟为16MHz的ATMega8计算时间

c - 未经缓冲的易错测量样本的平均值

c - 从用户/新开发人员的角度来看,如何防止未定义的行为?

c - 传递指向 typedef 数组的指针

php - 从 ADS1115 Python 向 MySQL 插入数据

sampling - 提高 Beaglebone Black ADC 采样率?

c - 生产者消费者段错误(核心转储)

c - 我们必须在哪里只使用寄存器变量?