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

, 👍0

Обсуждение

Вы пробовали то же самое на другом аналоговом входном выводе?, @jfpoilpret

Да, я перепробовал их все., @Littlegator


6 ответов


Лучший ответ:

0

Я оставил всякую надежду и решил, что АЦП просто плох.

,

2

Вам нужно добавить это в свою настройку ():

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


1

Если у вас есть вывод AREF, выведенный на экранную плату, который ни к чему не подключен, и вы не объявляете analogReference в своем коде (таким образом, сохраняя его как внутренний 5V по умолчанию), это все равно может привести к появлению симптома 1023, который вы описываете. Мое предложение: отрежьте соединительный контакт AREF или подключите постоянное напряжение 5 В к линии AREF.

,

1

Попробуйте принудительно установить значение датчика в начале цикла void равным нулю, установите короткую задержку перед считыванием аналогового вывода. Я попробовал это, и у меня это работает. Если только ваша программа prgram не будет плохо себя вести при нулевом значении датчика при каждом запуске цикла. Не будет необходимости инициализировать A0 в качестве входных данных, поскольку они вводятся по умолчанию.

,

1

Попробуйте добавить эту строку в свою void setup(), также отключите вывод AREF от любого смещения,

analogReference(INTERNAL1V1); 
,

2

Ответ на тему 6-летней давности. Надеюсь, это поможет другим :)

Похоже, вы использовали внешний источник питания и подключили только положительный сердечник к контакту. Если у вас был внешний источник питания, подключали ли вы внешний источник питания GND к Arduino GND?

,