RevPi Compact Analog Out - Werteaktualisierung nur jede Sekunde

Rund um die Hardware des Revolution Pi
Post Reply
dd0815
Posts: 6
Joined: 20 Apr 2021, 07:51

RevPi Compact Analog Out - Werteaktualisierung nur jede Sekunde

Post by dd0815 »

Hallo zusammen,

bei den ersten Feld-Versuchen mit dem RevPi Compact im Zusammenspiel mit Analogein- und -ausgängen (Analogwert einlesen und denselben Wert ausgeben) ist uns aufgefallen, dass der analoge Wert mit ca. 1s Verzögerung ausgegeben wird (das analoge Einlesen hingegen scheint auf den ersten Blick diese Verzögerung nicht zu haben). Das ist für unsere Applikation leider nicht akzeptabel.

Das Testprogramm wurde mit LogiCad erstellt und läuft mit einer Tasklaufzeit von 1ms.

Offenbar kann man das normale RevPi AIO konfigurieren: https://revolution.kunbus.com/tutorials ... urieren-2/.

Gibt es diese Einstellmöglichkeiten auch für den RevPi Compact oder muss ich mit der Verzögerung leben?

Viele Grüße,
dd0815
User avatar
lukas
Expert
Posts: 186
Joined: 13 Feb 2017, 10:29

Re: RevPi Compact Analog Out - Werteaktualisierung nur jede Sekunde

Post by lukas »

Die analogen Ausgänge werden auf dem Compact mit einer Zykluszeit von 250 usec aus dem Prozessabbild von piControl synchronisiert.

Die analogen Eingänge werden hingegen mit einer Zykluszeit von 1 Sekunde ausgelesen und ins Prozessabbild geschrieben. Das liegt daran, dass alle 8 Eingänge mittels eine Multiplexers auf einen einzigen ADC geleitet werden. Der ADC ist sehr präzise (21 Bit + Overrange/Underrange) aber braucht dafür sehr lange für eine Messung. Weil der Multiplexer zum Umschalten Zeit braucht und bei einer PT100 Messung zusätzlich die Stromquelle ein- und ausgeschaltet werden muss, haben wir 125 msec für eine Messung vorgesehen. Macht bei 8 Kanälen dann 1 sec Zykluszeit. Auch wenn man nur 1 Kanal aktiv hat, wird trotzdem nur 1x pro Sekunde ausgelesen. Könnte man im piControl prinzipiell ändern.

Dass sich bei dir die Ausgänge nur 1x pro Sekunde ändern, liegt also nicht an den Ausgängen, sondern an den Eingängen bzw. dass du diese auf die Ausgänge spiegelst.
dd0815
Posts: 6
Joined: 20 Apr 2021, 07:51

Re: RevPi Compact Analog Out - Werteaktualisierung nur jede Sekunde

Post by dd0815 »

Hallo lukas,

vielen Dank für Deine hilfreiche und ausführliche Antwort.

Zur Erklärung: wir wollten als Nebenfunktion den RevPiCompact als Teiler für eine Bandgeschwindigkeit benutzen, daher sind Einlesen und Ausgeben eines analogen Wertes gekoppelt...

Du schreibst "Könnte man im piControl prinzipiell ändern.": Kann ich das als Anwender machen oder müsstet Ihr das machen? Wenn ich das machen kann, bitte mir kurz beschreiben wie...

Viele Grüße,
dd0815
->Johannes<-

Re: RevPi Compact Analog Out - Werteaktualisierung nur jede Sekunde

Post by ->Johannes<- »

Hi dd0815,

hierfür gibt es die Kernelbakery

KernelBakery

Damit erstellst du dir deinen eigenen Kernel.

Hier kannst du mal zum Thema piControl forschen.

piControl

Die Arbeit musst du dir dann erstmal selbst machen und bist natürlich auch für die Funktion selbst verantwortlich.

Grüße

Johannes
dd0815
Posts: 6
Joined: 20 Apr 2021, 07:51

Re: RevPi Compact Analog Out - Werteaktualisierung nur jede Sekunde

Post by dd0815 »

Hallo Johannes,

vielen Dank für die Antwort und die Links, da weiß ich bzw. meine Chefs erstmal Bescheid...

Wir haben den Test auch nochmal mit einem RevPi3Core und einem AIO wiederholt, das sieht das Einlesen des Analogeinganges schon etwas besser aus - geschätzt statt 1s wie beim Compact nur ca. eine halbe Sekunde, leider ist die Verzögerung immer noch deutlich sichtbar. Ich vermute da hat jeder Analogeingang seinen eigenen AD-Wandler.

Es wäre schön, wenn jemand vom Entwicklungsteam (z.B. lukas) unsere Schätzung der Vollständigkeit halber mit konkreten Zahlen hinterlegen könnte...

Viele Grüße,
dd0815
User avatar
lukas
Expert
Posts: 186
Joined: 13 Feb 2017, 10:29

Re: RevPi Compact Analog Out - Werteaktualisierung nur jede Sekunde

Post by lukas »

Hallo dd0815,

bitte entschuldige die verzögerte Antwort.
dd0815 wrote: 21 Jul 2021, 15:12 Du schreibst "Könnte man im piControl prinzipiell ändern.": Kann ich das als Anwender machen oder müsstet Ihr das machen? Wenn ich das machen kann, bitte mir kurz beschreiben wie...
Da der Quelltext von piControl offengelegt ist, kann das grundsätzlich jeder ändern. Es ist allerdings nicht völlig trivial, denn man muss zunächst den Quelltext in C ändern und anschließend mit Hilfe von kernelbakery ein neues "raspberrypi-kernel" Debian-Paket erzeugen und installieren. Das Debian-Paket enthält neben dem Kernel auch das (geänderte) "piControl.ko" Kernel-Modul.

Im piControl-Quelltext findest du in der Datei revpi_compact.c die Funktionen revpi_compact_poll_io() und revpi_compact_poll_ain(). Erstere setzt den DAC gemäß den Analog Output Werten im Prozessabbild, letztere liest die ADC Werte ein und speichert sie im Prozessabbild. In revpi_compact_poll_ain() wird mit der Funktion cycletimer_change() eingestellt, dass die Analog Inputs 1x pro Sekunde gelesen werden. Hat man z.B. nur einen einzigen Analog Eingang in Benutzung, dann werden 125 msec pro Sekunde für diesen Analogeingang aufgewendet und die restlichen 875 msec schläft der Thread. Diese Logik kannst du ändern, so dass das Schlafen für 875 msec entfällt und sofort wieder der eine Analogeingang eingelesen wird. Wir haben uns damals dagegen entschieden, das so zu implementieren, weil wir ein deterministisches Verhalten haben wollten mit immer gleicher Zykluszeit, egal wieviele Analogeingänge man in PiCtory aktiviert hat. Das lässt sich dann auch leichter verständlich im Datenblatt kommunizieren, nämlich: Zykluszeit 1 sec für die Analogeingänge.

Falls dir das Herumfummeln am piControl Quelltext zu kompliziert ist, gibt's noch eine andere Option: Du kannst piControl abschalten und direkt über sysfs auf die analogen Ein- und Ausgänge zugreifen. Wie das geht, erfährst du im Tutorial. Wenn du kürzestmögliche Latenzen haben möchtest, macht dieser Weg vielleicht den meisten Sinn für dich.
Post Reply