Как проверить, подключено ли что-то к аналоговому контакту?

В моем скетче у меня есть потенциометр, подключенный к A0. Значение pot используется для регулировки скорости подключенного элемента.

Я установил скорость так, чтобы она имела значение по умолчанию, но выполнение analogRead() на выводе без привязки дает случайные значения, а не значение по умолчанию. В документах говорится: "Если вывод аналогового входа ни к чему не подключен, значение, возвращаемое analogRead (), будет колебаться в зависимости от ряда факторов (например, значений других аналоговых входов, насколько близко ваша рука находится к плате и т.д.)". https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/

Как я могу проверить, связано ли что-то с A0, и если нет, то использовать значение по умолчанию?

, 👍0

Обсуждение

Не в общем смысле, нет, но непонятно, почему это проблема., @Dave Newton

вместо того чтобы соединять горшок между Vcc и Gnd, соедините его между двумя контактами данных ... установка обоих выводов данных на низкий уровень должна привести к аналоговому показанию около 0 В ... затем установите оба на ВЫСОКИЙ уровень ... и т. д. и т. д., @jsotola

@DaveNewton это как запасное значение, если банка не существует., @Steve

*В моем скетче у меня есть потенциометр, подключенный к A0 ... но выполнение analogRead() на выводе без привязки дает случайные значения, а не использует значение по умолчанию.* - Почему это проблема? - вы говорите, что у вас есть что-то связанное, но вы спрашиваете, как вы обнаруживаете, что ничего не связано. Есть ли у вас банк, подключенный к A0, или нет?, @Nick Gammon

@NickGammon это делает скетч более общим и действует как запасное значение, если банк не существует., @Steve

Я согласен с ответом Боггимена. Резистор большого значения между A0 и Gnd, по крайней мере, будет иметь тенденцию последовательно давать нулевые показания. Хотя тогда вы бы не знали, если бы горшок был просто повернут на самое низкое значение. Я не знаю, есть ли какой-то действительно надежный способ достичь того, чего вы хотите. Нет никакого "значения по умолчанию" без подтягивающего или подтягивающего резистора. Возможно, вы могли бы сделать вывод, что если бы вы получили много случайных значений за короткое время, то не было бы ничего связанного., @Nick Gammon

@NickGammon: Ваше последнее предложение - это краткое изложение ответа Джроберта. На практике аналоговые показания плавающих входов не так случайны, как можно было бы ожидать, если только у вас нет сильной емкостной связи с мощным источником шума. Однако вы можете искусственно заставить показания иметь сильные колебания, как описано в моем ответе., @Edgar Bonet

*Ваше последнее предложение является кратким изложением ответа Джроберта* - верно, и, будучи комментарием, оно не было задумано как ответ как таковой. Я заметил, что есть несколько разных способов сделать это. Может быть, констатировать очевидное? :), @Nick Gammon


3 ответа


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

6

Входной каскад аналого-цифрового преобразователя представляет собой конденсатор выборки и удержания . Когда вы принимаете аналоговое считывание, конденсатор подключается к входному контакту, он заряжается до напряжения, которое вы хотите измерить, затем отсоединяется от входа и “удерживает” напряжение во время преобразования.

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

  • возьмите показания с контакта, привязанной к GND, и отбросьте эти показания
  • возьмите показания с входного контакта и запишите их
  • возьмите показания с контакта, привязанного к +5 В, и отбросьте их
  • возьмите и запишите второе считывание с входного контакта

Если входной вывод плавающий, то первое записанное значение должно быть близко к нулю, а второе - к 1023.

Вот тестовый скетч, демонстрирующий этот подход. Он использует digitalWrite() для подключения необходимых контактов к GND и +5V, таким образом, никаких внешних подключений не требуется:

const uint8_t pin_input = A0;  // тот, который нас интересует
const uint8_t pin_low   = A1;  // будет привязан к GND
const uint8_t pin_high  = A2;  // будет привязан к +5V

void setup() {
    Serial.begin(9600);
    pinMode(pin_input, INPUT);
    pinMode(pin_low, OUTPUT);
    digitalWrite(pin_low, LOW);
    pinMode(pin_high, OUTPUT);
    digitalWrite(pin_high, HIGH);
}

void loop() {
    analogRead(pin_low);  // возьмите чтение и отбросьте его
    Serial.print(analogRead(pin_input));
    Serial.print(" ");
    analogRead(pin_high);  // возьмите чтение и отбросьте его
    Serial.println(analogRead(pin_input));
    delay(200);
}

А вот пример вывода из Arduino Uno:

167 710
271 748
287 753
287 751
284 748
281 746
279 741
271 736
268 733
264 732

Похоже, что конденсатор не очень хорошо удерживает свой заряд при последовательных показаниях. Предположительно, это вызвано паразитной емкостью входного контакта, который частично заряжает и разряжает образец и удерживает его. Тем не менее, разница между последовательными записанными показаниями (около 460) все еще очень высока, и это очень ясно показывает , что входной вывод не подключен к стабильному напряжению.

,

2

Возьмите некоторое количество аналоговых показаний за определенный период времени и посмотрите на вариации между образцами. Делайте это как с подключенным потенциометром, так и без него. Вы должны видеть очень стабильные показания при его подключении, в диапазоне от нескольких отсчетов или меньше. Без его подключения показания, скорее всего, будут охватывать почти весь диапазон A/D.

Простой способ обнаружить банк - это посмотреть на разницу между самыми высокими и самыми низкими показаниями. Выберите диапазон, который охватывает случай "банк подключен". Если разница попадает в этот диапазон, предположим, что банк подключен. В противном случае предположим, что это не так.

Вы могли бы улучшить это несколькими способами, но самый простой способ состоял бы в том, чтобы взять, скажем, 50 показаний, отсортировать их по значению, усреднить самые низкие 5 или 10 из них и усреднить самые высокие 5 или 10. Вычтите эти средние значения и действуйте, как описано выше.

,

2

Вход АЦП имеет действительно высокий импеданс (100 Мэг). Все, что вам нужно сделать, чтобы получить последовательное считывание (ноль), - это подключить его к земле через подходящий резистор. 100K, вероятно, будет в порядке, и вы могли бы уйти с 1 Meg. Он должен быть как минимум в 10 раз больше вашего горшка, чтобы избежать его загрузки при подключении.

,

Вы совершенно правы, хотя при таком расположении не было бы разницы между ничем связанным и горшком, повернутым к самой низкой установке., @Nick Gammon