Довольно-таки часто при разработке электронных устройств, а особенно в тех случаях, когда необходима реализация длинной линии связи между несколькими устройствами, встает задача включения микроконтроллера в эту самую линию связи. В большинстве таких случаев я выбираю интерфейс RS485. Собственно поэтому пара слов об RS485.
Физически сеть RS485 представляет из себя две линии. Особенность заключается в том, что один и тот же сигнал передается сразу по этим двум упомянутым линиям за тем лишь исключением, что сигналы инвертированы друг относительно друга. Вот как это выглядит:
Казалось бы - зачем это нужно? А идея тут следующая - полезный сигнал в RS485 определяется разностью(!) потенциалов этих линий. В этом и кроется основной смысл. Смотрите сами - пусть у нас есть помеха, которая оказывает влияние на передачу данных. При использовании RS485 эта помеха окажет одинаковое влияние на обе линии (особенно, если они "скручены" в витую пару). А поскольку полезный сигнал передается через разность потенциалов, то при вычитании потенциала одной линии из потенциала другой влияние помехи самоустранится 👍
Но, поскольку используются всего две линии, то, естественно, прием и передача должны быть разделены во времени. Возможное количество приемников/передатчиков в одной сети для RS485 составляет 32 устройства. Возможная длина линии - примерно километр, даже чуть больше.
Итак, сигнал передается разностью потенциалов. Соответственно, существуют определенные диапазоны значений, в пределах которых передаваемый цифровой сигнал считается либо равным нулю, либо единице. Для RS485 диапазон напряжений для единицы - (U > 0.2В), для нуля - (U < -0.2 В). При значениях разности потенциалов, лежащих в пределах от (-200) мВ до 200 мВ сигнал считается неопределенным.
С основной теорией разобрались, теперь обсудим как все это реализовать на практике. А вопрос тут заключается скорее в том, что необходимо каким-то образом включить микроконтроллер в сеть RS485. То есть необходим некий переходник с UART'a на RS485. Возможны разные реализации, но я сегодня остановлюсь на одной, а именно на использовании микросхемы SP3485, которая представляет из себя практически законченное устройство - трансивер RS485. Причем она может легко питаться всего от +3.3 В.
Микросхема имеет 8 ножек:
- Vcc
- GND
- A и B - те самые два сигнальных провода для RS485
- DI - подключаем к Tx контроллера
- RO - подключаем к Rx UART'а
- RE и DE - подаем сигнал разрешения передачи - на практике подключаем к любому незанятому выводу микроконтроллера, а затем в программе во время передачи выставляем на выводе 1, во время приема 0
Как видите, все несложно, практически никакой внешней обвязки эта микросхема не требует, а поставленную задачу решает на ура. И на этом на сегодня заканчиваем краткий обзор, до скорого 🤝
А про RF-модули можете что нибудь опубликовать по возможности? 🙂
Постараюсь, но не обещаю в ближайшее время)
а можно RS-485 использовать для соединения "Звездой", - один мастер, и от него "лучи" к слейвам.?
Да, можно.
Для RS-485 нельзя соединять устройства "звездой"! В этом случае в сети будет много паразитных отражений сигнала, и с большой вероятностью, сеть работать не будет, либо будут частые ошибки связи (ошибки контрольной суммы, например).
Устройства в RS-485 надо соединять "гирляндой"! И во многих случаях, на концах этой линии надо ставить резисторы для согласования с волновым сопротивлением линии.
Есть система - 4 устройства и центр управления. Соединено звездой - циклы отправки/приема данных каждые 10мс. Никаких ошибок не наблюдается в течение нескольких лет, контрольные суммы совпадают. Видимо вероятность ошибок не так уж и велика.
Это хорошо, но, видимо, тут просто удачное стечение обстоятельств, длины линий и их сопротивления оказались такими, что паразитные отражения несильно искажают сигнал. Но вообще, топология "звезда" - неправильна для RS-485.
Да, забыл - в этой "гирлянде" мастер сети рекомендуется ставить с краю.
Комплект: SP3485 Transceiver+ STM32VLDiscovery
Я правильно понимаю: формируем отправку через UART_1; Transceiver_1 делает свое дело, на другом конце принимаем сигнал через Transceiver_2, UART_2? И никаких библиотек не нужно на SP3485 Transceiver ?
С одной стороны UART - Rx, Tx, с другой - RS485 - инвертированный, неинвертированный сигнал. Библиотек не надо, это законченная микросхема.