Я хочу, чтобы два atmega32 обменивались данными на расстоянии 1000 футов, поэтому я решил использовать для этого последовательный провод. Я знаю, что RS232 не лучший способ связи на таком большом расстоянии, поэтому я решил использовать RS485, который является сбалансированной парой. Для этого я хочу использовать такие микросхемы MAX485.
Теперь я написал весь код для его использования и заставил его работать для связи по короткому проводу с батареей, питающей мои ATmega (и чипы MAX485) (я не могу привести код здесь, так как он предназначен для компании, где я всего лишь стажер, но так как он работает в коротком проводе код не проблема). В основном программа делает следующее: один atmega отправляет «Paresh» по последовательному порту, другой atmega получает его, выполняет strcmp, если он действительно получен как «Paresh», он отправляет «Mathur». Если первая атмега получает «Матур», она снова посылает пареш, и цикл продолжается.
Все это прекрасно работает в последовательном режиме, на коротком проводе и на батарее 6В. Но как только я переключаюсь на кабель CAT-5, я получаю потерю пакетов. Я печатал то, что когда-либо получал на ЖК-дисплее, и после нескольких циклов (а иногда даже для первой передачи) были получены странные строки. Проблемы:
То, что я пробовал:
Что я должен делать? Пожалуйста, не предлагайте никаких альтернатив этой вещи, это повредит хакеру во мне. Почему я не могу использовать связь RS485 именно для той цели, для которой она была разработана, т. е. связь на большие расстояния по последовательному порту.
Обновление 1: я использовал терминальное сопротивление 120 Ом. Обновление 2: у меня скорость 9600 бод.
По моему опыту, 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, который вы использовали.
**(Что, моя математика неверна? Вы знаете, кто я!? ;)*
Одна вещь, которую вы не упомянули, - это использование согласующих резисторов. RS485 требует оконечных резисторов в каждой точке шины, обычно 120 Ом.
Ознакомьтесь с этим документом, опубликованным Maxim по проводке RS485.
В настоящее время я работаю над системой безопасности дверей с магнитным замком и использую эти же чипы для передачи данных от считывателя RFID на Arduino на расстоянии около 200 футов. У меня тоже были всевозможные проблемы с этими раздражающими, но потрясающими :) чипсами. Я еще не уверен, что работаю на 100% надежно, но вот несколько вещей, которые я выяснил:
• Существует компромисс между скоростью передачи и восприимчивостью к электромагнитным помехам. MAX485 имеет высокую скорость передачи, но на него сильно влияют электромагнитные помехи. Попробуйте MAX483. Тот же чип с более низкой скоростью передачи данных, но с очень низким уровнем электромагнитных помех.
• В некоторых случаях, например, при большой длине кабеля, я обнаружил, что лучше работать без согласующего резистора... не спрашивайте меня, почему. :)
• Убедитесь, что контакты DE и RE подключены либо к земле, либо к +5В. Их не обязательно подключать в зависимости от того, находитесь ли вы в режиме передачи или приема, но я могу поклясться, что у меня были лучшие результаты, когда ни один из них не оставался плавающим.
W5VO
Рик_2047
тыблу
UUUU...
и проверять скорость передачи данных, скорость нарастания, сигнал вызова и т. д.Рик_2047
БыкМальчикОбувь
Рик_2047
семай
Джон Лопес
пользователь 2822
Рик_2047
тибро0103