analogRead всегда 1023 на Arduino Due
Просто используя базовый пример AnalogReadSerial
.
// процедура настройки запускается один раз, когда вы нажимаете сброс:
void setup()
{
// инициализировать последовательную связь со скоростью 9600 бит в секунду:
Serial.begin(9600);
}
// процедура цикла выполняется снова и снова вечно:
void loop()
{
// считывание входного сигнала на аналоговом выводе 0:
int sensorValue = analogRead(A0);
// распечатайте значение, которое вы прочитали:
Serial.println(sensorValue);
delay(1); // задержка между чтениями для стабильности
}
У меня есть базовый делитель напряжения, установленный между двумя резисторами 10 Ком от 5 В до GND. Я проверил с помощью цифрового преобразователя, что напряжение постоянного тока на выводе A0 составляет 2,5 В. Заземление контакта A0 не имеет никакого эффекта.
Также кажется, что включение либо канала АЦП 7 (вывод Arduino AD0), либо включение каждого канала, перевод АЦП в режим свободной работы и намеренная установка его в режим ожидания не имеют никакого эффекта:
ADC->ADC_CHDR = 0;
ADC->ADC_CHER |= 0xFF;
ADC->ADC_MR |= 0b10000000;
ADC->ADC_MR &= 0b11011111;
Кроме того, запустив sketch DigitalInputPullup
, я могу переключить светодиод на выводе 13 и включить последовательную связь, когда я подключаю вывод к земле, демонстрируя, что плата программируется правильно.
Наверное, я просто в тупике. Должно быть, это самая простая вещь в мире, но она просто не работает.
Редактировать: Это моя попытка ручного управления АЦП:
volatile unsigned long value;
void setup()
{
//Настройка АЦП
ADC->ADC_WPMR &= 0xFFFE; //отключить защиту от записи
ADC->ADC_CHER = 0b100; //Включить AD2 |
ADC->ADC_MR &= 0b11111111000000001111111100000000;
ADC->ADC_MR |= 0b00000000000100100000000000000000; // программный триггер, высокое разрешение, нет режима ожидания, не работает бесплатно
ADC->ADC_IER = 0b100; //включить прерывание
ADC->ADC_IMR = 0b100; //включить прерывание в маске
ADC->ADC_CR |= 0b10; //начать первое преобразование
Serial.begin(9600);
}
// процедура цикла выполняется снова и снова вечно:
void loop()
{
ADC->ADC_CR |= 0b10; // начать преобразование
while (!(ADC->ADC_ISR & 0b100)); // дождаться завершения преобразования
for (int i = 0; i <= 15; i++)
{
value = ADC->ADC_CDR[i]; //считывать данные преобразования для всех каналов
Serial.println(value);
}
Serial.println();
Serial.println();
Serial.println();
delay(3000);
}
Просто, кажется, ничего не делает. ADC_CHSR
(регистр состояния канала АЦП) показывает, что канал 2 и только канал 2 включен, а преобразования начинаются и завершаются, но теперь данные преобразования всегда равны 2048. Вот последовательный вывод всех 15 каналов, теперь в 12-битном режиме:
0
0
4095
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4095
0
0
0
0
0
0
0
0
0
0
0
0
0
@Littlegator, 👍0
Обсуждение6 ответов
Лучший ответ:
Вам нужно добавить это в свою настройку ():
pinMode(A0, INPUT);
...чтобы установить контакт для считывания.
Поскольку вы считываете вход, который уже подключен (в середине делителя напряжения), это должно быть все. Однако вы можете включить внутреннее подтягивание с помощью:
digitalWrite(A0, HIGH);
...пока PIN находится в режиме ввода.
Более подробная информация здесь:
http://arduino.cc/en/Reference/PinMode
http://arduino.cc/en/Tutorial/AnalogInputPins
Мог бы поклясться, что мне нужно что-то подобное, но этого не было ни в примере, ни в коде на веб-сайте. Тем не менее, он по-прежнему выдает только 1023., @Littlegator
Попробуйте подключить этот вывод к заземлению. Если вы все еще получаете 1023, возможно, у вас поврежден чип., @sburlappp
Значение остается неизменным независимо от того, к чему оно подключено., @Littlegator
Это похоже на сломанный чип., @Handoko
У тебя могло бы быть короткое замыкание где-нибудь., @sburlappp
Нет, вам не нужно выполнять analogRead(), поскольку чипы ATmega по умолчанию работают в режиме низкого импеданса (вход). Это было бы необходимо, если бы они настроили его на вывод, но этого сделано не было., @Anonymous Penguin
@AnnonomusPenguin: Извините за удар, но разве вы не имеете в виду "pinMode ()", а не analogRead ()
?, @CharlieHanson
pinMode(), да :-), @Anonymous Penguin
Если у вас есть вывод AREF, выведенный на экранную плату, который ни к чему не подключен, и вы не объявляете analogReference в своем коде (таким образом, сохраняя его как внутренний 5V по умолчанию), это все равно может привести к появлению симптома 1023, который вы описываете. Мое предложение: отрежьте соединительный контакт AREF или подключите постоянное напряжение 5 В к линии AREF.
Попробуйте принудительно установить значение датчика в начале цикла void равным нулю, установите короткую задержку перед считыванием аналогового вывода. Я попробовал это, и у меня это работает. Если только ваша программа prgram не будет плохо себя вести при нулевом значении датчика при каждом запуске цикла. Не будет необходимости инициализировать A0 в качестве входных данных, поскольку они вводятся по умолчанию.
Попробуйте добавить эту строку в свою void setup(), также отключите вывод AREF от любого смещения,
analogReference(INTERNAL1V1);
Ответ на тему 6-летней давности. Надеюсь, это поможет другим :)
Похоже, вы использовали внешний источник питания и подключили только положительный сердечник к контакту. Если у вас был внешний источник питания, подключали ли вы внешний источник питания GND к Arduino GND?
- Расширенная настройка АЦП на Due (SAM3X8E) для повышения точности
- Переменная устанавливает значение 32767 — MATLAB Arduino
- Двойной щелчок для аналогового датчика с порогом
- Arduino Due vs Mega 2560
- Отправка значения с одного Arduino на другой
- Использование аналогового входа для чтения кнопки
- Точность часов времени Arduino
- Как работать с аналоговыми контактами в цикле?
Вы пробовали то же самое на другом аналоговом входном выводе?, @jfpoilpret
Да, я перепробовал их все., @Littlegator