querdenker engineering
Schnittstellen und Services

Analoge Eingänge

Analoge Messwerte über die Linux-IIO-Schnittstelle aus C und Python lesen.

Zuletzt geändert: 16. September 2026

Analoge Eingänge werden über das Linux Industrial-I/O-Subsystem (IIO) abgebildet. Der Device Tree beschreibt den ADC und seine Kanäle; im Userspace werden die vom IIO-Treiber bereitgestellten Kanäle gelesen.

Die gerätespezifische Zuordnung von Messgrößen, IIO-Geräten und Kanälen ist in der jeweiligen Systemreferenz des verwendeten Geräts beschrieben.

Voraussetzungen

  • Der ADC-Treiber ist aktiviert und im Device Tree konfiguriert.
  • Ein IIO-Gerät /dev/iio:deviceX und die zugehörigen Kanalattribute sind vorhanden.
  • Kanal und Einheit sind bekannt.
  • IIO-Treiber und Kernel-Version sind freigegeben: [KERNEL-UND-IIO-VERSION].
for device in /sys/bus/iio/devices/iio:device*; do
    printf '%s: ' "$device"
    cat "$device/name"
done

Die Kanalwerte und ihre Parameter stehen unter /sys/bus/iio/devices/iio:deviceX/. Für hohe Abtastraten oder Ereignisse wird die gepufferte Schnittstelle /dev/iio:deviceX verwendet.

Rohwert und Skalierung

Für analoge Messkanäle stellt der IIO-Treiber üblicherweise ein kanalspezifisches *_raw-Attribut bereit, bei Spannungskanälen zum Beispiel in_voltageY_raw. Dieses Attribut liefert den nicht skalierten Rohwert.

Falls der Treiber Skalierungs- oder Offset-Attribute bereitstellt, werden diese zusätzlich gelesen. Sie können kanalspezifisch (in_voltageY_scale bzw. in_voltageY_offset) oder für alle Kanäle gemeinsam (in_voltage_scale bzw. in_voltage_offset) gelten. Die tatsächlich vorhandenen Attribute und ihre Einheiten sind aus dem jeweiligen IIO-Treiber und dem Sysfs-Verzeichnis des Geräts zu entnehmen. Fehlende Attribute dürfen nicht durch selbst gebildete Pfade ersetzt werden.

Die konkrete Formel ist der Dokumentation des IIO-Treibers zu entnehmen. Häufig gilt:

Messwert = (raw + offset) * scale

Für einen Spannungskanal kann die Umrechnung beispielsweise so aussehen. Ob das Skalierungsattribut kanalspezifisch oder gemeinsam ist, muss anhand der vorhandenen Sysfs-Dateien geprüft werden:

IIO_DEVICE="/sys/bus/iio/devices/iio:deviceX"
CHANNEL=6

RAW=$(cat "$IIO_DEVICE/in_voltage${CHANNEL}_raw")
SCALE_PATH="$IIO_DEVICE/in_voltage${CHANNEL}_scale"
if [ ! -e "$SCALE_PATH" ]; then
    SCALE_PATH="$IIO_DEVICE/in_voltage_scale"
fi
SCALE=$(cat "$SCALE_PATH")

awk -v raw="$RAW" -v scale="$SCALE" \
    'BEGIN { printf "Messwert: %.3f mV\n", raw * scale }'

Die Einheit des Skalierungswerts und die Berechnungsformel müssen bei anderen IIO-Treibern anhand der Treiberdokumentation geprüft werden. Wenn ein *_offset-Attribut vorhanden und für den Treiber relevant ist, wird es gemäß der dort beschriebenen Formel zusätzlich berücksichtigt.

Die folgenden C- und Python-Beispiele verwenden kanalbezogene Attribute. Wenn der Treiber gemeinsame Attribute bereitstellt, sind die Pfade wie im Shell- Beispiel ohne Kanalnummer zu verwenden.

#include <stdio.h>

int read_iio_value(const char *device_path, const char *channel, double *value)
{
    char path[256];
    int raw;
    double scale;
    double offset = 0.0;
    FILE *file;

    (void)snprintf(path, sizeof(path), "%s/in_%s_raw", device_path, channel);
    file = fopen(path, "r");
    if (!file || fscanf(file, "%d", &raw) != 1) {
        if (file) {
            (void)fclose(file);
        }
        return -1;
    }
    (void)fclose(file);

    (void)snprintf(path, sizeof(path), "%s/in_%s_scale", device_path, channel);
    file = fopen(path, "r");
    if (!file || fscanf(file, "%lf", &scale) != 1) {
        if (file) {
            (void)fclose(file);
        }
        return -1;
    }
    (void)fclose(file);

    (void)snprintf(path, sizeof(path), "%s/in_%s_offset", device_path, channel);
    file = fopen(path, "r");
    if (file) {
        (void)fscanf(file, "%lf", &offset);
        (void)fclose(file);
    }

    *value = ((double)raw + offset) * scale;
    return 0;
}

/* Beispiel: read_iio_value("/sys/bus/iio/devices/iio:device0", "voltage0", &value); */

Abtastrate und weitere Einstellungen

Je nach ADC und IIO-Treiber können beispielsweise Attribute für Abtastrate, Oversampling und weitere Betriebsparameter vorhanden sein. Welche Attribute vorhanden und schreibbar sind, ist treiberabhängig. Ein mögliches Muster ist:

Funktionmögliches Wertattributmögliches _available-Attribut
Abtastratein_voltage_sampling_frequencyin_voltage_sampling_frequency_available
Oversamplingin_voltage_oversampling_ratioin_voltage_oversampling_ratio_available

Die möglichen Werte werden zuerst über das jeweilige _available-Attribut gelesen. Anschließend darf nur einer dieser Werte in das zugehörige Einstellungsattribut geschrieben werden:

IIO_DEVICE="/sys/bus/iio/devices/iio:deviceX"

cat "$IIO_DEVICE/in_voltage_sampling_frequency_available"
cat "$IIO_DEVICE/in_voltage_oversampling_ratio_available"

echo "[WERT-AUS-SAMPLING-FREQUENCY-AVAILABLE]" \
    > "$IIO_DEVICE/in_voltage_sampling_frequency"
echo "[WERT-AUS-OVERSAMPLING-RATIO-AVAILABLE]" \
    > "$IIO_DEVICE/in_voltage_oversampling_ratio"

Ob ein Attribut für das gesamte IIO-Gerät oder nur für einen Kanal gilt, ist anhand des Namens und der Treiberdokumentation zu prüfen. Vor dem Schreiben sind außerdem die Zugriffsrechte, die aktuelle Belegung des Geräts und die Auswirkungen auf laufende Messungen zu prüfen. Weitere Parameter wie Skalierung oder Offset können je nach Treiber ebenfalls als Sysfs-Attribute vorhanden sein; ihre Änderbarkeit und Bedeutung sind der jeweiligen Treiberbeschreibung zu entnehmen.

Kanalbeschreibung und Sicherheit

Die Kanalnummer, Skalierung, Einheit, Eingangsbereiche und Abtastrate sind systemspezifisch. Prüfe insbesondere, ob der Eingang 0–10 V, 0–24 V, 0–20 mA oder einen anderen elektrischen Bereich erwartet. Ein falscher Anschluss kann den ADC oder die angeschlossene Hardware beschädigen.

[PLATZHALTER: IIO-Gerät, Kanalnamen, Einheiten, Skalierung, Offset-Definition, Messbereich und gepufferte Beispielkonfiguration]