Aus Raspberry Pi Geek 06/2017

Profi-A/D-Wandler ADC128D818 (Seite 2)

Abbildung 3: Der Schaltplan zu unserem Testaufbau. Die Potis dienen zum Einstellen der I»2«C-Adresse.

Abbildung 3: Der Schaltplan zu unserem Testaufbau. Die Potis dienen zum Einstellen der I»2«C-Adresse.

Listing 2

 

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- 1d -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Mithilfe der Werkzeuge I2cget und I2cset nehmen nun Sie eine erste Messung vor. Dazu bringen Sie den ADC128D818 in den Modus 1, aktivieren alle Eingänge und starten eine Einzelmessung. Danach lesen Sie den Wert des Eingangs 0 aus (Listing 3).

Listing 3

 

$ i2cset -y 1 0x1d 0x0b 0x02
$ i2cset -y 1 0x1d 0x08 0x00
$ i2cset -y 1 0x1d 0x09 0x01
$ i2cget -y 1 0x1d 0x20
0xaf

Haben Sie alles fehlerfrei aufgebaut, sollte I2cget einen hexadezimalen Wert liefern, der der Einstellung des Poti entspricht. Um eine weitere Messung zu starten, geben Sie die Befehle aus Listing 3 erneut ein. Die Register mit den Messwerten behalten so lange ihre Werte, bis Sie eine neue Messung starten.

Falls Sie kontinuierlich messen möchten, bewerkstelligen Sie das mit 0x01 in Register 0x00. Der ADC128D818 benötigt in diesem Fall kontinuierlich Strom und generiert selbst etwas Abwärme.

Testprogramm

Listing 4 zeigt nun das Programm, mit dem Sie die Werte des A/D-Wandlers auslesen und auf einem Bildschirm anzeigen (Abbildung 4). Da dem Testaufbau ein eigener X-Server für die Ausgabe fehlt, leiten Sie diese auf einen Desktop-PC um.

Abbildung 4: Die Ausgabe unseres Testprogramms erfolgt auf einem Desktop-PC, da der Testaufbau keinen eigenen X-Server besitzt.

Abbildung 4: Die Ausgabe unseres Testprogramms erfolgt auf einem Desktop-PC, da der Testaufbau keinen eigenen X-Server besitzt.

Listing 4

 

#include <gtk/gtk.h>
#include <wiringPiI2C.h>
#include <stdio.h>
GtkWidget *wert[8];
int handle,i;
gchar buf[10];
void beenden(GtkWidget *widget, gpointer data) {
  gtk_main_quit();
}
void messen (GtkWidget *widget, gpointer data) {
  wiringPiI2CWriteReg8(handle,0x0b,0x02);// Mode 1
  wiringPiI2CWriteReg8(handle,0x08,0x00);// enable all
  wiringPiI2CWriteReg8(handle,0x09,0x01);// Start Measurement
  usleep(100000);// wait for Measurement is done
  wiringPiI2CWriteReg8(handle,0x00,0x00);// Sleep Mode
  for (i = 0; i < 8; ++i) {
    int w = wiringPiI2CReadReg16(handle,i+0x20);
    int high =  w & 0x00ff;
    int low = (w & 0xff00)>>8;
    w = ((high<<8)|low)>>4;
    float messwert = (w*2.56)/4095;
    sprintf(buf,"IN%i: %.03fV",i,messwert);
    gtk_label_set_text(GTK_LABEL(wert[i]),buf);
  }
}
int main( int argc, char *argv[] ) {
  handle = wiringPiI2CSetup(0x1d);
  GtkWidget *fenster, *button_messen, *button_beenden;
  GtkWidget *ueberschrift;
  GtkWidget *box_main_v,*box_button_h,*box_in_v;
  int messwert[8];
  gtk_init( &argc, &argv );
  fenster = gtk_window_new( GTK_WINDOW_TOPLEVEL );
  gtk_window_set_title(GTK_WINDOW(fenster),"ADC128D818");
  gtk_window_set_default_size(GTK_WINDOW(fenster),200,300);
  gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);
  gtk_container_set_border_width(GTK_CONTAINER(fenster),20);
  button_messen  = gtk_button_new_with_label("messen");
  g_signal_connect(button_messen,"clicked",G_CALLBACK(messen),NULL);
  button_beenden = gtk_button_new_with_label("beenden");
  g_signal_connect(button_beenden,"clicked",G_CALLBACK(beenden),NULL);
  box_main_v = gtk_box_new(GTK_ORIENTATION_VERTICAL,2);
  ueberschrift = gtk_label_new ("ADC128D818");
  gtk_container_add(GTK_CONTAINER(box_main_v),ueberschrift);
  gtk_container_add(GTK_CONTAINER(box_main_v),gtk_label_new("     "));
  box_in_v = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  for (i = 0; i < 8; ++i) {
    sprintf(buf,"IN%i: %.03fV",i,0.0);
    wert[i]=gtk_label_new (buf);
    gtk_container_add(GTK_CONTAINER(box_main_v),wert[i]);
  }
  gtk_container_add(GTK_CONTAINER(box_main_v),box_in_v);
  box_button_h=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
  gtk_container_add(GTK_CONTAINER(box_main_v),gtk_label_new("     "));
  gtk_container_add(GTK_CONTAINER(box_button_h),button_messen);
  gtk_container_add(GTK_CONTAINER(box_button_h),button_beenden);
  gtk_container_add(GTK_CONTAINER(box_main_v),box_button_h);
  gtk_container_add(GTK_CONTAINER(fenster),box_main_v);
  gtk_widget_show_all(fenster);
  gtk_main();
  return 0;
}

Linux-Anwender sind an dieser Stelle fein heraus: Sie geben dem SSH-Kommando, mit dem Sie sich auf den RasPi verbinden, einfach die Option -X mit, und schon erscheinen alle Ausgaben auf dem Desktop-PC. Unter Windows fallen deutlich mehr Handgriffe an: Dort aktivieren Sie erst einmal in Putty das X11-Forwarding und installieren dann einen lokalen X-Server [5]. Alternativ schließen Sie einen Monitor an den RasPi an und starten dort die grafische Oberfläche.

Das Programm besteht aus zwei Teilen. Die Funktion main(); ab Zeile 29 baut lediglich die Oberfläche auf und bindet die Funktionen ein, um die zwei Schaltflächen abzufragen. Den GTK+-Teil bespricht ein eigener Artikel in der Rubrik “Software” dieser Ausgabe.

In der Funktion messen(); ab Zeile 12 erfolgt die eigentliche Kommunikation mit dem ADC128D818. Sie konfiguriert den A/D-Wandler genau so, wie Sie es beim ersten Test auf der Kommandozeile gemacht haben. Danach liest sie in der Schleife ab Zeile 18 alle acht Kanäle jeweils als Wort mit 16 Bit Breite ein. Die vom Wandler gelieferten 12 Bit sind beim Übertragen zum RasPi verdreht. Das Zurückdrehen der Bits an die richtigen Positionen geschieht mithilfe der Schiebeoperationen in den Zeilen 21 und 22.

Nachdem alle 12 Bit wieder an der richtigen Stelle stehen, errechnet die Funktion die real gemessene Spannung mithilfe der Referenzspannung (Zeile 23) und legt sie in der Variablen messwert ab. Das Programm schreibt den Wert dann an die entsprechende Stelle ins Frontend (Zeile 24 und 25).

Mit den Kommandos aus Listing 5 kompilieren und starten Sie das Testprogramm. Die Warnungen beim Starten des Programms haben für dessen Funktion keine Bedeutung.

Listing 5

 

$ gcc ADC128.c `pkg-config --cflags gtk+-3.0 --libs` -lwiringPi -o ADC128
$ ./ADC128
** (ADC128:20309): WARNING **: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-TUdvld0yCc: Connection refused
Gtk-Message: Failed to load module "canberra-gtk-module"
Gtk-Message: Failed to load module "canberra-gtk-module"

Fazit

Beim ADC128D818 handelt es sich um einen modernen und exakt arbeitenden A/D-Wandler, der es durch seine vielen Möglichkeiten zur Konfiguration erlaubt, die Hardware an viele verschiedene Anforderungen anzupassen. Das macht den Einsatz allerdings etwas komplizierter als bei seinen Verwandten, etwa dem PCF8591 oder dem MCP3008. Der ADC128D818 kommt zudem etwas teurer, sorgt dafür aber für wesentlich höhere Genauigkeit. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben