avr: atmega328p АЦП всегда читает максимальное значение

Я пытался сэмплировать аналоговый сигнал с помощью atmega328p в c. Раньше у меня это работало с чем-то похожим, но на этот раз я не могу заставить его работать. Я попытался сделать минимальный пример, который дает мне тот же результат:

#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-битный АЦП, это максимальное значение, поэтому я, вероятно, что-то делаю не так, но просто не могу определить ошибку.

Заранее спасибо за любые ответы

С уважением, Вред

1 ответ

Решение

Похоже, вы пытаетесь читать с ADC0, который является контактом PC0. Убедитесь, что вы подключаете PC0 к GND или другому известному напряжению; если он плавающий, вы можете получить непредсказуемые результаты.

Вам также следует попробовать записать 0x87 в ADMUX, чтобы замедлить работу АЦП.

Если вам нужна дополнительная помощь, вы должны опубликовать свой полный код и фотографии, показывающие, как все подключено.

Другие вопросы по тегам