Проблема с полудуплексной связью Atmega на MAX485

Я хочу, чтобы два atmega32 обменивались данными на расстоянии 1000 футов, поэтому я решил использовать для этого последовательный провод. Я знаю, что RS232 не лучший способ связи на таком большом расстоянии, поэтому я решил использовать RS485, который является сбалансированной парой. Для этого я хочу использовать такие микросхемы MAX485.

Схема микросхемы MAX485

Теперь я написал весь код для его использования и заставил его работать для связи по короткому проводу с батареей, питающей мои ATmega (и чипы MAX485) (я не могу привести код здесь, так как он предназначен для компании, где я всего лишь стажер, но так как он работает в коротком проводе код не проблема). В основном программа делает следующее: один atmega отправляет «Paresh» по последовательному порту, другой atmega получает его, выполняет strcmp, если он действительно получен как «Paresh», он отправляет «Mathur». Если первая атмега получает «Матур», она снова посылает пареш, и цикл продолжается.

Все это прекрасно работает в последовательном режиме, на коротком проводе и на батарее 6В. Но как только я переключаюсь на кабель CAT-5, я получаю потерю пакетов. Я печатал то, что когда-либо получал на ЖК-дисплее, и после нескольких циклов (а иногда даже для первой передачи) были получены странные строки. Проблемы:

  1. Он работает для короткого провода, но не для 30-футового кабеля CAT-5.
  2. Он работает для батареи 6 В, но не для батареи 12 В или адаптера 12 В.
  3. Это работает для обычного последовательного провода до 10 футов, но не более того.

То, что я пробовал:

  1. Добавлены конденсаторы для затухания любых пульсаций в питании. (крышки 470 мкФ).
  2. Увеличены задержки между переключением из режима передачи в режим приема ( _delay_ms(3); ).
  3. добавлены колпачки в поставку к модулям.
  4. Добавление терминального сопротивления 120 Ом к обоим модулям.

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

Обновление 1: я использовал терминальное сопротивление 120 Ом. Обновление 2: у меня скорость 9600 бод.

Какая скорость передачи? Когда вы говорите, что это работает для батареи 6 В, но не для 12 В, вы используете регулятор до 5 В, верно? Можете ли вы использовать осциллограф для просмотра сигналов?
Я использую регулятор 5 В, вход регулятора меняется. Нет, у меня нет под рукой осциллографа. Скорость передачи 9600
@ Rick_2047, пора угостить босса о'скопом! Это действительно помогает иметь возможность отправлять UUUU...и проверять скорость передачи данных, скорость нарастания, сигнал вызова и т. д.
@tyblu, знаешь что смешного? мы также производим осциллограф для детей. Это больно, я знаю.
Вы правильно подключили землю между двумя узлами?
@ Эдди - Да, и я даже пытался запитать их обоих одним и тем же источником питания (независимо от цепи питания атмеги).
@ Rick_2047 - Это явно работа для осциллографа. Между вами и разработчиком в ночную смену создается впечатление, что ваша компания уже потратила больше денег на инженерное время, чем стоил бы простой осциллограф. Даже дешевый USB-прицел может очень помочь в решении подобных проблем. Работа вашего босса состоит в том, чтобы убедиться, что у вас есть правильные инструменты для работы!
Вы подключены к витой паре кабеля CAT5, а не к двум половинкам двух разных пар?
Вы нашли решение? У меня похожая проблема с ATMega32. Последовательная связь отлично работает при питании 6 В постоянного тока, подаваемом через регулятор LM7805. Но он передает ненужные символы только при питании от адаптера переменного тока. Я пробовал адаптеры переменного тока 6/7,5 и 9 В, но безуспешно.
Хитрость заключается в синхронизации переключения между режимами передачи и приема. Это решило проблему, когда мы также добавили большую емкость между землей и питанием. Но мой совет: отказаться от этой ИС можно, это просто посредственная ИС.
Я написал сообщение в блоге об использовании этих чипов: tmatthew.net/blog/long_distance_serial

Ответы (3)

По моему опыту, 99% ошибок последовательной связи связаны с несоответствием времени; другие * 99% из-за проводной шумихи.


  • Он работает для короткого провода, но не для 30-футового кабеля CAT-5.
  • Это работает для обычного последовательного провода до 10 футов, но не более того.

Кабель CAT-5 — витая пара (также все, что я использовал, тоже экранированное, но видимо это не распространено); Я предполагаю, что «обычный последовательный провод» - это два свободных провода. По мере того, как проводка становится длиннее, ваши хорошие цифровые времена нарастания растягиваются, эффективно сокращая доступное окно для выборки входящих данных. Немного помогает витая пара. На самом деле это означает, что ваши часы UART должны быть предварительно масштабированы более точно в соответствии с используемой скоростью передачи данных. Системные часы для идеальной связи USART должны быть кратны 1,8432 МГц. Связь ближнего действия может допускать погрешность в несколько процентов , но по мере того, как окно выборки сужается, она должна быть более точной. Какой у вас прескалер (int) и ошибка в бодах?

prescaler = (int)(F_CPU / (USART_baudrate * 16) - 1)
actual_baudrate = F_CPU / (prescaler * 16)
baud_error = 100% * (1 - actual_baudrate / USART_baudrate)

  • Он работает для батареи 6 В, но не для батареи 12 В или адаптера 12 В.

Это звучит подозрительно! Это может быть совершенно другая проблема, возможно, вызывающая сброс вашего виджета из-за грязного питания или плохого регулирования. Существуют проблемы со стабильностью линейных регуляторов LDO и различных емкостных нагрузок; могут быть проблемы с рассеянием от источника питания 12 В; если вы не используете регулятор LDO, то батарея на 6 В действительно будет давать вам от 4,5 до 5 В и не будет хорошо регулироваться. Проблемы с питанием относятся к отдельному классу и должны быть устранены, прежде чем можно будет эффективно отлаживать периферийные устройства.

Помимо этого, всегда есть проблема с помехами окружающей среды или электромагнитными помехами . RS-485 предназначен для этого, но его следует использовать с витой парой [экранированным проводом], как и кабель CAT-5, который вы использовали.

**(Что, моя математика неверна? Вы знаете, кто я!? ;)*

Ничего себе, это приятно (я слышал от другого разработчика, который работает в ночную смену, что проблема решена с добавлением большего количества задержек). Кстати, мой предварительный масштаб был 256 и 1024 (проверял оба) на 7. что-то вроде xtal (точное число не помню).
Комментарий новичка, но откуда мы знаем, что кабель CAT5 экранирован?
@AndrejaKo, честно говоря, я просто предполагал, что все так и было, поскольку любой кабель 5e, который я зачищал, имел оболочку, но теперь я вижу, что вы можете получить неэкранированный CAT5 . — Предположим, вам лучше просто проверить!
ХОРОШО. Спасибо, что разъяснили это. Я подумал, что может быть какой-то другой способ удаленно определить, экранирован кабель или нет.
@И: на кабеле должно быть написано «STP», а не «UTP».

Одна вещь, которую вы не упомянули, - это использование согласующих резисторов. RS485 требует оконечных резисторов в каждой точке шины, обычно 120 Ом.

Ознакомьтесь с этим документом, опубликованным Maxim по проводке RS485.

Ах, я забыл, я использовал терминальное сопротивление 120 Ом.

В настоящее время я работаю над системой безопасности дверей с магнитным замком и использую эти же чипы для передачи данных от считывателя RFID на Arduino на расстоянии около 200 футов. У меня тоже были всевозможные проблемы с этими раздражающими, но потрясающими :) чипсами. Я еще не уверен, что работаю на 100% надежно, но вот несколько вещей, которые я выяснил:

• Существует компромисс между скоростью передачи и восприимчивостью к электромагнитным помехам. MAX485 имеет высокую скорость передачи, но на него сильно влияют электромагнитные помехи. Попробуйте MAX483. Тот же чип с более низкой скоростью передачи данных, но с очень низким уровнем электромагнитных помех.

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

• Убедитесь, что контакты DE и RE подключены либо к земле, либо к +5В. Их не обязательно подключать в зависимости от того, находитесь ли вы в режиме передачи или приема, но я могу поклясться, что у меня были лучшие результаты, когда ни один из них не оставался плавающим.

Я написал сообщение в блоге об использовании этих чипов: tmatthew.net/blog/long_distance_serial