Suche Pegelwandler

Nun ja, das Problem scheint ja etwas komplexer zu sein als gedacht.
1.: Ich wusste nicht dass echtes RS232 inventiert ist.
2.: Ich hatte gedacht es gibt eine eierlegende Wollmilchsau. Irgendetwas in der Art sitzt ja auch auf dem AVR Dragon drauf (allerdings nur für 1,dickemilch bis 5,dickemilch Volt). Würde die negativen Spannungen nicht abdecken.

Plan war das schon mit zu integrieren (muss dann aber klein sein, so ein MAX232 würde grade noch gehen), worst case extern. Die AVR Spannung (3,3..5V) ist verfügbar, Strom ist mehr als genug verfügbar (>500mA). Die +15V*/-15V* könnte man ja zur Not über die Statusleitungen beziehen. Beim P3315 passiert es z. B. genau so. Muss ja nich gleich MAX-typisch mit Ladungspumpe sein. Wirklich benötigt werden eh nur die Datenleitungen (TxD, RxD).
 
3V3-TTL<-->5V-TTL wäre kein Thema, da gibts Steine die eigentlich auf 3V3 arbeiten, aber 5V-tolerant sind. Auf der anderen Seite wird ein 3V3-high auch bei 5V-TTL noch(!) als Hi erkannt.
Bei 1,?V-TTL ... hmm... keine Ahnung.
Das Problem bei den meisten Levelshiftern wäre, daß Du die Versorgungsspannungen beider(!) Seiten bräuchtest - der von mir anfangs erwähnte ADUM5201 besitzt einen internen DC-DC, wobei Du dessen Ausgangsspannung einstellen kannst.
Beim RS232 hast Du ja nicht nur die Invertierung, sondern für 'ne "1" sogar 'ne negative Spannung.
Bei DER Grossenanforderung ist das 'ne Herausforderung...
Vielleicht mit'nem kleinen Controller (den Tiny25/45/85 gibts zB als TSSOP (der hätte sogar inerne 16MHz), noch kleinere wie den Tiny20-UUR willst Du nicht verbauen) und ein paar Komparator-Gates - und den µC das mit 'nem fixen ASM selbst hin und herschaufeln lassen...
Aber selbst dann brauchst Du diverses Hühnerfutter drumrum und irgendwelche Treiberstufen für den sendenden RS232-Zweig...
 
Nochwas zu "das mit'nem kleinen µC selbst machen" (in einer Eigenen Antwort):
Ich sehe 2 Wege:
1.: man teilt das eingehende Tx mittels Spannungsteiler sinnig zu Gnd hin (also zB von +/-15V zu +/-2,5V), addiert die mittels OPAMP mit festen 2,5V und läßt das den ADC messen
2.: man erfaßt mit 3 I/O-Pins die möglichen Schwellwertüberschreitungen ( <3V, >1,?V, >3,?V oder was das war)
Bei 1tens würde man nur einen I/O benötigen, allerdings vom Tempo her durch den ADC limitiert.
2tens wäre in ASM ziemlich fix, benötigt aber 3 I/Os, und irgendwas zur Pegelanpassung.
Optokoppler hat Anabel abgelehnt, Komparatoren kosten viel Platz.
Möglich wären vielleicht auch 3 Transistoren/FETs (mit möglichst großer Verstärkung) etc. Zwei je so mit 'nem Spannungsteiler zwischen Tx und Gnd, daß sie eben bei den kritischen Spannungen durchschalten.
Der dritte Transistor dann mit 'nem Spannungsteiler zwischen 5V und TX, daß er unter -3V durchschaltet.
Die 3 Signale dann an den Controller,
2 Beine für die TTL-Seite,
um selbst die 3 möglichen Spannungen auf den Fragezeichen-Rx zu legen nochmal 3 Treibertransistoren, die durch 3 Beine angesteuert werden.
Also ein SOIC14, 6 Transen (ggf Doppeltransistoren in SOT23-6) und ein paar Widerstände.
Alabel? Machbar?
 
Hmmm. Ich schmeiß auch mal ne Idee in den Raum. Nennen wir sie Nummer 3.

RXD runter teilen von ±10V auf ±5V. Eine Z-Diode sollte Überspannung (sollten es tatsächlich mal ±15V sein) wie auch negative Spannungen verhindern. (ja, ich mag Z-Dioden ^^) Ok, belastet die Leitung ein wenig, aber wenn der Teiler hochohmig genug ist sollte das kein Problem sein. (?)
Damit sollte es auch mit 5V und 3V3 funktionieren, sofern mein Halsverschluss noch funktioniert. 1V? kA, nutze ich nie.
Das wäre die digitale Seite. Dazu die analoge die misst ob die Spannung > sagen wir 9V ist. Wenn ja inventieren, sonst nicht. Sollte n Tiny eigentlich packen. Input auf INT0, per Software einfach an einen anderen Pin weiter reichen (ggf. halt inventiert). Da ist die Geschwindigkeit vom ADC ja auch irrelevant, tendenziell ändert sich der Spannungspegel ja nicht so schnell von ±15, 0..3V3, 0..5V0 Volt :))
ADC schaltet denn nur um ob inventiert wird oder nicht.

TXD müssten doch 2 MOSFETs reichen die die Spannungen (positiv wie negativ) von RTS und CTS beziehen. Der Empfänger bekommt quasi seine eigene Spannung retour. Muss natürlich auch wieder durch den Tiny durch zwecks ggf. Inventierung. INT1 zu anderem Pin.

Wäre dann ein Tiny, 2 Mosfets und 2 Widerstände und 1 Z-Diode.
Oder geistiger Dünnschiss. Probiert hab ich noch nix.
 
Zuletzt bearbeitet:
Wie willst Du dann die logische 1 bei Rs232 erkennen, also Pegel kleiner -3V?
Und wie sollen die 4 (hatte 3V3 vergessen) möglichen Pegel ausgegeben werden?
Also willst Du Dich da an echte 5V/3V3 als Hi halten, oder willst Du den Controller einfach 3V3 ausgeben lassen (was 5V-TTL eigentlich auch als Hi erkennen sollte(!)).
Für +/-15V hatte ich ja auch schon Transen/MOSFETs vorgeschlagen, aber von Deinen Steuerspannungen - was ist, wenn das angeschlossene RS232 keine Handshakes mitbringt?
Wenn Du auf den Rx des Fragezeichen meit irgendeinem PushPull die +/-15V legst, darf das/die Controller-Bein/e welche/s da ggf die 5V/3V3-TTL drauflegen würde nicht mehr verbunden sein (tristate reicht mMn auch nicht, da das trotzdem auf dem InputBuffer des Beines landet (und ggf auf gekoppelten Alternativfunktionen) - deswegen ein weiterer Transistor für die 5V (und ggf die 3V3). Gnd könne man vielleicht einfach über einen Pulldown erreichen.
 
Vielleicht hatte ich dich auch etwas missverstanden. Weißt ja, Analogtechnik liegt mir nicht sooo sehr :)

Geräteseitig würde es denn mit VCC arbeiten, also 3V3 oder 5V0. (1Vdickemilch lass ich jetzt tempoär weg).
Extern wäre es für mich überhaupt kein Problem das Handshaking zu setzen (RTS, CTS) um an die Pegel zu kommen. Wie schon erwähnt machen das mehrere Hersteller genau so. Du weißt auf welchen ich u.A. anspiele ;)
Daher hab ich die Idee es irgendwie so umzusetzen. Wie genau die es gemacht haben weiß ich leider nicht.
Nur vom Prinzip her.

Im Ideal Case könnte man ja auch noch abfragen ob die Handshaking Spannung da ist. Wenn nicht einfach VCC drauf legen. Quasi "du willst nicht? Dann friss oder stirb." Das wäre aber Feintuning.
Mir schwebt da der tiny13 im Kopf grade. 8 Pin, 9,6MHz warens glaub ich intern, sollte eigentlich locker reichen um bis zu 115200 Baud durch zu schleusen (und ggf. zu inventieren), oder?

Aber hast recht, eigentlich müsste ein Transistor/Mosfet für TXD reichen, nebst PullDown (oder -Up, je nach Verkabelung).

Hmmm... Würde man jetzt eine komplett "freie" Platine basteln... Zur Spannungsabfrage könnte man ja auch einen Gleichrichter nehmen der an RxD sitzt. Dann könnte man zur Not auch einen MAX232 schalten und komplett auf Steuerleitungen verzichten. Das wäre aber etwas für den ultimativen Pegelwandler, der in meinem Fall nicht benötigt ist :)
Klar, Probleme könnte es geben wenn beide Seiten auf die Spannungen des Anderen warten. Wobei andererseits eigentlich auch nicht wenn "Friss oder stirb" greift.

...

Hmmm... Muss wohl mal den Igel anwerfen
 
Was gegen ihn spricht ist lediglich die physikalische Abwesenheit :)
Einen 13er müsst ich hier noch zu liegen haben. Ich nutz ja eigentlich nur den und die 48er Serie (Mega48/88/168/328).

Ich streichel morgen mal den Igel und skizziere wie ich es jetzt so verstanden habe.
 
Nach etwas Stress jetzt doch mal zu gekommen.

Das wäre so mein Plan:
upload_2015-7-19_11-9-58.png

R1 und R2 teilen das Eingangssignal auf ein erträgliches Maß, die Z-Diode kümmert sich um den Rest.
R3 und R4 sollten klar sein, Q1 schaltet den Ausgang zwischen der vom COM Port bereitgestellten positiven und negativen Spannung.
R5 und R6 dienen als Spannungsteiler um zu erkennen ob es sich um RS232 handelt (dann invertieren), oder eben nicht.
Abblockkondensatoren möge man sich jetzt dazu denken :)

Jetzt mach ich mir eigentlich nur noch um Q1 Gedanken. Weil der bekommt ja VCC/GND zum schalten, liegt selber aber ja auf V-. Also müsste der ja eigentlich immer leiten.

Oder ist das alles geistiger Dünnpfiff?
 
Ein Widerstand zwischen Basis und Emitter würde den sperren lassen, solange der Tiny tristate an die Basis "legt".

Aber hast Du so nicht -0,7V statt 0V an der Z-Diode? (Die negative Vorwärtsspannung eben?
 
Ein Widerstand zwischen Basis und Emitter würde den sperren lassen, solange der Tiny tristate an die Basis "legt".
*facepalm* Auf die Idee war ich garnicht gekommen...
War wohl noch ein Kaffee zu wenig.

Aber hast Du so nicht -0,7V statt 0V an der Z-Diode? (Die negative Vorwärtsspannung eben?
Hmmm, grad getestet, 0,7V sinds bei mir (mag aber an Bauteiltoleranz liegen). Zugegeben, hab ich bisher noch nie bedacht. Da haben mir wohl bisher immer die AVR internen Schutzdioden das Sitzorgan gerettet. Aber lässt sich ja noch optimieren. Das Fallback auf VCC/GND fehlt auch noch (falls keine Steuerleitungen geschaltet sind).

Hätte man selbiges Problem nicht aber auch wenn man die Basis auf V- legt (per Widerstand) und der "Ausgang" Tristate ist?
 
Stimmt, tristate wirkt der nur, solange extern irgendwas zwischen Gnd und Vcc anliegt. Sonst greifen die Dioden...
Bleibt noch, zwei komplementäre Transistoren einzusetzen:
Controllerpin an Basis eines NPN, dessen Emitter an Gnd. Collektor mit Pullup nach V+ und auf die Basis des PNP. Dessen Emitter auch an V+, an den Collektor Deinen Ausgang und ein Pulldown nach V-.
Die erste Basis kannste mit 'nem R auf Gnd ziehen, die zweite hat'n Pullup nach V+...

Basisvorwiderstände, klar...
 
Zuletzt bearbeitet:
Du meinst so?
upload_2015-7-20_16-23-18.png

Könnte man bestimmt noch eleganter zeichnen.

Mal als Board im Anhang.
 

Anhänge

  • RS232_Converter.zip
    23,6 KB · Aufrufe: 5
Nein (fast), Dein Ausgangssignal (zu X1) kommt an den Collektor von Q2. Ich würde Q2 schräg rechts über Q1 zeichnen (und gespiegelt).
Q1 bekommt noch sicherheitshalber 'n Widerstand zwischen Emitter und Basis, bei Q2 ist das dann R3.
Die Widerstandwerte sind natürlich nur Platzhalter...

Solche komplementären Transen sollten sich eigentlich auch kombiniert in einem SOT23-6 finden lassen (Du wolltest ja klein).
 
  • Like
Reaktionen: TommyB
Hmm. Zu den Widerständen:

Ich hatte das Ganze mal durchgerechnet:
(R1/R2 ist oben, R5/R6 ist unten)
upload_2015-7-21_9-2-3.png

Sollte doch eigentlich passen. Überspannung schluckt die Z-Diode, sollte die tatsächlich mal ankommen. Ich hab mehrere RS232 hier ausprobiert, die liegen alle unter 10V, eher so um 7. Und ich denke mal der ADC wird mir die (im worst case) 1,14V statt 1,10V verzeihen.
Zu den anderen Widerständen... Hmmm, ich hab bisher immer den Wert genommen für PullUp/Down und Vorwiderstand für die Basis. Was würdest du denn nehmen?

Schaltplan jetzt so richtig?
upload_2015-7-21_9-9-32.png
 
Ich meinte damit, daß ich die Widerstände nicht geprüft habe.
Meiner Meinung nach sollten die Pull-Widerstände an den Trasistor-Kollektoren größer als die Basiswiderstände sein, aber das ist nur MEIN Bauchgefühl... (und nicht ALABELs)
Wenn der ADC-Eingang über der Referenz ist, sollte eben 1023 herauskommen. Du darfst lediglich Vcc nicht überschreiten (jaja, Schutzdiode blablub - wenn die den dann fließenden Strom abkann...)
 
Triggern wir doch einfach mal den @dino03 an :)
 
denke mal der ADC wird mir die (im worst case) 1,14V statt 1,10V verzeihen.
Zwar OT, aber weils hier paßt - wie arbeitet denn der ADC eigentlich?
Da es hier um den Tiny13 geht mal flugs ins Datenblatt geschaut:
Screenshot_2015-07-21-16-56-08.png
Es gibt eine "Conversion Logic", die einen "10-Bit-Digital-Analog-Converter" (DAC) steuert, welcher seinerseits unter anderen aus der internen 1V1-Referenz gespeist werden kann.
Die DAC-Spannung landet im Sample&Hold-Komperator, ebenso wie die Spannung des via ADMUX festgelegten ADC-Einganges.
Der Komperator liefert der Logic also, welche Spannung größer ist.
Die Logic versucht nun, die DAC-Spannung (schrittweise) an die tatsächliche Eingangsspannung anzunähern (sukzessive Approximation) - quasi im Halbierungsverfahren. Wie genau? Bitweise vom MSB zum LSB. Also:
Es wird nur das MSB gesetzt -> der DAC liefert somit die halbe Referenzspannung. Ist diese größergleich der zu messenden Spannung, bleibt das Bit stehen, ansonsten wird es gelöscht.
Jetzt wird das 2te Bit gesetzt -> DAC liefert entsprechend 3/4 bzw 1/4 der Referenz -> Vergleich -> Bit ggf löschen
...
LSB wird gesetzt -> Spannungsvergleich -> LSB ggf gelöscht.
Ergebnis wird ins ADC-Ergebnisregister kopiert, und das ADC-hat-fertig-Interrupt-Flag gesetzt

Wenn die zu messende Spannung größer als die Referenz war, wurde bei jedem Schritt das jeweilige Bit stehengelsassen - also 0b11_1111_1111 = 1023dec
Triggern wir doch einfach mal...
@Dirk :Stimmt, mit "Dino" oder "Alabel" geht der Trigger leider nicht...
 
... oder liegt im Garten :)

Hm soweit wie ich verstanden habe sollte er so arbeiten (der ADC). Die Tabelle waren auch von Excel ausgerechnete Werte. Der ADC würde bei 1,2V auch 1023 ausgeben, wie er bei -0,2V 0 ausgibt. Das hatte ich früher schon mal getestet.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)