Непоследовательные результаты при чтении входных данных в поисках шаблонов всплесков

Я пишу библиотеку, которая будет взаимодействовать с блоком управления насосом компрессора холодильника ( QDZH35G). Одной из особенностей блока управления является то, что он может определять, с какими проблемами он сталкивается, и сообщать о них с помощью мигающего светодиода. Эксплуатационные ошибки приводят к тому, что светодиод мигает несколько раз. Количество вспышек зависит от того, какая именно эксплуатационная ошибка была зафиксирована. Каждая вспышка будет длиться 1/4 секунды. После фактического количества вспышек будет задержка без вспышек, так что последовательность каждой записи ошибки повторяется каждые 4 секунды.

Моя цель (применительно к этому посту) — отслеживать сигнал с диагностического провода и сообщать, какую ошибку обнаружил блок управления. Я использовал осциллограф для мониторинга диагностического порта, вот несколько его изображений (коды неисправностей 1 и 4):

Код неисправности №1 Код неисправности №4

(больше фотографий здесь)

Итак, сигнал выглядел просто и достаточно понятно. Но на всякий случай я хотел убедиться, что Arduino видит его так же, как мой осциллограф. Я подключил диагностический порт к цифровому порту 8 Arduino и аналоговому контакту A0 (я хотел контролировать оба, чтобы решить, что лучше всего для этого использовать) и загрузил следующий скетч:

#define DIGITAL_DIAGNOSTIC_PIN 8
#define ANALOG_DIAGNOSTIC_PIN A0

void setup() {        
  Serial.begin(9600);
  pinMode(DIGITAL_DIAGNOSTIC_PIN, INPUT);

  Serial.println("millis,analogRead,digitalRead");
}


void loop() {
  Serial.print(millis());
  Serial.print(",");
  int currentAnalogValue = analogRead(ANALOG_DIAGNOSTIC_PIN);
  int currentDigitalValue = digitalRead(DIGITAL_DIAGNOSTIC_PIN);

  Serial.print(currentAnalogValue);
  Serial.print(",");
  // Увеличиваем двоичный номер 1 до целого числа 1023, чтобы его было легче увидеть в журналах
  Serial.print(currentDigitalValue == 0 ? 0 : 1023); 

  Serial.println();
}

И как ни странно, сигнал, который возвращал Arduino, казалось, был повсюду как для цифровых, так и для аналоговых контактов. Хотя некоторая закономерность и была видна, это довольно большой беспорядок.

Затем я использовал CoolTerm для отслеживания и экспорта последовательных данных в файл CSV, который затем импортировал в электронную таблицу Документов Google (здесь), чтобы создать несколько графиков. Я заснял более 10 секунд в каждом из следующих сценариев:

  1. Нет неисправности/контроля (ноль мигает)
  2. Неисправность №1 (1 мигание, затем 4-секундная пауза)
  3. Ошибка № 3 (3 мигания по 0,25 секунды с интервалом 0,25 секунды, затем 4-секундная пауза)

Вот скриншоты графиков (также в документах электронных таблиц Google и галерее изображений):

График сценария управления - нет ошибок (ноль мигает) График кода неисправности 1

Наконец – вопрос.. Почему данные, видимые Arduino, кажутся значительно менее стабильными, чем данные, видимые моим осциллографом? Я знаю, что при считывании сигнала с некоторых датчиков (датчика давления, термопары и т. д.) вы получаете гораздо более точные и последовательные результаты, усредняя последние n показания, но порт диагностического напряжения на самом деле не является «датчик», это просто показания напряжения.

Кроме того, он считывает данные с насоса, питаемого от настольного блока питания постоянного тока, который имеет очень стабильное напряжение (я говорю это только потому, что знаю, что напряжение влияет на уровень пиков от диагностического порта).

, 👍1

Обсуждение

**Комментарии [перенесены в чат](https://chat.stackexchange.com/rooms/147150/discussion-on-question-by-justin-inconsistent-results-when-reading-input-looking); пожалуйста, не продолжайте обсуждение здесь.** Прежде чем оставлять комментарий под этим, пожалуйста, ознакомьтесь с [целями комментариев](/help/privileges/comment). Комментарии, которые не требуют разъяснений или предложений по улучшению, обычно размещаются в виде [ответа](/help/how-to-ответ), в [мета] или в [чате]. Комментарии продолжения обсуждения могут быть удалены., @Nick Gammon

Комментариев много, а ответов нет. Если ситуация разрешилась, напишите ответ. @Джастин, ты можешь ответить на свой вопрос, если считаешь, что у тебя есть решение. Спасибо!, @Nick Gammon


1 ответ


1

С чего начать? На вашей фотографии, сделанной в телескоп, видно около трех вертикальных делений, когда линия разлома «высокая». На маркировке внизу указано «5,00 В», что, как я предполагаю, означает «5 В на вертикальное деление». Это будет означать, что ваше «высокое» напряжение составляет около 15 В, что намного слишком высоко для максимального входного напряжения 5 В, как аналогового, так и цифрового входа на Mega.

Итак, для начала вам понадобится что-то вроде делителя напряжения 3:1. «Нижний» резистор делителя будет устанавливать выходное сопротивление ваших аналоговых (и цифровых) входов, поэтому оно должно быть достаточно низким (10 кОм или около того).

Прежде чем подключить делитель напряжения к Mega, посмотрите на выход делителя напряжения с помощью окуляра, чтобы убедиться, что «высокое» напряжение составляет <= 5 В. Затем, и только тогда, подключите выход делителя напряжения к Mega, оставив O'scope подключенным. Если вы видите большое падение «высокого» напряжения, это означает, что входное сопротивление Mega нагружает выход делителя напряжения, а это означает, что значения резистора делителя напряжения слишком велики — выберите меньшие значения (разумеется, то же соотношение).

Спецификации Arduino Mega показывают максимальную скорость около 10 000 показаний в секунду, поэтому скорость вашего контура должна быть нормальной, если соседние распечатки в миллисекундах различаются.

Я подозреваю, что вы обнаружите, что аналоговый вход Mega загружает сигнал.

,

Аналоговый вход Mega представляет собой конденсатор емкостью 14 пФ. Не совсем большая нагрузка., @Edgar Bonet

Да, это звучит правильно, но даже 14 пф могут образовывать фильтр нижних частот, если выходное сопротивление «диагностического провода» достаточно велико. Наверняка *что-то* приводит к тому, что сигнал> 5 В читается как 2 В. Вот почему я хотел убедиться, что ОП поддерживает подключение O'scope, когда они подключают диагностический провод к аналоговому входу Arduino., @user3765883

Данные OP не похожи на версию ожидаемого сигнала с фильтром нижних частот. Кроме того, чтобы RC-фильтр имел большой эффект в этом временном масштабе, вам потребуется R ≥ 200 мс / 14 пФ = 14 ГОм., @Edgar Bonet

Я думаю, вы имеете в виду 14 МОм? 200x10-3/14x10-9 = 14x10+6. Не знаю, как вы, но выходное сопротивление 14 МОм не исключено для «диагностического провода». Я не уверен, как вы пришли к выводу, что сообщаемые значения «не похожи на выходной сигнал нижних частот» — может быть, вы могли бы уточнить это?, @user3765883

Я имею в виду 14 ГОм: пикофарад равен 1e-12 Ф. Даже 14 МОм было бы необычно много для диагностического порта. Имейте в виду, что типичный прицел имеет входное сопротивление 1 МОм. Что касается «_не похоже на выходной сигнал нижних частот_»: вот как выглядит [прямоугольный сигнал через RC-фильтр](https://www.electronics-tutorials.ws/rc/rc_3.html). Ничего подобного сбору пиков в данных ОП., @Edgar Bonet

Да, вы правы, я неправильно прочитал ссылку, показывающую значения префиксов. Однако, когда я посмотрел график ОП, я пришел к выводу, что «пики» — это мгновенные показания аналого-цифрового преобразователя. Если это так, то рисование линии от «шипа» до «шипа» даст аналоговый эквивалент., @user3765883