Конденсатор в переключателе уровня RS232. Данные строго полудуплексные

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

Я создал переключатель уровня, очень похожий на схему по адресу: http://picprojects.org.uk/projects/simpleSIO/ssio.htm , за исключением конденсатора, который я использую 47 нФ, потому что на странице указано:

при высоких скоростях передачи данных конденсатор емкостью 100 нФ может привести к искажению сигнала до такой степени, что он не сможет быть правильно принят, и в этом случае попробуйте заменить конденсатор емкостью 100 нФ на емкость 47 нФ или даже 22 нФ. Если связь строго полудуплексная, конденсатор может вообще не понадобиться.

Но нет упоминания о том, какое значение конденсатора лучше и почему.

Затем я вижу это:

Если хост передает много нулевых (пустых) данных в потоке, конденсатор разрядится, потому что в RS232 нулевые биты передаются как положительное напряжение, а единицы — как отрицательное. Поскольку цепи требуется отрицательное напряжение для зарядки конденсатора, это также вызовет проблемы при передаче данных обратно на хост.

Это говорит о том, что мне нужен конденсатор большего размера, чем во многих других схемах.

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

Что я должен делать? Должен ли я удалить конденсатор? изменить его значение? или снизить скорость передачи данных? и нет, я не хочу выбрасывать всю свою схему в мусорное ведро только для того, чтобы переделать ее на микросхему max232. У меня таких нет и стоят они недешево.

Вы также можете решить эту проблему, используя протокол, который передает 50% 0
@Mike: Почему ты не вставил схему? Чем проще вы сделаете это для своих читателей, тем больше у вас шансов получить хорошие ответы. Зафиксированный.
Если я сделаю 50% нулей, то это создаст нагрузку на процессоры микроконтроллеров, к которым они подключены, поскольку они должны преобразовывать данные, и скорость в лучшем случае уменьшится вдвое.
Честно говоря, сделайте себе одолжение, используйте MAX3232 и забудьте об этой дрянной схеме взлома.

Ответы (1)

Вероятно, проще понять вашу схему, если она нарисована немного по-другому:

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

Теперь легко увидеть, что выполняются три различные функции.

  1. Цепь связи, идущая от PIC к DB9.
  2. Цепь связи, идущая от DB9 к PIC.
  3. Схема для создания отрицательной шины питания.

Верхняя схема должна передавать на интерфейс DB9, используя значения напряжения RS-232. Для этого ему нужны как положительные, так и отрицательные шины напряжения. Но номинально вашему ПОС нужна только положительная шина. Поэтому для создания отрицательного рельса необходимо что-то дополнительное.

Нижняя цепь должна получать от интерфейса DB9 с использованием уровней напряжения RS-232. Но с этим намного проще справиться, и для этой подсхемы нет необходимости в отрицательной шине питания.

Отрицательная шина питания разработана в предположении , что ваш интерфейс DB9 подключен к настоящему устройству RS-232. Обычно значение "MARK" DB9 TxD представляет собой отрицательное напряжение -- где-то между 3 В и 15 В . (Надеюсь, с величиной не просто соскабливать.) Поскольку DB9 должен время от времени выдавать «MARK» (стоповый бит, по крайней мере, один раз на байт), всегда будет доступ к этому напряжению на мгновение в период каждого символа. Диод Д 1 позволяет этому отрицательному напряжению проходить и заряжать С 1 к отрицательному напряжению. Затем это может быть использовано первой схемой (цепью PIC TxD) для получения допустимых значений отрицательного напряжения, не заставляя вас добавлять источник питания отрицательного напряжения к вашей PIC. Вместо этого он «крадет» отрицательное питание из соединения DB9.

Это серьезный «обман». И это не может всегда хорошо работать во всех обстоятельствах. Само содержание данных, которые вы получаете на PIC, влияет на то, насколько хорошо они работают, когда PIC передает. Вот почему здесь есть своего рода балансировка. Если конденсатор слишком велик, то для его зарядки потребуется время, а MARK стопового бита (и/или некоторых значений MARK данных) может быть недостаточно для достаточно быстрой зарядки. Если конденсатор слишком мал, то он слишком быстро разряжается, поскольку PIC передает MARKs на DB9.

Нет никакой гарантии, что эта схема всегда будет работать при любых обстоятельствах. Драйвер DB9 TxD ожидает увидеть загрузку между 3 к Ом и 7 к Ом , обслуживание памяти. А не нагрузку конденсатора через диод! Схема PIC RxD уже загружает все как есть. Таким образом, схема делает некоторые серьезные предположения о выходном импедансе управляющей схемы DB9 TxD.


Этот тип схемы безопаснее использовать в ситуациях, когда вы заранее знаете продолжительность и интервалы между задержками между передачами, идущими от DB9 к вам. Это связано с тем, что в течение времени между передачами линия DB9 TxD будет находиться в состоянии MARK и питать ваш конденсатор. Чем больше процент времени, в течение которого линия DB9 TxD остается в состоянии MARK, а также то, что задержки между ними не слишком велики, тем больше вы уверены, что конденсатор заряжен достаточно хорошо для передачи в другое направление. И это также может позволить вам использовать конденсаторы большего размера, которые затем позволят вам передавать данные в другом направлении в течение более длительных периодов (или с более нулевым содержимым битов).


Схема представляет собой хак, который я впервые увидел в 1970-х годах, когда микроконтроллеры впервые начали распространяться среди широкой публики, а RS-232 широко использовался. У нас было ровно два общих чипа для RS-232, MC1488 и MC1489 (Джим Томпсон виноват в этих горящих ГОРЯЧИХ мощниках — см.: Analog Innovations (сейчас на машине WayBack)) и для них требовались отдельные шины питания. Все это стоит денег, места, времени и так далее. Таким образом, такой взлом был почти «легким делом», поскольку скорость передачи в то время была гораздо чаще около 300 бит/с и почти никогда не превышала 9600 бит/с. (Связь на скорости 9600 бит/с была в значительной степени зарезервирована для очень дорогих телефонных аппаратов Bell, к которым мало кто из нас имел доступ.) Это потому, что мы обычно использовали RS-232 для связи между терминалом (ASR-33, Diablo 1600 и т. д.) и модем. Не между двумя соседними микро. Скорость RS-232 быстро росла по мере того, как использовались более новые и дешевые «стеклянные терминалы» (например, комплект ADM-3A, который я построил), где более высокие скорости были полезны. Но даже тогда,

Однако в начале-середине 1980-х скорости действительно быстро росли. И хак застрял. Но я думаю, что вы довольно сильно порете слабую лошадь, и ее кодовая дата уже давно просрочена. Есть слишком много других хороших вариантов, которых у нас НЕ было тогда. В то время тарифы были достаточно низкими (в основном), а вариантов было мало (без дешевых переключателей, без MAX232 и т. д.), а требуемая мощность и рассеиваемая мощность были настолько большими, что время от времени это можно было оправдать. Но сегодня скорости намного выше, а количество действительно хороших вариантов настолько больше, что я больше не могу придумать веской причины для использования этой древней техники.


Заключительные заметки. Еще один трюк во всем этом заключается в использовании, если у вас есть к нему доступ, линии вывода сигнала RS-232 на DB9, отличной от TxD. Например, есть четыре общих сигнала, называемых DTR, DSR, RTS и CTS. (Есть еще две, RI и DCD, но они больше требуются модему и менее вероятны.) Если вы можете определить, являются ли какие-либо из этих линий выходами на вашем интерфейсе RS-232, и можете убедиться, состояние MARK, тогда вы можете использовать один из них в качестве отрицательной шины (или использовать их для зарядки этого конденсатора). Так что это может быть еще одним вариантом для рассмотрения.

О, хорошо, но есть ли уравнение, которое я могу использовать для определения наилучшего значения конденсатора?
@Mike Нет, нет, потому что у вас нет необходимой информации о другом конце управляющей цепи DB9 TxD. Если бы вы предположили, что это выход с нулевым импедансом, то конденсатор заряжался бы почти мгновенно всего одним стоповым битом, и вы бы просто использовали самый большой конденсатор, который вам нужен, и покончили бы с этим. Он заряжался с первой MARK и никогда не разряжался, потому что у него был такой большой конденсатор. Причина, по которой вы не можете измерить его с помощью уравнения, заключается в том, что вы не знаете, какие данные передаются, и вы не знаете схему. Это уравновешивание без страховки.
@Mike Если вы можете контролировать содержимое сообщений, например, если вы можете гарантировать, что определенные данные с определенными значениями передаются вам с определенными интервалами (или если вы можете обеспечить определенные «мертвые времена» между передачами), то уравнение может быть аппроксимировано делая некоторые обоснованные предположения о драйвере вместе с предположениями о наихудшем случае о данных, которые вы передаете в DB9 (возможно).
@Mike Но позвольте мне быть абсолютно ясным в этом вопросе: схема ВООБЩЕ НЕ РАБОТАЕТ, если вы удалите конденсатор. Так что у вас нет выбора по этому поводу.
@mike Я добавил последнее примечание к своему ответу, которое может быть полезно в вашем случае - в зависимости от того, что именно подключено к DB9.
Хорошо, да, я контролирую данные, которые будут отправлены. Помогло бы мне, если бы я сделал каждый второй байт данных всеми старшими или всеми младшими (пример: ffh или 00h) или если бы я использовал чередующиеся значения в битах для второго байта (примеры значений: a5h или 5ah)?
О, я только что прочитал твой ответ. Я попытаюсь сделать каждый второй байт данных специальным байтом, чтобы позволить конденсатору функционировать, и если это сработает, я смогу получить скорость не менее 56 000 на скорости 115 000 бод.
@Mike Это подход, который стоит попробовать. Если у вас есть контроль над этим, вы, вероятно, можете заставить это работать.
хорошо, позвольте мне попытаться понять... Если я заменю конденсатор на большой, то я сделаю задержку передачи с ПК (отправлю все МЕТКИ) на RC (время, определяемое резистором-конденсатором) секунд после отправки чего-либо, затем микро имеет только секунды RC для передачи на ПК, только если ПК отправляет пробелы вместо меток? (извините, я пытаюсь придумать уравнение)
@Mike Если вы используете большой конденсатор и даете ему время для полной зарядки, прежде чем начинать какую-либо связь в любом направлении, тогда вы сможете легко измерить это напряжение с помощью измерителя и увидеть, что времени, которое вы выделили, было достаточно. Вы можете решить это для любого конденсатора, который вы выберете, просто наблюдая и видя. И если вы хотите использовать достаточно большой конденсатор и записывать время и значения измерений с вашего измерителя, вы можете даже определить сопротивление источника того, к чему вы подключены.
@Mike В любом случае, да, можно использовать эксперименты и измерение результатов, которые вы получаете, чтобы разработать стратегию для любого конденсатора (я имею в виду тот, который не слишком мал, чтобы обрабатывать даже передачу одного байта) и устройство DB9 вы подключаетесь. Обратите внимание, что это может отличаться для разных используемых вами устройств DB9. Вы можете использовать несколько и найти стратегию, которая работает для всех. Но это требует времени, конечно, и измерений. Здесь поможет прицел, и есть ОЧЕНЬ дешевые (15-20 долларов США) «прицелы», которых будет достаточно для этой работы.