Почему линии A и B имеют ВЫСОКИЙ уровень в состоянии простоя (rs485)

Я использую Modbus RTU через RS485 для проекта. Я использую RaspberryPI в качестве ведущего устройства и Arduino Pro Mini в качестве ведомого устройства.

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

Я попытался диагностировать его с помощью логического анализатора, и результаты следующие: В режиме ожидания линии A и B от ведущего устройства соответственно ВЫСОКИЙ и НИЗКИЙ. В режиме ожидания обе линии A и B от подчиненного устройства имеют ВЫСОКИЙ уровень.

Интересно, не должна ли линия B быть НИЗКОЙ? Посмотрев, почему эта линия была ВЫСОКОЙ, я обнаружил, что линия вытягивается ВЫСОКОЙ из-за библиотеки, которую я использую на Arduino. Эта библиотека устанавливает DE и RE HIGH при передаче данных и LOW в противном случае. (На модуле max485 я связал DE и RE вместе. Я не уверен, что это хорошая практика)

Вот библиотека, которую я использую на arduino: https://platformio.org/lib/show/1727/ModbusSerial

Вот схема ведомого модуля Modbus:введите описание изображения здесь

РЕДАКТИРОВАТЬ :

На логическом анализаторе (1 ведомое устройство подключено к ведущему):

Я пробовал с двумя разными трансиверами usb/rs485.

Трансивер 1 - 3 секунды записивведите описание изображения здесь

Приемопередатчик 1 - Масштабирование по запросу/ответувведите описание изображения здесь

Трансивер 2 - 3 секунды записивведите описание изображения здесь

Приемопередатчик 2 - Масштаб по запросу/ответувведите описание изображения здесь

Итак, мой вопрос: нормально ли получать HIGH на обеих линиях A и B? И если нет, то что я могу сделать, чтобы исправить это?

Заранее спасибо !!

Кстати, это не схема, это красивое изображение проводов. И как таковой, совершенно бесполезен без фактической схемы.
Хорошо @Lundin. я добавил схему
Это все еще не схема, но мне достаточно, чтобы заметить одну проблему. Надлежащая схема также должна содержать такие элементы, как развязывающий колпачок, терминатор шины и т. д. И обычно на линии rx UART имеется подтяжка, если она не имеется на кристалле.
Я только начинающий в электронике. Мои навыки очень ограничены. Я не использовал развязывающий конденсатор. Может быть, это было бы очень полезно, но я не знаю, почему... Что касается оконечной нагрузки шины, я не использовал никакого резистора, потому что в моем случае он кажется ненужным (я сделал расчет). Что касается подтягивания на линии rx, опять же, я не знал, что должен это делать и зачем. Я узнаю об этом. Спасибо
Прочтите что-нибудь о RS-485: в режиме ожидания они должны быть около 2,5 В. При передаче AB>=0,5 вольт или BA>=0,5 (знак или пробел). Обычно делается смещение (с подтягиванием вверх и вниз), чтобы держать A немного выше, чем B, чтобы избежать того, что, когда линия простаивает, шум вызывает нежелательный прием.
Что касается развязывающего колпачка, просто поместите колпачок на 100 нФ с одним контактом как можно ближе к контакту питания MAX485, а другой контакт соедините с землей. Как правило, каждая отдельная ИС должна иметь такую, если только ее техническое описание не содержит более конкретных требований.

Ответы (3)

В состоянии простоя линии A и B от ведущего устройства соответственно ВЫСОКИЙ и НИЗКИЙ.

Это связано с тем, что интерфейс RS485 выдает состояние бездействия, т.е. B является обратным A, потому что передатчик включен.

В режиме ожидания обе линии A и B от подчиненного устройства имеют ВЫСОКИЙ уровень.

Это связано с тем, что ведомое устройство настроено на прием данных, а микросхема RS485 не контролирует линии. Вероятной причиной этого являются внешние подтягивания.

Если бы ведущий и ведомый были подключены, то ведущий (хотя и бездействующий) управлял бы линией вверх и вниз, и вы бы видели высокие и низкие уровни на ведомом.

Спасибо за Ваш ответ! Попробовал подключить мастер и слейв и добавил к вопросу картинку из логического анализатора. Думаете, в захвате все нормально? Когда мастер отправляет запрос, B не является инверсией A, потому что линия B имеет ВЫСОКИЙ уровень. Это правильное поведение?
Совсем не похоже на правильное поведение. Когда ведущий или ведомый передает, B является обратным A. Похоже, драйвер на ведущем неисправен.
Я так и думал! Что такое драйвер? Библиотека программного обеспечения или трансивер usb rs485?
Я предполагаю, что приемопередатчик 485 - судя по внешнему виду, он должен быть аппаратным, и я не вижу, чтобы он был программным, если только не происходит что-то очень странное, например, контакт направления закорачивается на контакт данных.
Хорошо. Пробовал с другим трансивером. Я добавил захваты к вопросу. Сигнал запроса/ответа выглядит лучше, но линия теперь очень шумная, как вы можете видеть. Каково твое мнение ?
Я смотрю на 4-е фото (последнее), и теперь оно выглядит нормально. Где ты видишь шум?
Ок, отлично ! Я назвал это шумом, потому что не знаю, что это такое, я просто думаю, что его там быть не должно. 3-я картинка должна быть похожа на первую. В этом тесте мастер запрашивает значения 5 ведомых только один раз в секунду.
Итак, похоже, чип драйвера master 485 был неисправен. Это то, что вы думаете?
Да, первый трансивер, вероятно, был неисправен (это дешевая китайщина, так что я не удивлен). Я вижу, что с новым сигналом все в порядке (и это делает меня счастливым), но я все еще удивляюсь, почему я получаю такой загрязненный сигнал? 3-е изображение должно быть точно таким же, как и первое. У тебя нет идеи? Спасибо за ваше время, Энди. Я очень ценю это.
Очень сложно диагностировать вещи с ограниченными данными, и этот сайт не об этом. Хотя рад, что помог.

RS485 (TIA485) может быть тристатирован в режиме ожидания. Если это так, завершения будут определять состояние линий. Возможно, Pi подключает их иначе, чем Arduino.

Ваше подключение к /RE и DE неверно. Если вы посмотрите техническое описание MAX485 и его друзей, вы увидите, что /RE активен на низком уровне, а DE активен на высоком уровне. Если к обоим этим контактам подключить подтягивающее напряжение, один из них сработает. Просто соедините /RE с землей и DE с Vcc.

введите описание изображения здесь

Спасибо за ответ Лундин. Я получил этот трюк из другого поста на этом форуме. ( electronics.stackexchange.com/a/470391/237592 ). Тем не менее, я удалил этот подтягивающий резистор из модуля для своих тестов в этом посте. Я должен был удалить его из схемы.
Если вы привяжете DE к Vcc, линия всегда будет управляемой, а это неверно для полудуплексной линии (или шины, если хотите). Вы можете привязать RE_ к GND, если хотите: вы будете получать все, включая то, что вы передаете сами.
Тот факт, что RE_ отрицается, а DE нет, позволяет делать то, что делал OP, соединять их вместе, и с помощью одного провода вы управляете движением линии, не получая эха. Или вы привязываете RE_ и гоните только DE, и получаете эхо того, что вы передаете (а если вы плохо передаете, вы плохо принимаете, так что это дополнительная проверка).
@linuxfansaysReinstateMonica Ну, это зависит от того, хотите ли вы полудуплекс или полный дуплекс, хотя в последнем случае, я полагаю, будет дополнительный трансивер (RS-422). Однако это подтягивание объяснит состояния простоя, которые испытывает OP.
Кажется, вопрос касается многоабонентского интерфейса RS-485, а не RS-422. На схеме я вижу подтягивание, а не подтягивание. Я считаю, что нехорошо держать линию включенной, если она не запрашивается: она может потреблять хорошую мощность впустую (сотни тысяч мА).
@linuxfansaysReinstateMonica Ну, это, очевидно, проект для любителей, поэтому потребление тока не должно вызывать большого беспокойства. Речь идет о том, чтобы некоторые вещи Arduino работали на рабочем столе для развлечения, а не о создании реального продукта.