Analoge Eingänge
Analoge Messwerte über die Linux-IIO-Schnittstelle aus C und Python lesen.
Last updated: September 16, 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:deviceXund 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"
doneDie 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) * scaleFü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:
| Funktion | mögliches Wertattribut | mögliches _available-Attribut |
|---|---|---|
| Abtastrate | in_voltage_sampling_frequency | in_voltage_sampling_frequency_available |
| Oversampling | in_voltage_oversampling_ratio | in_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]
