Question:
Un bon moyen d'activer automatiquement un émetteur RS-485 dans le matériel?
fred basset
2013-04-17 02:41:53 UTC
view on stackexchange narkive permalink

Est-ce que quelqu'un connaît un bon circuit qui permettrait automatiquement la transmission sur un pilote RS-485 lorsque les caractères sont transmis? Dans nos conceptions, nous utilisons actuellement RTS pour piloter la broche de transmission du pilote, mais ensuite la signalisation RTS doit être effectuée dans le logiciel.

Notez que la solution devrait être assez bon marché car ce sera un produit de volume ( sorte d'exclure l'utilisation d'un microcontrôleur séparé pour faire le travail). Garder la transmission activée plus longtemps que nécessaire serait également un problème, car la ligne série peut devoir gérer beaucoup de trafic.

Cinq réponses:
Dave Tweed
2013-04-17 07:21:03 UTC
view on stackexchange narkive permalink

Si vous utilisez un protocole asynchrone ordinaire (UART), avec un bit de début au début de chaque octet, une méthode simple consiste à utiliser un multivibrateur monostable (même le redouté 555) réglé sur la durée d'un octet plus le bit de début et environ la moitié du bit d'arrêt, et utilisez-le pour activer le pilote de transmission.

Si le multivibrateur est redéclenchable, vous devez attendre jusqu'à un octet complet à partir de la fin d'une transmission avant que quiconque else peut transmettre, car le multivibrateur peut avoir été redéclenché par le dernier bit de données s'il s'agissait d'un zéro.

Sinon, il devrait s'éteindre au milieu de chaque bit d'arrêt, puis se déclencher à nouveau le prochain bit de départ.

J'aimerais voir ça.
Ça semble bon. Dans le circuit actuel, les gars du matériel ont conçu le lecteur de transmission de la puce de pilote RS-485 est lié à la broche de transmission TTL, donc sur chaque * bit * la transmission est activée. Je ne vois pas comment cela fonctionnerait de manière fiable, mais je vais le tester dans les prochains jours ...
Il est possible que l'intention soit de faire fonctionner le bus comme un bus pseudo-CAN, avec un état "dominant" et un état "récessif". Les gars du matériel ont-ils mis des résistances de pullup / pulldown assez rigides sur les lignes de bus?
Je vois des résistances de 750 ohms sur les lignes RX + et RX-, je ne sais pas si cette valeur est assez rigide ou non. Comment tout le RS-485 fonctionnerait-il comme un bus CAN? Je n'ai jamais utilisé RS-485 en mode de base à deux fils auparavant.
750 Ohms compteraient comme "assez rigides" (6,67 mA @ 5V), c'est probablement ce qui se passe. En ce qui concerne le fonctionnement du RS-485, il devrait fonctionner comme prévu; c'est juste qu'aucun dommage physique ne peut survenir à la suite de collisions avec cette configuration matérielle.
Darian
2013-06-20 11:59:16 UTC
view on stackexchange narkive permalink

Eh bien, "bien" est un terme vague, mais vous avez dit "bon marché" ...

La solution la plus simple à cela que j'ai vue et testée moi-même est d'utiliser un transistor PNP et un réseau RC . L'exemple suivant est destiné à 9600 bauds, donc une résistance de 22k et un condensateur 1n5 sont utilisés. Ces valeurs seraient modifiées pour différents débits en bauds.

Ce n'est en aucun cas une solution élégante, mais elle est simple et peut être construite à partir du bac de pièces.

Voici le schéma:

schematic

simuler ce circuit - Schéma créé à l'aide de CircuitLab

supercat
2013-04-17 03:12:52 UTC
view on stackexchange narkive permalink

Votre meilleur pari serait probablement d'utiliser un petit microcontrôleur (probablement avec un UART, bien que le bit-banging logiciel puisse suffire) qui prend un signal "data in" et génère à la fois "data out" et "transmission enable". Vous devriez probablement avoir une interruption déclenchée par un front sur la broche "data in" qui affirme votre signal "data out" avant même qu'un octet n'ait été entièrement reçu, de sorte que dès que l'octet complet est reçu, vous pouvez commencer à le transmettre (c'est normalement une bonne idée pour affirmer la validation de transmission un peu avant que la transmission ne commence réellement). Après un certain temps sans front descendant ni caractère complètement reçu, désactivez la broche d'activation de transmission.

L'approche ci-dessus introduirait un délai d'un temps de caractère complet entre le moment où le processeur reçoit données et quand il sort le fil. Dans certains cas, il peut être souhaitable de réduire ce temps. Pour ce faire, il faudrait utiliser un logiciel bit-bang UART au lieu d'un matériel UART. Obtenir la synchronisation correcte à des débits binaires plus élevés serait difficile, mais on pourrait avoir un contrôle beaucoup plus fin sur la synchronisation des données entrantes et sortantes.

Ça semble bon. Dans le circuit actuel, les gars du matériel ont conçu le lecteur de transmission de la puce de pilote RS-485 est lié à la broche de transmission TTL, donc sur chaque * bit * la transmission est activée. Je ne vois pas comment cela fonctionnerait de manière fiable, mais je vais le tester dans les prochains jours ...
Ils peuvent se fier au fait qu'une ligne RS-485 inactive prendra généralement, espérons-le, un état de marquage. À de faibles débits en bauds, dans des environnements relativement calmes, cela pourrait fonctionner. Il pourrait même fonctionner à des débits en bauds modérés si la ligne d'activation était plus lente à répondre que la ligne de données (de sorte que chaque transition d'espace à marque produirait brièvement une condition d'espacement appropriée avant de passer au ralenti). L'immunité au bruit ne serait cependant pas très bonne.
Andy aka
2013-04-17 14:22:38 UTC
view on stackexchange narkive permalink

J'ai vu un circuit qui a probablement résolu ce problème. Le CPU était un esclave sur le RS485 et était donc normalement en mode réception en attente du message d'identification correct, après quoi il transmettrait sa réponse. La puce RS485 a été activée pour la transmission par le front avant du 1er bit dans la réponse de données provenant du CPU lors de la réponse. Une diode, un condensateur et une résistance agencés pour activer rapidement la puce en mode émission, et des transitions de données successives la maintiennent en mode émission. À la fin de la transmission, le capuchon se déchargerait à travers la résistance et après quelques dizaines de millisecondes, la puce revenait en mode réception.

Il y a deux problèmes avec cela - le premier bit transmis était légèrement court d'environ 10% et cela peut vous causer des problèmes. Je suis sûr qu'un meilleur circuit pourrait être développé, mais il y aura toujours un raccourcissement du 1er bit car celui-ci est utilisé pour "détecter" un signal de transmission et permettre au RS485 de transmettre. Le deuxième problème est que le circuit de validation de transmission est resté actif pendant quelques dizaines de millisecondes après la fin de la transmission depuis l'esclave et cela empêche bien sûr le maître d'interroger un autre esclave pendant cette période.

Si ces "issues" c'est OK alors pas de problème, ça fonctionnera

Si la ligne RS-485 maintiendra de manière fiable une condition de «marquage» lorsque personne ne transmet, on pourrait probablement simplifier les choses en ayant un registre à décalage qui fonctionne à un débit beaucoup plus rapide que le débit binaire, en utilisant la prise du milieu comme données vers le Puce RS-485, et le "ET" de nombreux autres robinets comme "activer". Par exemple, si l'on avait une horloge qui était au moins 16x la vitesse de transmission, on pourrait utiliser un registre à décalage 2x64 bits avec des prises tous les 16 bits. Si par exemple l'horloge était 32x la vitesse de transmission, puis l'appareil serait activé deux fois avant que les données ne lui soient transmises, et ...
... restent activés deux fois après le dernier front descendant. Deux temps de bit devraient être suffisamment de temps pour que le conducteur commence le marquage; même si le pilote est désactivé au milieu du type, la ligne doit rester marquante jusqu'à la fin. Si la ligne ne peut pas être invoquée pour rester dans un état de marquage lorsque personne ne transmet, alors il faut activer son pilote un temps d'octet complet avant de transmettre.
Shane
2014-12-17 09:41:22 UTC
view on stackexchange narkive permalink

Je cherchais une solution similaire mais j'avais besoin d'un timing très précis car le bus fonctionne à 90% de sa capacité. Je ne pouvais pas me permettre d'avoir plus d'un demi-peu de longueur de dépassement. Je dois désactiver de manière fiable le Tx dans les 2uS de la fin du bit d'arrêt.

Ma solution consistait à utiliser une bascule de type S / RD pour verrouiller le bit de démarrage, puis l'enfoncer dans une puce de synchronisation LTC ( LTC6994), ceux-ci fournissent une précision de 3% au débit en bauds dont j'avais besoin de 230 kbps. La sortie de la puce de synchronisation entraîne la réinitialisation sur le type D.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...