Schaltung zum Entfernen von Rauschen aus digitalen Kommunikationsleitungen

Ich fahre von meinem vorherigen Beitrag fort und gehe auf Einzelheiten ein. Ich versuche, den richtigen Weg zu finden, um "Glitch-Entferner" oder "Rauschen-Entferner" mithilfe von Elektronik (dh nicht in Software) zu implementieren. Aus einer der Antworten in meinem vorherigen Beitrag habe ich gelernt, dass man für diesen Zweck eine RC-Schaltung verwenden kann, und die Prinzipien scheinen (glaube ich) die gleichen zu sein wie für die Entprellung von Schaltern.

Mein Hauptziel ist es, HF-Daten zu decodieren, aber Rauschen löst meine ISR viel zu schnell aus und verhungert meine Hauptschleife () früherer Zyklen. Mein Gerät ist Arduino (atmega328).

Bearbeiten : (über das HF-Modul) Ich verwende dieses ISM-Band ASK / OOK-Empfängermodul . Während die Spezifikationsseite oder die Website kein Foto der Rückseitenplatine enthält, kann ich sagen, dass sie einen kleinen weißen (wie er aussieht) Trimpot hat. Wenn ich ein Zielfernrohr gehabt hätte, hätte ich versucht, den Trimmer zu drehen, um zu sehen, ob die AGC beeinflusst wird. Es könnte jedoch sehr gut zum Trimmen von LC-Parametern dienen, da dasselbe Modul für 315 und 433 MHz arbeitet und der Trimmer möglicherweise nur die Werkseinstellungen für 433 MHz ist.

Auf sehr hohem Niveau beschreibt das folgende Diagramm den Zweck des "Glitch-Entferners". Wir haben ein verrauschtes Signal am Eingang, aber der Ausgang ist ziemlich rauschfrei. Rauschen ist jeder Signalübergang, der kürzer als eine bestimmte Dauer ist (z. B. 400 us).

Geben Sie hier die Bildbeschreibung ein

Bearbeiten : Tatsächlich ist die rechts gezeigte "störungsfreie Wellenform" eine Fälschung. Ich zog es schnell auf, indem ich die schmaleren Markierungen in der Farbe säuberte. Tatsächlich besteht die Wellenform auf der linken Seite eigentlich nur aus Rauschen. Inmitten des hochfrequenten Rauschens ist das echte übertragene Signal ziemlich gut geformt und leicht zu erkennen, da seine Frequenz viel niedriger ist und es einen „garantierten“ nachlaufenden langen Zwischenraum gibt, der das Ende des Pakets markiert. Das wirklich übertragene Signal ist 12 Bit + 1 Sync-Bit. Jedes Bit wird durch 1 Mark, 1 Space, 1 Mark, 1 Space dargestellt, wobei die Länge von Mark/Space variiert, z

0: HHHH LLLL LLLL LLLL HHHH LLLL LLLL LLLL
1: HHHH HHHH HHHH LLLL HHHH HHHH HHHH LLLL
F: HHHH LLLL LLLL LLLL HHHH HHHH HHHH LLLL (Floating address pin)
S: HHHH LLLL LLLL LLLL LLLL LLLL LLLL LLLL

wobei jedes H/L eine Dauer von 100 us hat und jedes Bit somit 3200 us benötigt. Rauschspitzen haben normalerweise eine Dauer von 30-40 us, was dazu führt, dass mein ISR überlastet wird. Basierend auf dem, was ich aus der Antwort von Supercat in meiner vorherigen Frage verstanden habe, und basierend auf ein wenig Recherche, denke ich, dass dies das Schema dessen ist, was ich ungefähr brauche.

Geben Sie hier die Bildbeschreibung ein

Benötigen Sie Hilfe, um zu überprüfen, ob der Schaltplan korrekt ist? Und was könnten die möglichen Werte von R1, R2 und C sein?

Wenn ich die Antwort von Supercat verstanden habe, kann ich zum Herausfiltern von Rauschsignalen unter 400 us einen 0,22-uF-Kondensator für C und R2 von 1 K und wahrscheinlich 100 R für R1 verwenden. Ist das korrekt ?

Oder sollte der Schaltplan dies sein (natürlich kommt dies der Beschreibung von Supercat näher).Geben Sie hier die Bildbeschreibung ein

Mit R=1K und C=0.22uF ?

Ich habe kein Oszilloskop, kann also keine feinen Messungen durchführen und Wellenformen sehen, aber ich habe einen Logikanalysator. Dies schränkt wahrscheinlich ein, was und wie ich testen kann, wenn ich experimentiere.

Übrigens, kann ich erwarten, dass ein solcher "Glitch-Entferner" die gewünschten Signale vollständig intakt lässt, oder würden sie irgendeine Art von Verzerrung erleiden?

Wenn die Wellenformen in Ihrer ersten Zeichnung repräsentativ sind, haben Sie ein sehr schwieriges Problem. In dieser Zeichnung haben Sie auf der Eingangsseite mehr Störungen als ein Signal. Wie würde Ihre Schaltung wissen, ob sie sich in einem Null-Zustand oder einem Eins-Zustand befinden soll, wenn das Signal fast die Hälfte der Zeit in einem der beiden Zustände verbringt? Die Art von Störungen, die Sie möglicherweise mit einer einfachen Schaltung, wie Sie sie vorschlagen, entfernen können, ist, wenn es eine einzelne, isolierte, kurze Störung in einem viel längeren Zeitraum gibt, bei der das Signal konstant auf dem "richtigen" Wert bleibt.
Um auf Ihre Bearbeitung zu antworten, obwohl Sie die Hochfrequenzteile Ihres Signals von den Niederfrequenzteilen unterscheiden können, weiß ich während der Niederfrequenzteile nicht, ob ich positive Störungen auf einem Signal betrachte, das niedrig sein sollte, oder negative Störungen auf einem Signal, das hoch sein sollte. Die von Ihnen vorgeschlagenen passiven Schaltungen werden es auch nicht wissen. ... Wenn Sie beispielsweise wissen, dass das Signal im niederfrequenten Teil immer Null sein sollte, können Sie möglicherweise die Glitches beseitigen. Sie benötigen jedoch eine Art Digitalschaltung (ich denke eher eine CPLD als eine uC) und nicht nur einen RC-Filter.
Danke @ThePhoton für deine Antworten. Ich verstehe Ihren Standpunkt in Bezug auf die Unsicherheit positiver / negativer Störungen. Ich glaube, dass die anfänglichen Entwicklungs-/Designkosten von CPLD um eine Größenordnung höher sind als das, was ich für ein RC hinzufügen würde, und ich müsste meine Komfortzone für "Tüftler" verlassen. Ich weiß mit Sicherheit, dass ein ziemlich preiswerter Heimautomatisierungscontroller, den ich habe, dasselbe HF-Signal mit einem uC (tatsächlich demselben uC, dh ATmega328) decodiert und eine ganze Menge mehr leistet, und soweit ich das durch Studieren beurteilen kann PCB verwenden sie kein CPLD (keine nicht gekennzeichneten / nicht identifizierten ICs) ...
... also vermute ich, dass bei meinem Ansatz etwas grundlegend falsch sein muss, da die Dekodierung des gleichen Signals, das ich versuche, durchgeführt wurde. Wie auch immer, ich bin vom Hauptpunkt abgewichen, dh gibt es einen einfachen (und billigen) Weg, dem uC beim Umgang mit dem Signal zu "helfen", indem ISR weniger beschäftigt ist, und ich sehe, dass es sich um einen reinen Softwareansatz handeln müsste .
Ich hatte ein ähnliches Problem und habe es nur in Software gelöst. Ich kann Ihnen eine detaillierte Antwort geben, wenn Sie das USART-Modul des Mikrocontrollers verwenden können, um die HF-Datenpakete zu empfangen.

Antworten (5)

Wenn ich ein Designproblem wie dieses habe, denke ich zuerst "wie würde ich das von Hand dekodieren" und dann versuche ich, meinen Denkprozess durch den Einsatz von Elektronik umzusetzen.

Wenn ich mir also Ihre beiden Diagramme ansehe, sehe ich nur eine Sache, die mein Gehirn verwenden kann, um zu bestimmen, was Daten und was Rauschen ist, nämlich die Impulsbreite. Das Problem mit passiven Komponenten in einer solchen Situation ist, dass Sie zum einen eine Rechteckwelle haben, deren Oberwellen viel höher sind als der Grenzpunkt für Ihren Filter. Dies führt zu einer nicht so rechteckigen Welle.

Der einfachste Weg, dies zu tun, wird wahrscheinlich in Software sein. Sie können immer noch Interrupts verwenden, aber es wird etwas mehr Arbeit erfordern. Im Wesentlichen müssen Sie an einer Kante unterbrechen und dann die Zeit bis zur nächsten Kante zählen. Wenn die Zeitspanne lang genug ist, können Sie es als logische 1 bezeichnen, andernfalls können Sie es als Rauschen auf einer logischen 0 betrachten.

Wenn Sie sich für passive Komponenten entscheiden müssen, sollten Sie einen Tiefpassfilter gefolgt von einem Komparator in Betracht ziehen. Sie müssten mit dem Tiefpassfilter spielen, um es genau richtig zu machen, aber im Wesentlichen würden Sie darauf abzielen, dass die Kondensatorladung gerade hoch genug ist, damit der Komparator seinen Ausgang schaltet, wenn das Bit lange genug eingeschaltet ist. Was dies schwierig macht, ist, dass Ihre "Störungen" Ihren Daten sehr ähnlich sind und es schwierig ist, Ihre Schaltung genau richtig abzustimmen, um Ihre Daten ohne Störungen zu erhalten. Selbst wenn Sie es auf dem Papier perfektionieren können, werden Ihre Komponenten auch nicht sehr präzise sein. Aus diesem Grund sollten Sie ernsthaft darüber nachdenken, dies digital zu tun.

Danke @Kellenjb. Tatsächlich habe ich begonnen, diese „Hardwareunterstützung“ für meinen Softwareansatz zu untersuchen, nachdem ich einen reinen Softwareansatz ausprobiert hatte. Mein Ansatz ist genau so, wie du es erklärst. Lassen Sie eine ISR sowohl bei steigenden als auch bei fallenden Flanken auslösen und zählen Sie die verstrichene Dauer. Ich ignoriere die Teile, in denen die Dauer weniger als 300 us beträgt, die Rauschfrequenz jedoch so hoch ist, dass mein uC mit der Bereitstellung der ISR überfordert ist und die Hauptschleife nur sehr wenig Zeit hat, mit gültigen Daten etwas Nützliches zu tun.

Bearbeiten:

Ein Tiefpassfilter wird Ihre schönen Rechteckwellen ruinieren , aber wenn Sie nur einen Interrupt auslösen möchten, können Sie es versuchen. Basierend auf Ihrer neuen Erklärung glaube ich, dass Sie einen Tiefpassfilter wollen, bei dem Ihr Cutoff leicht über dem liegt, was als gültiges Bit gilt:

1/(100 microseconds) = 10 kHz (valid bit)

Ich würde so etwas wie 12 kHz als Zielgrenzwert auswählen und von dort aus optimieren. Gemessen an den Werten, die Sie in Ihrer Frage ausgewählt haben, erreichen Sie keine interessierende Grenzfrequenz. Probieren Sie die Schaltung in diesem Beispiel aus:

Geben Sie hier die Bildbeschreibung ein

Sie können Ihren Cutoff wie folgt berechnen:

f c u t Ö f f = ( 1 2 p ich R C )

Einige Ballpark-Werte: R=68K und C=220pF ergeben eine Grenzfrequenz von etwa 10,6 kHz. Dies ist ein ziemlich schlechter Filter und kann weit verbessert werden, aber versuchen Sie es und sagen Sie uns, ob er diese 30-40 us-Impulse dämpft. Wenn es kaum etwas bewirkt (wie ich vermuten könnte, weil dies ein Filter erster Ordnung ist , der 20 dB / Dekade dämpft), fragen Sie hier nach Filtern zweiter Ordnung. Du wirst viele gute Antworten bekommen.


Vorherige Antwort:

Es scheint, dass Ihre Empfängerempfindlichkeit extrem hoch ist. Können Sie weitere Details zu Sender, Modulation, Kodierung und Empfangstechniken mitteilen? Möglicherweise müssen Sie dort zuerst etwas anpassen.

Das erinnert mich an ein Projekt, an dem ich vor langer Zeit beteiligt war (das auch einen IEEE-Wettbewerb an unserer Schule gewann: D), bei dem wir ein benutzerdefiniertes asynchrones Protokoll erstellten, das Impulse über einen lose gekoppelten Magnetkreis sendete, der einen Komparator auslöste und Impulse erzeugte ähnlich dem, was Sie sehen. Da unsere Baudrate auf beiden Seiten bekannt war, implementierten wir am Ende eine Schutzzeit auf dem empfangenden Mikrocontroller und die Übertragung enthielt auch eine Prüfsumme.

Sobald wir erkannt hatten, was wir für ein gültiges Bit hielten, haben wir die ISR für einen Zeitraum (entsprechend der Baudrate unserer Übertragung) deaktiviert, bevor wir sie wieder aktiviert und das nächste Bit akzeptiert haben. Wenn die Prüfsumme nicht übereinstimmte, würden wir sie verwerfen und um eine erneute Übertragung bitten.

Wir arbeiteten in einem sehr schmalen Band, so dass wir nicht viel Rauschen bekamen, und wir mussten uns nicht mit etwas annähernd so Schlimmem auseinandersetzen, wie es in Ihren Diagrammen dargestellt ist – wenn es so schlimm gewesen wäre, hätte unsere Technik es wahrscheinlich nicht getan überhaupt funktioniert hat oder sehr lange gedauert hätte, um eine gültige Übertragung zu senden. Ich würde in Betracht ziehen, Ihr Front-End noch einmal durchzugehen und zu sehen, ob es ideal für das ist, was Sie erreichen möchten.

Danke @Jon für die Beantwortung und Nachverfolgung. Ich glaube, ich müsste Ihre ursprüngliche Antwort ein paar Mal noch einmal lesen, weil ich etwas ziemlich Interessantes im s / w-Ansatz spüre, aber der Verstand ist zu taub, um es nach einer langen Nacht zu begreifen :), in der Zwischenzeit , lassen Sie mich einige Ihrer Fragen zu meinem Setup beantworten. Übrigens, ist der Ausgang der Tiefpassfilterschaltung oben invertiert?
Die Empfängerempfindlichkeit ist dank der automatischen Verstärkungsregelung wahrscheinlich sehr hoch, aber das RF-Rx-Modul ist sehr schlecht dokumentiert (ein billiges ostasiatisches Modell), daher habe ich keine Ahnung, wie man AGC herunter-/ausschaltet. Das Modul ist ein ASK / OOK-Empfängermodul im ISM-Band, und die proprietäre Modulation wird bereits durch eine Bearbeitung in meiner Frage erklärt. Ich werde den kleinen Informationen zu diesem Modul in meiner Frage eine Seite hinzufügen.

Das grundlegende Problem mit der von Ihnen vorgeschlagenen einfachen RC-Schaltung (Ihr erstes Diagramm oder das Diagramm in Jon Ls Antwort) besteht darin, dass der Eingang zum uC nicht streng hoch oder niedrig gehalten wird, wenn das Signal klappert, aber dazu neigt Drift in Richtung der durchschnittlichen Spannung des Empfängerausgangs, die von der Frequenz des Flatterns und der Breite der Störungen abhängt. Wenn die durchschnittliche Spannung zufällig nahe der Schwellenspannung für den uC-Digitaleingang liegt, erhält das Mikro immer noch bedeutungslose Eingangsübergänge, aber sie erfolgen langsamer und sind möglicherweise schwieriger von Ihrem gewünschten Signal zu unterscheiden.

Hier ist etwas, das unter der Annahme funktionieren könnte, dass Störungen nur auftreten, wenn das gewünschte Signal niedrig ist. Das heißt, ich gehe davon aus, dass das Nachrichtensignal, wenn es hoch ist, die Leitung wirklich hochziehen kann, aber wenn es niedrig ist, treten die Störungen auf.

Modifizierte RC-Tiefpassfilterschaltung

Diese Schaltung sorgt dafür, dass der uC schnell auf einen High-to-Low-Übergang reagiert, aber ein Low-to-High-Übergang muss einige Zeit hoch bleiben, bevor er vom uC-Eingang gesehen wird. Sie werden wahrscheinlich mit den R & C-Werten in einem Simulator herumspielen wollen, indem Sie verschiedene Chatter-Muster verwenden, um Werte zu finden, die die Störungen korrekt bereinigen.

Eine Schottky-Diode ist möglicherweise vorzuziehen, insbesondere wenn der uC-Eingang einen TTL-Eingang hat (der einen Schwellenwert von etwa 0,8 V haben könnte).

Der Nachteil dieser Schaltung besteht darin, dass sie die Übergänge von hoch nach niedrig und von niedrig nach hoch nicht gleichermaßen verzögert, sodass Ihre hohen Impulse am Ende verkürzt werden ... hoffentlich können Sie diese Schwierigkeit in der Software umgehen das die verschiedenen von Ihnen erwähnten Impulsmuster decodiert, um '1', '0', 'S' und 'F' zu erkennen.

Danke @ThePhoton. Ich denke, das ist wahrscheinlich eine Sache, die ich ausprobieren würde, bevor ich zu der schnellen Abtastmethode zurückkehre, mit der ich als reine Softwarelösung begonnen hatte.

Sie werden das nicht mit ausschließlich passiven Komponenten erreichen ... vielleicht könnten Sie dort einen dedizierten Mikrocontroller einbauen, auf dem Software ausgeführt wird, die Ihren Eingangsstrom verzögert (gepuffert, absorbiert, was auch immer) (mit einer ausreichend hohen Abtastrate für die Glitch-Funktionen von Interesse - dh mindestens die Hälfte des Intervalls Ihrer kürzesten "niedrigen" Periode) für 400 us, um festzustellen, ob ein eingehender Impuls lang genug ist, um als echt zu klassifizieren, und dann seinen eigenen hergestellten 400 us-Impuls aussendet. Dies könnte als Verstoß gegen Ihre ausdrückliche Anforderung "nicht in Software" angesehen werden, aber das hat mich dazu veranlasst, einen dedizierten Mikrocontroller für diesen Zweck vorzuschlagen.

Danke @vicatcu. Ich kann beim Lesen aller Antworten sehen, dass es ziemlich unwahrscheinlich ist, dies mit passiven Komponenten zu erreichen. Ich weiß nicht, ob ich ein weiteres uC hinzufügen soll, denn das ist so ziemlich das, was ich gerade mache. Ein ATmega328, der mit 20 MHz läuft, kann nicht mithalten, was derzeit ziemlich auf dieses Dekodierungszeug ausgerichtet ist.
Es kann möglicherweise mithalten, wenn dies alles ist, was es tut, und Sie einen Interrupt-gesteuerten Codestil verwenden ...
Nun, im Moment ist mein Ansatz unterbrechungsgesteuert, und im Moment ist dies alles, was es zu tun versucht.
@ icarus74 vielleicht mit "nackten" ISRs, die dann in Assembly geschrieben wurden :)

Das Schema mit dem Vorwiderstand und mit einem Widerstand gegen VSS und einer Kappe an VDD ist fast richtig, außer dass die Kappe an VSS gehen sollte (R2 sollte dies höchstwahrscheinlich auch tun). Ich würde vorschlagen, zunächst willkürlich 1K als Vorwiderstand auszuwählen und R2 so zu wählen, dass dann der Ausgang des HF-Empfängers auf halber Schiene liegt und der Eingang zum Prozessor nahe seinem Schaltpunkt liegt. Ein Wert von 2,2K für R2 dürfte gut sein, wenn der Prozessor bei etwa VDD/3 schaltet. Der genaue Wert wird wahrscheinlich nicht allzu viel ausmachen. Berechnen Sie in jedem Fall den effektiven Parallelwiderstand der beiden Widerstände zusammen, indem Sie den Kehrwert von jedem nehmen, diese Werte addieren und den Kehrwert des Ergebnisses bilden. Mit den angegebenen Werten ist 1/(1/1000 + 1/2200) = 687,5 Ohm.

Finden Sie als Nächstes die schnellsten Signalübergänge heraus, an denen Sie interessiert sind. Nehmen wir an, Sie interessieren sich für Manchester-codierte Daten, die mit 100.000 Bit/Sekunde gesendet werden. Da Manchester-codierte Daten zwei Signalübergänge pro Bit erfordern, würde die Zeit pro Übergang mindestens 5 us betragen. Teilen Sie die berechnete Zeit (z. B. 5 Mikrosekunden) durch den berechneten Widerstand (z. B. 687,5 Ohm), um einen ungefähren erforderlichen Kapazitätswert zu erhalten (in diesem Fall etwa 0,0072 Mikrofard). Es ist wahrscheinlich besser, wenn deine Mütze etwas kleiner als zu groß ist; experimentieren und sehen, was Sie bekommen.

Nachtrag

Wenn der Sender und der Empfänger beide quarzgesteuerte Bitraten haben, würde ich vorschlagen, das Signal durch eine analoge Filterschaltung zu leiten und einen ADC zu verwenden, um den Ausgang des Filters bei 10 kHz abzutasten. Legen Sie das eingehende Signal lange genug in einen Rollpuffer, um das gesamte Paket zu verarbeiten, und verwenden Sie auch einen 32-Bucket-Akkumulator, um die Differenz zwischen dem aktuellen Signal und dem Signal vor 384 Samples zu summieren (so dass die erste Differenz zu Bucket # 0 hinzugefügt wird, der zweite an Eimer Nr. 1, der 32. an Eimer Nr. 31, der 33. an Eimer Nr. 0 usw.). Es sollte zwei aufeinanderfolgende Buckets mit einem großen Unterschied zwischen ihnen geben (der spätere Bucket hat einen viel höheren Wert als der vorherige). Wenn dieser Unterschied festgestellt wird, zeigt dies an, dass man die ansteigende Flanke eines Impulses gefunden hat. An diesem Punkt,

Danke @supercat, aber in meinem Fall ist die Signalcodierung nicht ganz Manchester. Es scheint Manchester lose ähnlich zu sein, aber proprietär, wie durch eine Bearbeitung in meiner Frage erklärt. Glaubst du, diese Logik könnte noch funktionieren?
Mein derzeitiger Vorschlag ist, dass Sie einen RC-Filter verwenden, um Änderungen zu glätten, die schneller als Ihre Abtastrate sind. Ich würde analoges Sampling bei 10 kHz vorschlagen, was ein Sample für jeden "Buchstaben" in Ihrem Zeitdiagramm wäre. Ich werde mehr darüber hinzufügen, wie ich eine digitale Verarbeitung für die angegebene Wellenform vorschlagen würde.