Wie Jitter und/oder Packet Loss von Signalkette ADC > Ethernet > PC quantifizieren?

OP #7477314
Lesenswert?

Hallo zusammen!

Ich habe hier einen STM32, welcher Signale über den internen ADC abtastet und via Ethernet und UDP an einen Rechner sendet. Funktioniert soweit schon fast...

Ich möchte sichergehen, dass: a) der ADC gleichmäßig abtastet b) keine Samples zwischen ADC und PC verloren gehen

a) sollte passen, ADC wird "hart" über einen Interrupt abgetastet. Evtl. toggle ich einen Pin und kann so die Gleichmäßigkeit der ADC Calls checken. b) möchte ich gerne verifizieren. Nur wie?:

=> Jedes Sample mit einem Timestamp versehen und checken, dass alle ankommen? Kostet halt massiv Bandbreite, das auch noch mit zu senden => Testsignal im ADC Interrupt erzeugen (bspw. Sägezahn) und anschließend am PC kontrollieren? => Irgendwie ein Testsignal in den ADC einspeisen und schauen, obs clean aussieht?

Wie würdet ihr das machen?

Bin gespannt!

#7477338
Lesenswert?

Jakob K. schrieb:

a) sollte passen, ADC wird "hart" über einen Interrupt abgetastet.

Interrupt? Das klingt mir sehr nach Software. Da hast Du Jitter, weil der Controller evtl. noch in einem anderen Interrupt ist, Interruptprioritäten, unterschiedliche IRQ-Entry-Zeiten etc.

Besser macht man das mit Trigger Events. Schau mal im Ref. Man. von Deinem STM32-Modell nach "Conversion on external trigger".

b) möchte ich gerne verifizieren. Nur wie?:

=> Jedes Sample mit einem Timestamp versehen und checken, dass alle ankommen? Kostet halt massiv Bandbreite, das auch noch mit zu senden

Wenn a) sichergestellt ist, musst Du nur noch die Übertragung prüfen. Da Du UDP schreibst, solltest Du auch sicherstellen daß die Pakete in der richtigen Reihenfolge ankommen, das garantiert UDP nämlich nicht.

Du musst keinen vollen Timestamp mit jedem Paket mitsenden, da Du ja grob die Zeit des PCs verwenden kannst um die in einem Zeitraum empfangenen Pakete zu zählen und so sicherzustellen daß die Größenordnung stimmt.

Jetzt musst Du Dich nur noch gegen den Verlust einzelner Pakete absichern. Das kannst Du nicht mit der Uhr des PCs machen da die leicht vom Takt des Controllers abweicht. Also füge einfach jedem Deiner Pakete ein extra Byte mit einem 8 Bit Zähler hinzu. Den erhöhst Du mit jedem Paket, nach 256 Paketen läuft er über und fängt wieder bei 0 an. Das sollte reichen um sicher zwischen Zeitabweichung und Paketverlust zu unterscheiden. Außerdem kannst Du so die Paketreihenfolge prüfen.

#7477343
Lesenswert?

Moin,

Jakob K. schrieb:

=> Jedes Sample mit einem Timestamp versehen und checken, dass alle ankommen? Kostet halt massiv Bandbreite, das auch noch mit zu senden

Bauste halt auf UDP noch RTP drauf, das macht dann 12Byte mehr pro (UDP)Packerl, dafuer gibts einen Continuitycounter und Timestamps. Sinnvollerweise sendet man mehrere Samples in einem UDP/RTP-Paket oder wenns wirklich so pressiert, verkneift man sich das Jammern ueber zuviel Bandbreite...

Gruss WK

#7477437
Lesenswert?

Auf uC Seite würde ich mit einem DMA und einem Ping Pong Buffer die Daten sampeln. Dann bist du uC seitig unabhängig von evtl Jitter innerhalb deiner Tasks und die Hardware übernimmt komplett das Erfassen der Daten.

Damit du nicht noch vor dem Versenden umkopieren musst, schaufelt der DMA direkt in den Member deiner Frames im RAM. Im DMA End Interrupt berechnest du nur noch deine Prüfsumme falls notwendig (nimm die CRC Perepherie im STM, die ist schneller) und startest den Ethernet Transfer über einen zweiten DMA.

Jakob K. schrieb:

abtastet und via Ethernet und UDP an einen Rechner sendet.

Jakob K. schrieb:

Ich möchte sichergehen, dass: b) keine Samples zwischen ADC und PC verloren gehen

Das wiederspricht sich meiner Meinung nach. UDP stellt ja gerade nicht sicher dass es überhaupt ankommt. Was soll denn passieren wenn Frames verloren gehen? Darf das überhaupt passieren? Wenn nein, brauchst du was verbindungsorientiertes. Wenn ja, siehe unten.

Jakob K. schrieb:

=> Jedes Sample mit einem Timestamp versehen und checken, dass alle ankommen?

Du wirst ja nicht nur ein ADC Sample pro UDP Frame versenden? Das wäre ja ineffektiv hoch 10! Mach den Frame relativ voll um wenig Overhead zu haben. Oder halt wenigstens ein paar kB groß. Ein Zeitstempel pro Übertragung reicht ja auch, der Rest ist ja äquidistant abgetastet. RTP würde von Dergute W ja bereits genannt.

Edit: Typo

(Firma: egal) #7477474
Lesenswert?

N. M. schrieb:

Ein Zeitstempel pro Übertragung reicht ja auch

Im Prinzip langt auch ein einfacher Zähler, der bei jedem Paket hochzählt. Da erkennt man Lücken sofort erkenne und Überholungen kann man auch wieder sortieren. Bei Timestamps muss man immer noch etwas rumrechnen, ob dazwischen einer Fehlt oder ob der Timestamp nur eine ungünstige Rundung gemacht hat.

#7477913
Lesenswert?

Eine erste Frage waere ob das Ganze nur eine Quantifizierung des Jitters sein soll, oder eher eine Vermeidung. Falls der Jitter minimal sein soll, wuerde man das Timing mit einem CPLD/FPGA produzieren, und der Controller wuerde per Interrupt, resp DMA abholen. UDP ist uebrigens super zuverlaessig wenn man's alleine laufen laesst, dh nicht ueber das Firmennetzwerk.

Wie ueblich fehlt ein wichtiges Detail .. von welcher Sampling rate reden wir ?

Gast #7477920
Lesenswert?

Der ADC wird im Free Running Mode von seinem eigenen Timer getaktet. Auf eine Regelmäßige Abtastung kannst du dich so verlassen.

Wenn du nicht jede Messung übertragen willst, könntest du im Interrupt-Handler mit Zählen und z.B. nur jede 4. Messung verwenden.

Wenn dir das zu viele Interrupts sind, nutze den DMA um die Messergebisse ins RAM; zu übertragen. Der DMA sagt die dann über einen anderen Interrupt, wenn die vorher festgelegte Anzahl von Messungen erledigt wurde. Dann schaltest du auf einen zweiten Puffer um und kannst den Inhalt des ersten Puffers in Ruhe verarbeiten/senden.

Jedes Sample mit einem Timestamp versehen

Halte ich für unvermeidbar, da die Laufzeit von Ethernet Paketen ungewiss ist.

#7478712
Lesenswert?

N. M. schrieb:

Du wirst ja nicht nur ein ADC Sample pro UDP Frame versenden? Das wäre ja ineffektiv hoch 10! Mach den Frame relativ voll um wenig Overhead zu haben.

Genau das dachte ich auch gerade. Einmal abgesehen dass niemand weiss wie dein Netzwerk aussieht (Switches, andere Teilnehmer...) hast du bei IPv4 UDP schon ohne Daten einen Overhead von 20 Byte. Ein NIC oder Switch wird dir bei einen Buffer-Overflow halt dann auch Pakete verwerfen, erst recht wenn du UDP verwendest. Und dein PC wird sicher nicht die Daten mit deiner ADC-Samplefrequenz bearbeiten müssen...

Ich würde 100-1000 Werte sammeln (DMA, double buffer Prinzip), 1 TimeStamp versehen und dann versenden. TCP hätte ein paar Vorteile z.B. Paket-Reihenfolge und -Loss, muss aber nicht sein. Dann baust du dir halt selber ein entsprechendes Protokoll nach. Deine PC-Applikation kann aus dem TimeStamp und Anzahl Werten dann die Zwischenzeiten wenn nötig wieder errechnen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren