Kampis Elektroecke

Frequenzmessung auf dem Raspberry Pi

In diesem Artikel zeige ich, wie ein Kernelmodul zur Frequenzmessung für den Raspberry entworfen und genutzt werden kann. Das Kernelmodul erzeugt ein virtuelles Gerät, welches anschließend mit einem Python-Programm ausgelesen wird. Der Rückgabewert des Gerätes ist die gemessene Frequenz des Signals. 

Aufbau des Kernelmoduls:

Die Zeiterfassung für das Messen der Signalfrequenz erfolgt im Kernelmodul mit Hilfe von Kernelinterrupts. Dazu wird der benötigte I/O als Ausgang geschaltet und ein Falling-Edge-Interrupt aktiviert:

Der Rückgabewert der Funktion ist eine Nummer, die auf den reservierten Interrupt verweist. Diese Nummer muss auf einen gültigen Wert überprüft und gespeichert werden, da sie beim Beenden des Moduls wieder freigegeben werden muss.

Bei jedem Sprung in die GPIO IRQ wird die aktuell gespeicherte Kernelzeit von der Variable Low in die Variable High kopiert und eine neue Zeit in Low gespeichert. 

Beide Werte werden beim Lesen des virtuellen Gerätes genutzt um, unter Berücksichtigung der Resolution, die Periodendauer zu berechnen und anschließend an den Userspace weiterzugeben.

Durch die If-Abfrage werden zudem ungültige Eingaben in der Resolution-Datei abgefangen. Die Auflösung wird in diesem Fall auf Nanosekunden gesetzt.

Über entsprechende Operationen im Proc-Filesystem wird die Konfiguration der Auflösung behandelt:

Damit sind die wichtigen Komponenten des Kernelmoduls erklärt. Das Modul muss jetzt noch kompiliert werden. Hierfür werden die Sourcen des verwendeten Kernels und eine passende Toolchain benötigt. Die Version des Kernels kann innerhalb der Konsole des Raspberry Pi abgerufen werden:

Für die Kompilierung des Moduls kann das folgende Makefile genutzt werden:

Zudem sollten die Umgebungsvariablen für den Cross-Compiler und die Kernel-Sourcen gesetzt und der Kernel mind. einmal kompiliert worden sein. Wie das geht wird hier beschrieben.

Nachdem das Modul kompiliert worden ist, kann es auf den Raspberry Pi übertragen werden. Im nächsten Schritt schauen wir uns an, wie sich das Modul im Praxistest schlägt…

Test des Kernelmoduls:

Zum Testen habe ich die Hardware-PWM des Raspberry Pi verwendet. Die PWM wird im Standardfall an GPIO 18 ausgegeben und das Frequenzzählmodul verwendet GPIO 17. Beide Pins wurden miteinander gebrückt um die PWM mit dem Frequenzzähler auswerten zu können. Es muss dann nur noch die PWM eingestellt und aktiviert werden:

Anschließend wird das Kernelmodul geladen:

Unter /dev ist nun ein neues Gerät mit dem Namen PeriodeCounter zu finden.

Aus diesem Gerät kann die gemessene Signalfrequenz ausgelesen werden. Zusätzlich ist unter /proc/PeriodeCounter eine Datei namens Resolution zu finden. Mit dieser Datei kann die Auflösung des Frequenzzählers konfiguriert werden. Dabei stehen folgende Auflösungen zur Verfügung:

  • Milisekunden – ms
  • Mikrosekunden – us
  • Nanosekunden – ns

Das Auslesen der gemessenen Periodendauer kann in Python über einen Dateizugriff umgesetzt werden:

Das Programm ließt die eingestellte Auflösung aus der Resolution-Datei aus. Anschließend wird in einer Endlosschleife das virtuelle Gerät des Frequenzzählers ausgelesen und das Ergebnis wird, zusammen mit der Auflösung, in der Konsole dargestellt.

Das komplette Projekt kann in meinem Raspberry Pi GitLab-Repository gefunden und heruntergeladen werden.

Viele Grüße
Daniel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.