Zitat Zitat von Besserwessi Beitrag anzeigen
Ein Grund wieso es nur 5 µs für den Sprung sind, könnte sein, dass die Abfrage davor auch noch etwas Rechenzeit braucht. Das könnte noch etwas besser werden, wenn man die letzte Periode vor der Abfrage an die Rechenzeit anpasst und etwas kürzer macht. So hat man halt immer etwas Verzögerung dazu: Man sieht auch bei den folgen von 0 Bits noch ein bisschen Struktur. Eine zusätzliche Verzögerung von 5-7 µs allein durch die IF Abfrage kommt mir aber auch recht lang vor. Man könnte es ggf. am Sendesignal erkennen. Wie schnell läuft denn der µc ?
Weil der interne Oszillator zu ungenau ist um eine Phasnverschiebung um 12µs hinzubekommen (anderer µC -> funzt nicht mehr) habe ich jetzt am Sender einen 12MHz quarz dran. Jetzt sieht das ganze auch schon viel besser aus: Die Wartezeit ist 10µs, die restlichen 2µs gehen vermutlich für das IF usw drauf.

So wie das Signal Aussieht könnte man vermutlich noch bis 0,25 - 0,3 ms je Bit runter gehen - das wäre dann etwa 10-12 Perioden statt 20. Es sollte ausreichen wenn die Amplitude bei einem 0 Bit (als ohne Störung) bis auf etwa 70% des Maximalwertes hoch geht. Länger warten bringt nicht mehr so viel. Nur die Synchrornisation braucht dann ggf. besser ein 101 statt zwei 1 Bits.
Leider musste ich sogar wieder auf 1ms/Bit rauf.. Das liegt daran, dass erst nach so langer Zeit die Amplitude des Empfängers nicht mehr weiter steigt. Ansonsten hat man wenn zwei mal 1 hintereinander gesendet wird eine kleinere Spitzenamplitude als bei 101, was die Zuverlässigkeit der Übertragung deutlich schmälert.

Das Signal sieht so schon sehr gut aus, auch schon einfach nur mit dem Komparator. Im realen Fall muss man aber vermutlich das ganze noch an eine variabel Amplitude anpassen. Mit dem Direkten Signal, also ohne Reflexion wird das Signal ggf. sogar noch Stärker ! So ganz schnell ist das Amplituden-Signal auch nicht mehr - das könnte der µC ggf. auch per ADC auswerten. Für die Daten reicht es ja die Amplituden zu den passenden Zeiten Auszuwerten - die Komparatorschaltung wäre mehr etwas zur Synchronisation und für die Abstandsmessung.
Also ich mache es im Moment mit zwei Komparatoren: Der eine Zeigt an ob das Signal steigt oder fällt (also die Flanken) und der andere ob das Signal über Spitze/2 ist oder nicht (also den Pegel). Wenn eine high-Flanke anfängt und der Pegel (noch) low ist (Nulldurchgang = 1) wird es als eine 1 gewertet. Falls keine Flanken kommen oder der Pegel high ist wird als 0 gewertet.

Hier der Sender.
Klicke auf die Grafik für eine größere Ansicht

Name:	Sender.jpg
Hits:	12
Größe:	109,6 KB
ID:	29039
Atmega8 mit besagtem 12MHz Quarz. Die Leitung ist die Versorgungsspannung (4.3V, was vom USB noch so übrig bleibt )

Der Empfänger:
Klicke auf die Grafik für eine größere Ansicht

Name:	Empfänger.jpg
Hits:	12
Größe:	86,5 KB
ID:	29040
Poti links ist für die Spannung um die das Empfängssignal schwingt. Der IC links ist ein CA3140 als Verstärker, das ist der einzige OP den ich da habe der schnell genug ist. Dummerweise kann der bei 5V single supply nur ca. 2.5V maximal ausgeben -> hier muss noch was anderes her. Das Zweite Poti ist die Last für den C, der die Spannung für die Kontur-Kurve puffert. Rechter IC sind 4x OPs, zwei davon als Komparator (Flanken + Pegel)

Und so sieht das am Oszi aus:
Klicke auf die Grafik für eine größere Ansicht

Name:	Signals.jpg
Hits:	15
Größe:	26,8 KB
ID:	29041


Und es funktioniert erstaunlich gut! Über eine Strecke von 6m kann ich das Byte schon stabil übertragen!

Nur bei Störungen hat man eine Chance von 25% dass die Checksumme stimmt (2bit), von daher können da manchmal Fehler passieren.. (-> längere Checksumme)

Und dabei gibt es noch Verbesserungspotenzial:
  • CA3140-Alternative mit rail-to-rail
  • MAX232 für Sender