Подключение микроконтроллеров к шине RS-485


• О проекте
• Обратная связь
• Полезные ссылки
• Полезные программы
• Друзья сайта


Последние комментарии

Аби: Подключение микроконтроллеров к шине RS-485
написано просто о...

Анатолий: Джойстик для денди на stm32
Автору 100500 рес...




           

Библиотека для AVR





AXLIB Генератор





Помощь сайту


				

Подключение микроконтроллеров к шине RS-485

	
	
	

Дата: 6 Июля 2015. Автор: Алексей

	
	
По просьбе читателей, в теплый летний вечер, решил написать статейку на тему подключения микроконтроллеров к шине RS-485. Начнем я думаю с самого начала. Как известно на многих, да почти на всех микроконтроллерах присутствует периферийное устройство такое как Асинхронный Приемо/Передатчик или как он по буржуйски называется UART. Правда чаще встречается USART, но отличие лишь в линии синхроимпульсов, от чего в названии появляется Синхронно/Асинхронный Приемо/Передатчик. Но по сути для RS-485 это без разницы и сути шины не меняет. И так UART. UART имеет три основные линии RX, TX и GND. Линия RX занимается приемом данных из вне в МК. Линия TX занимается отправкой данных во внешний мир. А линия GND служет для создания потенциала относительно которого бегут биты. Если рассматривать UART на уровне AVR то многие кто с ним сталкивался хорошо знают про такой регистр как UDR. Самый прикол в том, что это двойной регистр. Да, бред но по одному и томуже адресу адресуются два разных регистра. UDR чтения и UDR записи. Отчего сам UART является полно дуплексным. То есть прием и передача могут производится одновременно. Ведь у UART две линии, одна для чтения, другая для записи. Зачем я все это рассказываю. Смотрите, давайте рассмотрим физические уровни для UART. Например мы что-то передаем. Если мы посылаем единицу, то на линии RX относительно GND появляется напряжение питания, а если нам нужно передать ноль, то линия RX прижимается к GND. При чтении тоже самое. А как себя ведет RS-485. Во первых он полудуплексный. То есть может либо читать из линии, либо писать в линию. Обидно, да, но... Есть еще такая штука как RS-422. В принципе это близнецы RS-485, только один работает только на прием, а другой только на передачу, а по физическим уровням повторяют точно RS-485. Честно говоря я такие штуки ни разу не встречал. Чаще все таки используют RS-485. Замечательно, полудуплексный. И как это выглядит? А вот как. Для передачи данных в отличии от UART линии требуется лишь два провода А и В. Как происходит передача. На линии А всегда выходит прямой сигнал, то есть если ноль то на линии относительно GND питания тоже GND, а при единице напряжение питания. А в это же время на линии В выводится ровно противоположный уровень. Муторно, да. Вот для наглядности картинка линии А, линии В и как они выглядят вместе.

Уровни сигнала на линии RS-485

Следовательно мы имеем дифференциальную линию передачи. В чем прикол такой задумки. Дело в том что если мы будем передавать сигнал прямо с UART то информация будет идти относительно земли и при возникновении электромагнитной помехи, данные могут исказится, за счет поглощения ее общим проводом. А в случае дифференциальной передачи по витой паре при возникновении помехи данные не изменятся, так как передача синфазная и помеха наводится но обоих проводах одновременно одинаково. С теорией разобрались, переходим к железу. Для реализации линии RS-485 существует масса микросхем. Есть с защитой, опторазвязкой. Короче этот огород сами разбирайте и пользуйте то что вам нужно, а здесь будем рассматривать работу шины на самой простой MAX485. Данная микросхема выпускается в 8-и ногом корпусе DIP и SOIC. Я чаще использую вторую, не люблю дырки сверлить)))

MAX485

Поехали по порядку.

1 RO Выход приемника
2 RE Разрешение на прием
3 DE Разрешение на передачу
4 DI Вход передатчика
5 GND Общий
6 A Прямой вход/выход
7 B Инверсный вход/выход
8 Vcc Напряжение питания


Если внимательно присмотреться, то можно заметить что ножки управления противоположны. То есть мы их можем объединить и подавая разный сигнал заставлять работать микросхему либо на прием, либо на передачу. Вот картинка с полным подключением микросхемы.

Подключение MAX485

В принципе все понятно кроме направления. Здесь все просто, когда на линии направления ноль, то микросхема переходит в режим приемника, а если на линии единица, то работает как передатчик. Отсюда следует что для передачи данных необходимо от МК три линии. RX для чтения, TX для передачи и PortX для направления. Теперь давайте рассмотрим как подключить два МК через шину RS-485.

Подключение MAX485

Как видно из рисунка выше, обе микросхемы подключены каждая к своему МК и к своему питанию, а для связи используется лишь два провода которые соединены каждый к своему попарно. A к А, В к В. Такое подключение является самым простым и будет работать на небольших расстояниях. А что делать если нам нужно подключить два МК на большом расстоянии. Что может быть проще, делаем как было описано выше, только провод по длиннее. А вот и фигу. Так нельзя. Дело в том что два провода очень длинные и в них возникает волна при прохождении тока от передатчика до конца линии которая возвращается обратно. Это как в длинной трубе если один конец заткнут, а с другого заливать воду, то вода дойдя до конца отразится и вернется назад. Вот эта волна для шины является еще одной помехой. Решить данную проблему можно следующим образом. Берем два резистора и ставим их с обеих концов линии между А и В. Данные резисторы называются терминаторы и предназначены гасить эту волну.

Установка терминаторов

Вроде бы все, да вот приспичило еще удлинить линию. И что? А вот что. Из-за длинного провода и отсутствия общего провода на линии может возникнуть небольшой потенциал. Эта пакость может прыгать и заставлять приемники ловить мусор. Что бы этого не происходило, производители микросхем рекомендуют удерживать на линии дельту в 200мв. Это можно добиться подтягиванием линии А к питанию, а линии В к общему с каждой стороны резистором 560 Ом.

Выравнивание потенциалов

И это опять еще не все грабли. Теперь смотрим со стороны МК. При подаче питания на схему МК сначала рестартует и на некоторое время по умолчанию переводит все порты на чтение что приводит к подвешиванию линий в воздухе. При этом на линии направления передачи может возникнуть наводка и переключить микросхему шины на передачу и выплюнуть что-нибудь в эфир. Чтоб такой пакости не произошло, необходимо подтянуть резистором на 10К линию к общему проводу, дав железную команду на чтение из шины.

Жесткое чтение шины

И вторая грабля по тем же соображения требует подтяжки линии чтения к питанию. Засада в том что когда микросхема работает в режиме передачи, то она ножку приемника вешает в воздухе и небольшая помеха может создать случайный старт, UART МК начнет принимать мусор что приведет к получению ложных данных. Особенно если используется кольцевой буфер с заполнением по прерыванию.

Избавление от ложных стартов

Вот теперь вроде бы как и все. Ах да, еще рекомендуют, если линия совсем длиннющая чуть ли не километр, то необходимо витую пару брать с экраном, а концы экранов соединить с общим проводом на обеих концах для выравнивания потенциалов. Так же между общим проводом и заземлением установить резистор где-нибудь в 100R с обеих сторон. Вот теперь кажись все. Будут вопросы пишите. 


Юрий    07.07.15 11:53

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

Андрей    10.09.15 12:01

"Линия RX занимается приемом данных из вне в МК. Линия RX занимается отправкой данных во внешний мир. А линия GND служет для создания потенциала относительно которого бегут биты." - в статье опечатались, поравьте RX и TX.

Алексей    10.09.15 15:05

Спасибо. Точно, два раза RX написал. Поправил.

Владимир    16.11.15 13:40

Очень интересно! Спасибо! Буду пробовать!

Алексей    16.11.15 14:34

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

Андрей    11.01.16 13:25

Спасибо большое! Очень полезная статья!

Андрей    20.04.16 05:42

Есть ещё дуплексный вариант RS-485 (четыре провода). Хотелось, бы узнать ваше мнение и об этом варианте RS-485.

Алексей    20.04.16 08:13

Есть. Дай бог памяти он называется RS-422. Микросхема имеет четыре вывода, два на передачу и два на прием. Но в любом случае UART сам работает в полудуплексе и смысл использовать полный дуплекс не оправдан. Хотя я могу и ошибаться.

Дмитрий    20.06.16 13:45

>Чтоб такой пакости не произошло, необходимо подтянуть резистором на 10К линию к общему проводу, дав железную команду на чтение из шины. Для устройств Master и Slave подтяжка одинаковая? Или для Master лучше подтяжку к питанию, чтобы "по умолчанию" было вещание в шину? Линию DI не нужно подтягивать? А то на модулях от Aliexpress вообще все 4 линии подтянуты к питанию, а линии A и B подтянуты через 20k (у вас в статье 560 Ом): umnyjdomik.ru/wp-content/uploads/UART-TTL-RS-485-na-MAX485.jpg И как лучше всего сделать гальваническую развязку по питанию и опторазвязку по шине данных?

Алексей    20.06.16 17:48

Резисторы нужно ставить и на мастере и на слейве, так как при включении питания МК сначала ноги выставляет на чтение и через некоторое время инициализирует по программе. В это время можно наловит всякий мусор и послать на шину. Включающемуся МК это пофиг, а вот тем кто на шине сидит, не хорошо будет. Это как в кинотеатр зайти во время сеанса и громко разговаривая по телефону пробираться на свое место. Страшного ничего не произойдет только вот окружающие будут косо смотреть.))) " И как лучше всего сделать гальваническую развязку по питанию и опторазвязку по шине данных? " Использовать готовые микросхемы с гольваноразвязкой, а для питания использовать DC-DC преобразователи на физических трансформаторах. Либо использовать готовый драйвер с полной развязкой по шине и по питанию. Например такой ADM2582E

Руслан    20.04.17 22:25

Скажите пожалуйста, а про modbus протокол вам что нибудь извесно?

Алексей    21.04.17 13:33

Это промышленный протокол с открытым доступом. В сети много русскоязычной документации.

Дмитрий    26.12.17 13:45

Кстати одна из не многих толковых стаей по форме изложения.
Спасибо.

Павел    08.06.18 23:23

Спасибо за статью для чайников, особенно за вот это постепенное приближение к правильной схеме. А конденсаторов не надо куда-нибудь навтыкать для защиты от наводок?

Алексей    09.06.18 07:05

Нет.

Георгий    09.06.18 11:41

Здравствуйте, спасибо за отличную статью, как-раз сейчас делаю передатчик на max485cpa.

Вопрос - у вас в статье написано " а линии В к общему с каждой стороны резистором 560 Ом.". и так в нескольких местах в статье. А к чему "общему"?

или может быть "К общему" - имеется ввиду к общему GND?

Алексей    09.06.18 15:13

А к плюсу питания, а В к минусу питания. Эти резисторы нужны для зазора в 100мВ между линиями А и В.

Василий    16.06.18 13:05

Резисторы 560Ом вешаются на каждом устройстве в линии или только на одном или на обоих концах? Из логики описания в статье получается что эти резисторы нужны только на одном из концов линии. Но по картинке похоже что подключены к каждому из устройств.

Алексей    16.06.18 14:19

На одном. Нужно создать дельту для стабильности линии. А на конечных устройствах нужны терминаторы по 120Ом.

Василий    16.06.18 14:34

Понятно, спасибо за статью.

Ярослав    06.11.19 14:24

У меня такой вопрос, мне нужно осуществить обмен что бы при нажатии на кнопку на пульте выполнялось действие а когда действие завершиться то нужно что бы на пульте загоралась индикация, я так понимаю что нужен постоянный обмен состояниями, как осуществить синхронизацию на atmega128

Алексей    06.11.19 15:39

Для начала нужна схема. Что куда передавать, зачем, как. Нужен ли обмен данными или нет. Нажать на кнопку и получить включенный светодиод можно и одними проводами. В общем нет понимания задачи.

Аби    04.12.19 18:47

С полной ответственностью заявляю что на данный момент это единственная статья во всём интернете объясняющая ясно что и почему нужно . при чтении всех остальных сайтов по RS485 создаётся впечатление что люди пишут о том в чём они сами не разбираются . если оценивать по 5 бальной системе то статья написана на 5 с плюсом . Молодец и красавчик !

Аби    04.12.19 18:52

написано просто отлично и идеально . пожалуй во всём интернете единственная осмысленная статья по RS485. все остальные сайты написаны языком людей которые сами не понимают о чём идёт речь . Молодец и красавчик !




Чтобы вставить ссылку используйте форму вида[url]http://www.адрес.ru[/url][text]текст ссылки[/text]
Чтобы вставить код используйте форму вида[code]код[/code]

Имя:   





  







Рейтинг@Mail.ru Яндекс.Метрика