Непоследовательные результаты при чтении входных данных в поисках шаблонов всплесков
Я пишу библиотеку, которая будет взаимодействовать с блоком управления насосом компрессора холодильника ( QDZH35G). Одной из особенностей блока управления является то, что он может определять, с какими проблемами он сталкивается, и сообщать о них с помощью мигающего светодиода. Эксплуатационные ошибки приводят к тому, что светодиод мигает несколько раз. Количество вспышек зависит от того, какая именно эксплуатационная ошибка была зафиксирована. Каждая вспышка будет длиться 1/4 секунды. После фактического количества вспышек будет задержка без вспышек, так что последовательность каждой записи ошибки повторяется каждые 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 (1 мигание, затем 4-секундная пауза)
- Ошибка № 3 (3 мигания по 0,25 секунды с интервалом 0,25 секунды, затем 4-секундная пауза)
Вот скриншоты графиков (также в документах электронных таблиц Google и галерее изображений):
Наконец – вопрос.. Почему данные, видимые Arduino, кажутся значительно менее стабильными, чем данные, видимые моим осциллографом? Я знаю, что при считывании сигнала с некоторых датчиков (датчика давления, термопары и т. д.) вы получаете гораздо более точные и последовательные результаты, усредняя последние n показания, но порт диагностического напряжения на самом деле не является «датчик», это просто показания напряжения.
Кроме того, он считывает данные с насоса, питаемого от настольного блока питания постоянного тока, который имеет очень стабильное напряжение (я говорю это только потому, что знаю, что напряжение влияет на уровень пиков от диагностического порта).
@Justin, 👍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
- Чтение частоты ввода в цифровых выводах
- DHT11 аналоговый или цифровой?
- Безопасное включение делителя напряжения на аккумуляторе 12 В
- Пороговые напряжения цифрового ввода-вывода для ATmega32u4
- Проблемы с датчиками тока на эффекте Холла ACS758 — калибровка и отсутствие сигнала
- Быстрая регистрация данных
- Nano: все цифровые контакты ничего не выводят
- SD-карта readline читает пакетные строки?
**Комментарии [перенесены в чат](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