Forum: Mikrocontroller und Digitale Elektronik So Zeitgenau messen wie möglich über ein I2C-Datenbussystem


von Endy (Gast)


Lesenswert?

Liebe Bastler,

ich bin Mechatronik-Student und soll im Rahmen eines kleinen Jobs ein 
Datenbussystem für ein kleineres (~3Kg), unbemanntes Flugzeug aufbauen.
Ich bin dabei, ein möglichst robustes, einfaches und idiotensicheres 
Datenbussystem aufzubauen, mit dem noch viele Leute nach mir 
weiterarbeiten sollen. Ich bin dabei zu dem Entschluss gekommen, dass 
ich aufgrund der geringen Übertragungswege, Robustheit, Einfachheit und 
der ausreichenden Geschwindigkeit den I2C-Datenbus benutzen möchte.

Ein Master bildet das zentrale Element und mehrere Slaves (es ist davon 
auszugehen, das es bis zu 40 werden) sind an diesem angeschlossen. Die 
Slaves sind wieder einzelne Platinen, auf denen ein oder mehrere 
Sensoren sitzen. Diese Sensoren könnten zum Beispiel analoge, 
kapaizitive Sensoren für die Feuchtigkeitsmessung sein. Diese 
Sensorwerte sollen mit bis zu 100 Hz erfasst werden.

Der Master soll sich mit Hilfe eines GPS-Moduls und einem PPS-Signal auf 
die genaue Sekunde synchronisieren. Danach soll er dann die Daten der 
Slaves mit der gewünschten Frequenz abfragen. Die große Anforderung ist: 
Man soll so genau wie möglich sagen können, dass zu diesem definierten 
Zeitpunkt der Sensorwert gemessen wurde.
Und genau da liegt mein Problem.. : Wie kriege ich es hin, möglichst zu 
einem definierten Zeitpunkt den Sensorwert erfassen zu lassen? Wenn ich 
den Sensorwert erst bei der Anfrage über I2C erfassen lasse, dann ist es 
für manche Sensoren wahrscheinlich nicht mehr Präzise genug, denn es 
kommt das Delay des Masters, bis er die Anfrage stellt und das Delay des 
Slaves, bis er die Daten empfangen und verarbeitet hat, zusammen.

Am elegantesten wäre es ja, wenn die Slaves selber wüssten, wann sie 
Messen sollen und der Master kurz nach der Messung einfach nur die Werte 
"aberntet". Das würde ja zum Beispiel gehen, wenn man ein PPS-Signal auf 
einen weiteren Busstrang legen würde. Nur irgendwie erscheint mir das 
unglaublich unelegant. Ich würde gerne eine Standard, "Keep it simple 
and stupid" methode verwenden, nur ich finde dazu nichts passendes, 
vielleicht fehlen mir aber auch noch die passenden Suchbegriffe. Kennt 
ihr Anwendungen, wo das Problem gelöst wurde? Irgendwelche Inspirationen 
und Ideen?

Vielen Dank bereits im Voraus!


Liebe Grüße,
Endy

von Dr. Sommer (Gast)


Lesenswert?

Sende doch einfach eine Nachricht an alle Slaves ("Genral Call ")dass 
sie jetzt messen sollen, und hole dann nacheinander die Daten ab.
PS: hat das Flugzeug einen Elektromotor? Dann würde ich dringend von I2C 
abraten wegen der geringen Störsicheheit und völlig fehlenden 
Fehlererkennung. CAN z.B. ist da viel sicherer, schneller und auch 
einfacher anzuwenden.

von derguteweka (Gast)


Lesenswert?

Moin,

Nimm nicht I2C. Mit bis zu 40 Teilnehmern und Leitungen zwischen 
Platinen ist der voellig ungeeignet dafuer.

Gruss
WK

von Bauteiltöter (Gast)


Lesenswert?

Endy schrieb:
> Ich bin dabei zu dem Entschluss gekommen, dass
> ich aufgrund der geringen Übertragungswege, Robustheit, Einfachheit und
> der ausreichenden Geschwindigkeit den I2C-Datenbus benutzen möchte.
>
> Ein Master bildet das zentrale Element und mehrere Slaves (es ist davon
> auszugehen, das es bis zu 40 werden) sind an diesem angeschlossen.

I2C auf Grund der Robustheit?
Da würde ich jetzt gerade NICHT I2C verwenden - das ist nicht gerade für 
seine Störsicherheit (erst recht bei langen Leitungen) bekannt. Ein 
hängender Slave der den Bus nach Masse zieht und dein ganzer Bus ist tot 
- nicht unbedingt das, was man haben möchte.
Ich würde eher auf RS485 oder gleich CAN mit richtigen CAN-Chips setzen, 
die Wahrscheinlichkeit, dass sich ein solcher Chip aufhängt ist deutlich 
geringer.
Oder direkt MIL-STD-1553 auch wenn das für dich vermutlich overkill ist.

> genau wie möglich

Das ist eine verdammt unpräzisie Aussage. So genau wie möglich? Nimm 
eine Rauchzeichenverbindung und "so genau wie möglich" ist +-10 
Sekunden.
Nimm I2C und es ist vielleicht +-100ms.

Wie genau brauchst du es denn wirklich?

Im worst-case würde ich ebenfalls das PPS-Signal an alle Slaves 
verteilen, der Master kann dann innerhalb einer Sekunde alle Werte 
sammeln und weiß genau, dass sie bei der letzten 1PPS-Flanke gesampelt 
wurden.
Aber bei
> genau wie möglich
muss man dann natürlich darauf achten, dass die Leitungen alle gleich 
lang sind, sonst kommen die Pulse unterschiedlich verzögert bei den 
Slaves an. Und auf die Interruptlatzen musst du dann auch achten...
Aber zumindest die Leitungslänge ist wohl irrelephant, daher solltest du
> genau wie möglich
spezifizieren.

von Karl H. (kbuchegg)


Lesenswert?

> Das würde ja zum Beispiel gehen, wenn man ein PPS-Signal auf einen
> weiteren Busstrang legen würde.

Wen man das verallgemeinert, dann landet man bei: die Slaves müssen über 
die Systemzeit Bescheid wissen.
Wie das dann genau aussieht, ist eine andere Sache. Eine eigene PPS 
Leitung ist sicherlich eine Möglichkeit. Eine andere wäre, dass der 
Master die Systemzeit übermittelt und die Slaves eigenständig zumindest 
kurzfristig eine Uhrzeit mitführen.
Natürlich hat man auch hier einen kleinen Delay. Die Frage ist 
allerdings auch, wie gross der ist und damit auch wie relevant er ist. 
Ich kann mir nicht vorstellen, dass es systemrelevant ist, die aktuelle 
Uhrzeit auf die Zehntel Nanosekunde genau zu kennen. Aus dem Bauch raus 
würde ich mal sagen, Millisekunden sind genau genug. Die sollten sich 
aber relativ leicht in den Griff kriegen lassen.

> Nur irgendwie erscheint mir das
> unglaublich unelegant.

Irgend einen Mechanismus wirst du aber vorsehen müssen.

Allerdings: Nicht überteiben! Leg erst mal fest, wie exakt die 
Timestamps sein müssen. Daran orientierst du dich. Und nicht daran, was 
cool klingt. Je genauer die Dinge sein müssen, desto mehr Aufwand muss 
man treiben. Mit unnötigem Mehraufwand ist aber auch wieder keinem 
geholfen. Der kostet nur Geld für nichts.

: Bearbeitet durch User
von Endy (Gast)


Lesenswert?

Genau, das Flugzeug hat auch Elektro-Motoren. Man kann aber I2C, soweit 
ich weiß, auch mit den richtigen Bausteinen differentiell übertragen und 
ich würde das bei zu großen Störquellen machen.

Was mich stört ist, dass der CAN-Bus für Multi-Master ausgelegt ist, das 
heißt, dass ich das möglichst simple Protokoll nicht nur auf dem einen 
Master realisieren müsste, sondern noch mehr Intelligenz in jeden Slave 
auslagern müsste. Das ganze verkompliziert sich so etwas.

von Karl H. (kbuchegg)


Lesenswert?

Endy schrieb:

> Was mich stört ist, dass der CAN-Bus für Multi-Master ausgelegt ist, das
> heißt, dass ich das möglichst simple Protokoll nicht nur auf dem einen
> Master realisieren müsste

Um die Abwicklung von CAN brauchst du dich nicht gross kümmern, das 
machen die CAN-Chips von alleine.

> sondern noch mehr Intelligenz in jeden Slave
> auslagern müsste. Das ganze verkompliziert sich so etwas.

Im Slave brauchst du sowieso Intelligenz.

Aber das Prinzip von CAN ist ein komplett anderes. Die Idee hinter CAN 
ist es nicht Master und SLave zu haben. Die Idee hinter CAN ist es, dass 
jeder der einen Messwert hat (etwas mitteilen will), das einfach in die 
Welt hinausposaunt. Und derjenige, der sich für diesen Wert 
interessiert, der holt sich den Wert aus der Message raus. Bei CAN steht 
die Nachricht im Vordergrund und nicht wer wem etwas mitzuteilen hat. 
CAN ist gedacht als eine Art elektronische Pinwand, an der jeder seine 
Ergüsse veröffentlichen kann und wer sich für etwas interessiert, der 
wertet dann neben der Überschrift auch noch die Details aus.

Klar kann man das auch auf ein Master Slave Prinzip umbauen. Aber 
eigentlich ist das eine Pervertierung des CAN-Prinzips.

: Bearbeitet durch User
von Endy (Gast)


Lesenswert?

Wegen dem "genau wie möglich".

Ich habe im Rahmen meiner letzten Abschlussarbeit an einem Bussystem mit 
einer RS485 Schnittstelle mitgewirkt, das ganze soll im 
Nanosekundenbereich genau sein (ja ich weiß, je nach Leitungslänge), 
dass heißt, es gab jede Sekunde einen Synchronisationspuls und die 
Slaves haben ihre Schwingung des Oszillators mittels DAC auf die genaue 
Sekunde aufgeregelt. Mit diesem System "konkurrier" ich gerade.
Es ist auch echt super, nur nicht für diese Anwendung, da es einfach zu 
kompliziert dafür ist und ich weiß, sobald nicht mehr die Leute da sind, 
die sich mit dem System auskennen, das ganze noch einmal neu gemacht 
werden muss.

Deswegen bin ich auf der ultimativen "so einfach wie möglich" Methode 
mit möglichst wenig eigenem Protokoll und Bastelpotenzial.

von derguteweka (Gast)


Lesenswert?

Moin,

Endy schrieb:
> Deswegen bin ich auf der ultimativen "so einfach wie möglich" Methode
> mit möglichst wenig eigenem Protokoll und Bastelpotenzial.

Ethernet mit PTP(IEEE1588)? Aber nicht ueber die Preise fuer Switche 
meckern, wenn's auf die Nanosekunde genau sein soll...

Gruss
WK

von m.n. (Gast)


Lesenswert?

Endy schrieb:
> Ich habe im Rahmen meiner letzten Abschlussarbeit an einem Bussystem mit
> einer RS485 Schnittstelle mitgewirkt, das ganze soll im
> Nanosekundenbereich genau sein (ja ich weiß, je nach Leitungslänge),
> dass heißt, es gab jede Sekunde einen Synchronisationspuls und die
> Slaves haben ihre Schwingung des Oszillators mittels DAC auf die genaue
> Sekunde aufgeregelt. Mit diesem System "konkurrier" ich gerade.

Nanosekundenbereich? Kleiner Job? => Schwachsinn.

Endy schrieb:
> ich bin Mechatronik-Student

Schuster bleib bei deinen Leisten!

von Stefan (Gast)


Lesenswert?

Ich würde auch nicht I2C benutzen. Wenn Du es differentiell machst, dann 
hast Du gleich 4 Leitungen und trotzdem noch nicht alle I2C-Fallstricke 
behoben. Für mich wäre es jedenfalls de Horror, in einem 
40-Teilnehmer-System denjenigen zu finden, der das System aktuell 
blockiert.
RS485 ist in einem Single-Master-System eine sehr gute Wahl. CAN ist 
auch nicht schlecht, da die Multimasterfähigkeit bereits von der 
Hardware unterstützt wird, verkompliziert sich Dein System damit nicht 
wirklich.

Dein Timing-Problem würde ich mit einer Systemzeit-Msg lösen, die der 
Master zyklisch sendet. In dieser überträgst Du den aktuellen 
Systemzeit-Counter des Masters an alle Slaves. Diese können ihren 
eigenen Systemzeit-Counter damit auf den des Masters synchronisieren. 
Damit können dann alle Slaves autonom fast zeitgleich Messung starten 
und danach warten, bis der Master irgendwann diese Werte abholt.

Fast zeitgleich bedeutet:
Du hast einen Timelag im Master vom Auslesen der Systemzeit bis zum 
Ausgeben auf die Schnittstelle. Dann kommt die Zeitdauer für die 
Msg-Übertragung dazu. Und am Schluß müssen Deine Slaves die Zeit-msg 
(per Interrupt) empfangen und mit der eigenen Systemzeit 
synchronisieren. Teilweise sind diese Verzögerungszeiten konstant 
(msg-Übertragungs-Dauer) und Du kannst sie bei der Syncronisierung mit 
einberechnen.
Deshalb ist es wichtig:
Ändere Deine Spec von "möglichst genau" in eine definierte Zeitangabe, 
z.B. +- 1ms (+-100us)....
Erst damit kannst Du ernsthaft mit Entwickeln anfangen.

Gruß, Stefan

von Endy (Gast)


Lesenswert?

Ich bedanke mich an der Stelle erstmal für die vielen Antworten! Das ist 
grade sehr hilfreich für mich!



derguteweka schrieb:
> Ethernet mit PTP(IEEE1588)

..und nicht zu vergessen, möglichst leicht, aber danke für den Tipp!

Ihr habt mir den CAN-Bus doch etwas schmackhaft gemacht. Die 
Lizensgebühren fallen nur für die Chiphersteller an, oder?
Ich muss mich mit dem Prinzip etwas anfreunden, dass es nicht so 
deterministisch ist und das sich die Teilnehmer in die quere kommen 
können und der eine Teilnehmer verzögert noch einmal senden muss, was 
aber bei einer geringen Auslastung wahrscheinlich egal ist?!

Es bleibt aber immer noch das Kernproblem mit der Synchronisation, beim 
CAN-Bus müssten ja auch tatsächlich alle Slaves über die genaue Zeit 
bescheid wissen. Gibt es beim CAN Ansätze, wie das gelöst wird? Mit 
zeitgenauen Broadcast-Nachrichten? Gibt es sowas?

von Endy (Gast)


Lesenswert?

m.n. schrieb:
> Nanosekundenbereich? Kleiner Job? => Schwachsinn.

Nein, Abschlussarbeit

m.n. schrieb:
> Schuster bleib bei deinen Leisten!

https://de.wikipedia.org/wiki/Mechatronik

von Cyblord -. (cyblord)


Lesenswert?

Endy schrieb:
> Liebe Bastler,
>
> ich bin Mechatronik-Student und soll im Rahmen eines kleinen Jobs ein
> Datenbussystem für ein kleineres (~3Kg), unbemanntes Flugzeug aufbauen.
> Ich bin dabei, ein möglichst robustes, einfaches und idiotensicheres
> Datenbussystem aufzubauen, mit dem noch viele Leute nach mir
> weiterarbeiten sollen.

Ich würde sagen, die haben den falschen für den Job genommen ;-)

Deine Einschätzung zu I2C unter den gegebenen Bedingungen ist 
grundfalsch. Für so eine Job braucht schon sowohl elektrotechnische als 
auch informationstechnische Kenntnisse. Ein Mechatroniker scheint die 
beste Wahl gewesen zu sein.

Ich würde alles an einen RS232 (besser RS485) hängen. Das ist einfacher 
und günstiger als CAN, aber wahrscheinlich ausreichend. Natürlich muss 
man sich für die Adressierung ein eigenes Protokoll ausdenken. Aber das 
ist sehr einfach. Auch eine Triggerung für eine gemeinsame Messung lässt 
sich so ohne Zusatzaufwand an alle Teilnehmer gleichzeitig senden. Die 
Ergebnisse kann man dann nach und nach abholen.
Es benötigt wenige Leitungen, ist aber relativ robust. Sogar wenn man 
"nur" RS232 mit ordentlichen Pegeln (+-10V) nimmt.

: Bearbeitet durch User
von Endy (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Ich würde sagen, die haben den falschen für den Job genommen ;-)
>
> Deine Einschätzung zu I2C unter den gegebenen Bedingungen ist
> grundfalsch. Für so eine Job braucht schon sowohl elektrotechnische als
> auch informationstechnische Kenntnisse. Ein Mechatroniker scheint die
> beste Wahl gewesen zu sein.


Es ist mir eigentlich ziemlich egal, was dazu denkst ;) Wenn Du meinst, 
an den Beiträgen komplett festzustellen, dass ich ungeeignet bin, auch 
in informationstechnischer Weise, dann herzlichen Glückwunsch für deine 
schnelle Auffassungsgabe!

Ansonsten wäre es geil, wenn wir zu dem Thema zurückkommen würden :)

von Endy (Gast)


Lesenswert?

Ok, es kam anscheinend noch etwas nach deiner Aussage. Ich kann leider 
nicht editieren, also ein danke im zweiten Post hinterher.

von Stefan (Gast)


Lesenswert?

Bei CAN gibt es sowas, das läuft unter TTCAN. Damit sollte eine 
Synchronisation im Bereich der CAN-Baudrate möglich sein. Welche mc 
willst Du verwenden?

Und welche genaue Zeitauflösung strebst Du jetzt an?

Gruß, Stefan

von Klaus (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Natürlich muss
> man sich für die Adressierung ein eigenes Protokoll ausdenken. Aber das
> ist sehr einfach.

Wie oft habe ich das schön gehört:

"Q931, TCP/IP, WasAuchImmer ..., alles für diese Anwendung zu 
kompliziert, da mach ich schnell was eigenes, viel einfacheres ..."

Und zum Schluß wurde etwas genauso kompliziertes aber schlecht 
dokumentiertes und im Prinzip unwartbares Trümmerfeld daraus. Da hätte 
man besser was fertiges nehmen sollen, das auch von vielen Anwendern 
schon debugged worden ist.

MfG Klaus

von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Cyblord ---- schrieb:
>> Natürlich muss
>> man sich für die Adressierung ein eigenes Protokoll ausdenken. Aber das
>> ist sehr einfach.
>
> Wie oft habe ich das schön gehört:
>
> "Q931, TCP/IP, WasAuchImmer ..., alles für diese Anwendung zu
> kompliziert, da mach ich schnell was eigenes, viel einfacheres ..."

Quatsch. Das "Protokoll" besteht aus einem Paket mit ein paar Feldern. 
Eines davon ist eine Adresse. Danach noch Länge und Payload und CRC. Das 
ist schnell gemacht. Auch in der Praxis habe ich so was schon öfters 
erfolgreich umgesetzt. In so einem dezidierten einfachen Fall gibt's da 
keine Probleme und jede Portierung einer bestehenden Lösung wäre schon 
aufwändiger.

Welches bestehende Protokoll würdest DU denn nehmen? CAN ist a.) wie 
Karl Heinz schon sagte, eher nicht geeignet. Und benötigt trotzdem noch 
eine Protokollschicht auf höherer Ebene. Man muss sich ID, Adressen und 
Messages ja auch überlegen und festlegen.

Der Einwand wegen Debuggtem Code ist auch Humbug, da man wohl kaum 
wirklich portiert, sondern nachimplementiert. Aber auch beim portieren 
können sich Fehler einschleichen.

Und gerade dein Beispiel TCP ist ein Paradebeispiel für ein extrem 
komplexes Protokoll. Für die Anwendung des TO absolut Overkill und führt 
nur zu Fehlern.

Am ehesten noch reine Ethernetframes via RS232/RS485.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Cyblord ---- schrieb:
> Ich würde alles an einen RS232 (besser RS485) hängen. Das ist einfacher
> und günstiger als CAN

Vielleicht minimal günstiger, aber auf keinen Fall einfacher.
Bei CAN mußt Du Dich um nix kümmern, macht alles die Hardware.
Der Sender schreibt was in einen Sendepuffer und kriegt nen Interrupt, 
wenn das fehlerfrei gesendet wurde.
Und der Empfänger kriegt nen Interrupt, wenn was in einem Empfangspuffer 
steht.

Der Master kann also senden, wann er lustig ist, ohne Rücksicht auf 
Fehler, Retries, CRC, Bus frei usw.
Dito der Slave.

Und zusätzlich kriegen Sender und Empfänger nen Timestamp des Paketes. 
D.h. der Slave kann in der Antwort mitteilen, wann vorher oder nachher 
er den Sensor gelesen hat. Diese Zeitdifferenz muß dann nur noch der 
Master zu seinem Timestamp der Anfrage addieren. Das ist bei 20MHz 
CPU-Takt auf 50ns genau, sollte wohl reichen.

von Stefan (Gast)


Lesenswert?

@Peter:
Hast Du das mit dem Timestamp schon einmal ausprobiert? Mit welchem 
Controller? Beim STM32Fxxx habe ich das Thema nur in den Errata 
gefunden. Beim Durchlesen des STM32Fxxx CAN-Manuals hatte ich den 
Eindruck, daß ein Zugriff auf den entsprechenden CAN-Timer vergessen 
wurde ...

Gruß, Stefan

von chris (Gast)


Lesenswert?

Habe dies schon mal implementiert.
Für gewisse Systeme ist der lin bus vorteilhaft,
Einfache UC, kein Quarz nötig, deterministisches timing.

von Peter D. (peda)


Lesenswert?

Stefan schrieb:
> Hast Du das mit dem Timestamp schon einmal ausprobiert? Mit welchem
> Controller?

Wir benutzen den AT90CAN128:

"The capture of the timer value is done in the MOb which receives or 
sends the frame. All managed MOb are stamped, the stamping of a received 
(sent) frame occurs on RxOk (TXOK)."

Der kleinste Vorteiler ist 8, d.h. bei 16MHz erreicht man 0,5µs 
Auflösung und 30ms Zählweite.
Sinnvoll ist aber nur eine Auflösung >=Baudrate, d.h. bei 500kBit 2µs (= 
130ms Zählweite).

: Bearbeitet durch User
von Kirtap (Gast)


Lesenswert?

Da du, Endy, ja auch auf der Suche nach Inspirationen und Ideen bist 
folgender Beitrag:

Wähle ein differentiell getriebener Bus (RS485), verzichte auf 
aufwändige Fehlererkennung oder gar Korrektur und nutze die 
Paritätsprüfung des U(S)ARTs als minimale Absicherung. Dein Protokoll 
sollte als Anfrage (1 Byte) die Adresse und als Antwort lediglich den 
Wert (vielleicht 1 bis 4 Byte) vorsehen. Die adressierbaren Slaves 
behandeln ihre UART-Kommunikation interrupt-getrieben, während die 
Messwerte im Polling-Betrieb ermittelt werden (Der Fokus liegt also 
darauf die Daten nach einer Anfrage schnellstmöglich zu senden, lässt 
sich sicherlich auch mit Interrupt Prioritäten lösen). Dieses einfache 
Konzept für Slaves dürfte auch für spätere Dritte verständlich sein.

Die Anforderung der Zeitgenauigkeit wird vollständig in deinen Master 
verlagert in dem du darauf ein Echtzeitbetriebssystem laufen lässt 
(nicht vom Begriff Echtzeitbetriebssystem erschlagen fühlen). Da gibt es 
z.B. das freie und bereits auf eine Vielzahl von Plattformen portierte 
FreeRTOS. Ein solches Echtzeitbetriebssystem schafft zusätzlich Struktur 
(für spätere Dritte). Für jede Sensorabfrage wird ein Task definiert mit 
einer harten (oder weichen) Bedingung. Diese Bedingung ist dann dein 
(festes) Delta für deine genaue Systemzeit bzw. Timestamp zum Messwert. 
Dieses Delta zu ermitteln ist zugegebenermaßen nicht einfach. Eine 
Plausibilitätsprüfung der Messwerte in den einzelen Tasks ist ebenfalls 
möglich.

Auch wenn der Vorschlag nicht das Gesuchte ist (ist schwierig 
Anforderungen abzuleiten mit "so zeitgenau wie möglich") lohnt es sich 
sicherlich darüber nachzudenken wohin man die geforderten Komplexitäten 
packen möchte.

von Peter D. (peda)


Lesenswert?

Endy schrieb:
> Ich habe im Rahmen meiner letzten Abschlussarbeit an einem Bussystem mit
> einer RS485 Schnittstelle mitgewirkt, das ganze soll im
> Nanosekundenbereich genau sein

1GHz RS485 klingt recht sportlich. Erzähl mal, wie das gehen soll.

von fredred (Gast)


Lesenswert?

Hallo Endy,

die Laufzeiten der verschiedenen Bussysteme sind immer vom Takt 
abhängig. Je höher der Takt, so sensibler wird er. Natürlich mit 
entsprechender Hardware kann sehr viel abgefangen werden. Ist halt eine 
Kostenfrage und natürlich auch die entsprechende Software muss stimmen.
Nach vielen Test habe ich mich für I²C entschieden. Sind die Leitungen 
SDA /SCL nicht  größer 2 Meter, benötigt man auch kein Bustreiber IC, 
mit sind auch 100 Meter kein Problem. Was aber oft nicht beachtet wird 
sind die „Einschwingzeiten“ für Analogsensoren. Wo ist der Sinn, die 
Sensoren alle µs abzufragen, wenn diese 10 µs oder bis 100 ms benötigen 
um diese als Digitalwerte bereit zu stellen. Die mir bekannten, 
Analogsensoren, benötigen immer ein Start für Neumessung. Haben ja meist 
ein kleinen RAM der die letzte Messung speichert.
Meine Testplatine mit 40 I²C Teilnehmer.
16x Digital IC, 8x Analog IC, 8x Digital Poti IC und 4x Eeprom IC. 
Benötigen mit Bustakt 100kHz ca. 2ms um Daten sauber auf dem Bus zu 
legen um die Daten für Auswertungen zu speichern. Mit Takt 400kHz 
natürlich schneller. Aber einige meiner IC sind überfordert. Auch nach 
viele Softwareoptimierungen, muss ich sagen irgendwo ist es Schluss für 
den Amateur.
Mein Rat: Las dich nicht Entmutigen. Somit folge den Rat der Profis, 
wenn Du einer dieser werden möchtest.

Mit freundlichen Grüßen
fredlich

von Klaus (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Quatsch. ...

Wie oft habe ich das schon gehört, und eigentlich immer hat es sich am 
Ende des Tages als falsch herausgestellt. Zum Schluß mussten dann alle 
Funktionen eines "richtigen" Protokolls nachimplementiert werden, wie 
Handshake, Resynchronisation, Timeouts etc. Und aus "schnell gemacht" 
wurde dann ein großes Projekt.

Die von mir genannten Protokolle waren nur als Beispiel gedacht und 
nicht als Vorschlag für den TO. Und hier

Cyblord ---- schrieb:
> Der Einwand wegen Debuggtem Code ist auch Humbug

hast du mich missverstanden. Es ging mir nicht um Debuggten Code, 
sondern um ein Debuggtes Protokoll, dokumentiert und getestet von 
anderen als dem Entwickler selbst.

MfG Klaus

von butsu (Gast)


Lesenswert?

ähm... du hast als Beispiel einen Feuchtesensor genannt. Wieviele 
Sekunden Ansprechzeit hat der denn? Oder sind es Minuten? Welche 
Sensoren werden denn verbaut werden, die weniger als ein paar 100ms 
Ansprechzeit haben?

Vielleicht musst du ja nicht mit deinem früheren Echtzeitsystemen 
"konkurrieren", sondern machst es so genau wie nötig / sinnvoll? DAS ist 
die Kunst des Ingenieurs...

von Flo (Gast)


Lesenswert?

Für einen Modellflieger (?) finde ich ein Bussystem eingetlich 
unpassend.
Ein Board pro Bereich, z.B. eines hinten und eins vorn, das alle 
notwendigen Sensoren plus Reserve ansprechen können, wäre denke ich 
einfacher und vor allem gewichtstechnisch leichter zu realisieren.
Statt jeweils ein Sensorknoten mit Controller, Busanbindung, eventuell 
Spannungsversorgung hättest du dann nur die Verdrahtung vom Sensor zur 
Hauptplatine.
Die Software wäre dann auch überschaubarer, da der Prozessor dann genau 
ein Timing für die direkt angeschlossenen Sensoren einhalten könnte.

von tim.ER (Gast)


Lesenswert?

Servus,

ich kenne das Problem nur mit einer geringfügig höheren Datenrate der 
"Sensoren" da ich mit ~2Gsps Abtasten muss. Die Messzeitpunke müssen 
halt zu einander passen.

zu "so genau wie möglich" wäre im low cost Bereich sowas:
http://www.spectratime.com/products/isync/ zu haben.
10Mhz Referenz zu den "Slaves"verteilen, OCVCXO auf die 10Mhz 
referenziert zur Systemtakt Generierung für einen FPGA her nehmen. Vom 
FPGA differentiell und parallel die Daten von den Slaves holen. So 
könnte das relativ kohärent laufen. Wenn du alle Komponenten auf die 
10Mhz Referenz gelockt sind und einen Trigger für alle nutzt, kannst du 
den statischen Fehler der durch die unterschiedlichen Messzeiten 
entsteht raus rechnen.

Relativ simpel: Trigger an -> alle messen -> nach der definierten zeit t 
werden alle werte abgeholt. Vom Zeitpunkt t die vorher vermessene post 
processing time abziehen und du hast deine Messzeitpunkte. Timestamp vom 
GPS dran und fertig.

Über Sinn oder Unsinn der Lösung brauchen wir nicht zu diskutieren 
solange wir nicht mal die Frage kennen.

von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Cyblord ---- schrieb:

> Die von mir genannten Protokolle waren nur als Beispiel gedacht und
> nicht als Vorschlag für den TO. Und hier
Das hilft dem TO aber nicht. Und Offtopic ist es somit auch. Du willst 
hier nur den Oberlehrer raushängen. Eine Lösung bringst du nicht.

Und deine Argumente sind eher dürftig. Mehr als "Habe ich schon tausend 
mal gesehen", "ist immer so" kommt von dir ja nicht. Glaub mir, ich habe 
auch schon genug gesehen und genug solcher Einfachst-Protokolle 
erfolgreich umgesetzt. Also Beweis durch Alter zieht nicht.

> hast du mich missverstanden. Es ging mir nicht um Debuggten Code,
> sondern um ein Debuggtes Protokoll, dokumentiert und getestet von
> anderen als dem Entwickler selbst.

Das mag ja sein, bei einfachen Protokollen ist aber schnell überschaubar 
ob es korrekt arbeitet. Und ein sehr einfaches Protokoll reicht dem TO 
hier. Außerdem führst du deine eigene Argumentation ad absurdum, wenn du 
auf ein bekanntes Protokoll zurückgreifen willst, aber nicht ein 
passendes nennen kannst.

Gerade im hier angesprochenen Modellbaubereich, beim eigentlichen Funk, 
aber mehr noch bei internen Bussen für Telemetriesensoren, kocht jeder 
Hersteller auch sein Süppchen. Und die funktionieren tadellos. Aber 
natürlich Wissen die Hersteller es nicht so gut wie du.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.