Hardware-Projekte

Prof. Jürgen Plate

Conrad 10-Bit-Datenerfassungssystem

Dieses Datenerfassungssystem für PCs wird einfach an die serielle, 9pol. Schnittstelle des Rechners angeschlossen. Das System kann bis zu 8 analoge Signale in einem Spannungsbereich von 0 - 5 V erfassen (Auflösung 10-Bit), welche in einem C-Programm angezeigt und ausgewertet werden. Die Schaltung besteht aus dem 10-Bit-A/D-Converter LTC 1090 und einem hochgenauen Referenzbaustein.

Technische Daten:

Der A/D-Wandler wird über ein 1:1-Kabel mit 9-poligen SUB-D-Steckern an der seriellen Schnittstelle RS 232 (COM-Port) Ihres Rechners angeschlossen.

Der A/D-Wandler wird über die Handshake-Leitungen der seriellen Schnittstelle mit Strom versorgt. Der Wandler hat einen so geringen Eigenstromverbrauch, daß das an Desktop-Rechnern problemlos möglich ist. Die serielle Schnittstelle ist außerdem vollkommen kurzschlußsicher, so daß hier normalerweise keine Beschädigungen auftreten können.

Laptops der neuen Gerneration arbeiten vermehrt mit einer Spannungsversorgung von nur noch 3,3 Volt. Dabei wird auch die RS 232 nur noch mit einem Spannungspegel von unter 6 Volt versorgt. Dies kann dazu führen, daß die Spannungswerte für eine einwandfreie Fremdspeisung vom Rechner aus für den Betrieb des A/D-Wandlers nicht mehr ausreichen.

Die Präzisions-Referenzspannungsquelle erzeugt aus den Handshake-Leitungen der seriellen Schnittstelle eine präzise Spannung von 5,000 Volt. Sie ist sogar in der Lage, die Versorgung des AD-Wandlers zu liefern. Man kann sehr einfach testen, ob die Spannungsversorgung über den PC ausreicht. Hierzu wird ein normales Multimeter während der laufenden Messungen an Pin 4 (GND) und Pin 6 (Ref 5,000 Volt) des Festspannungsreglers LT 1021-5 angeschlossen. Wenn alles korrekt läuft, muß hier eine Spannung von genau 5,000 Volt anliegen.

Der AD-Wandler LTC 1090 stellt ein fast komplettes Datenerfassungssystem dar. Der zusätzliche Bauteilebedarf ist nur gering. Ein Taktgenerator und eine Referenzspannung reichen zur Komplettierung aus. Zur seriellen Datenübertragung werden nur die Leitungen DataIn und DataOut benötigt. Mit der Leitung ShiftClock wird die Synchronisierung des Datenverkehrs durchgeführt. Der Taktgenerator wird über einen Schmitt-Trigger CD 40106 realisiert. Die Taktfrequenz liegt bei ca. 300 kHz. Aus dieser Frequenz ergibt sich auch die typische Zeit für die Wandlung des Analogwertes in ein digitales Datenformat. Die Wandelzeit beträgt 52 Taktzyclen, was einer Zeit von ca. 175 Mikrosekunden entspricht.

Bei der Datenübertragung wird ein etwas ungewöhnlicher Weg beschritten. Nicht die normalen Datenleitungen TxD und RxD werden verwendet, sondern die Handshake-Leitungen RTS, CTS und DTR. Diese Leitungen können problemlos über die Hardware-Register der seriellen Schnittstelle programmiert und abgefragt werden. Über diesen Weg kann jede serielle Schnittstelle direkt angesprochen werden.

Die Datenübertragung erfolgt in zwei aufeinanderfolgenden Durchläufen:

Steuerwort des LTC 1090

Es gilt:
MSBF = 0: LSB zuerst
MSBF = 1: MSB zuerst

Steuerwortlänge:
WL1 = 0, WL0 = 0: 8 Bit
WL1 = 0, WL0 = 1: 10 Bit
WL1 = 1, WL0 = 0: 12 Bit
WL1 = 1, WL0 = 1: 16 Bit

Kanalselektierung

Software für Linux

Eine schnelle Lösung im C++ stammt von Dominik Kuhlen. Alle Ansteuerungsroutinen sind im Headerfile ltc1090.h zusammengefaßt.

Das Hauptprogramm zeigt die Anwendung exemplarisch:

/**
 Conrad 8-Channel ADC Test Program
	(c) 2004 Dominik Kuhlen <dh0dom@amsat.org>
*/


// printf 
#include <stdio.h>
// usleep
#include <unistd.h>

#include "ltc1090.h"

int main() {
	Ltc1090 adc(5.000);	// set to correct Refernce Voltage
	int i, cnt;

	i = adc.init(0);	// open 1. Serial port
	if (i != 0) {
		fprintf(stderr, "Cannot init serial port\n");
		return 1;
	}
	// infinite loop
	for (cnt = 0; /*cnt <*/ 16 ; cnt++) {
		for (i = 0; i < 8; i++) {
			printf("%d:%.5fV%s", (i-1)&7, adc.readVol(i), i==7 ? "\n" :" ");
			usleep(10000);
		}
	}

	return 0;
}

Schaltungsbeschreibung

Als A/D-Wandler wurde der Baustein LTC1090 von Linear Technology gewählt. Dieser hat neben dem eingebauten multifunktionalen Analogmultiplexer den Vorteil, daß eine einfache serielle Schnittstelle schon eingebaut ist. Obwohl sie nicht dem RS232-Standard entspricht, läßt sie sich dennoch einfach programmieren. Sie arbeitet im Duplexbetrieb. Während das Ergebnis einer A/D-Wandlung über den Dout-Eingang des ICs ausgelesen wird, wird gleichzeitig über den Din-Eingang die Einstellung für die nächste A/D-Wandlung eingelesen. Durch diese Taktvorgabe entfallen die üblichen Schnittstellenprobleme wie Baudrate, Parity oder Overflow.

Die Schaltung besteht im wesentlichen aus drei Blöcken. Im Mittelpunkt steht der A/D-Wandler mit einem externen Taktgenerator und den Eingangsstrom- und -spannung begrenzenden Widerständen und Dioden. Der zweite Block ist der Anschluß an die RS232-Schnittstelle. Der letzte Block umfaßt die Stromversorgung und Referenzspannungserzeugung.

Zur Beschaltung des A/D-Wandlers ist nicht viel zu sagen, sie entspricht im wesentlichen der Empfehlung aus dem Datenblatt des ICs, Das Diodenarray D1 ...D7 leitet Eingangsspannungen ab, die größer als 5 Volt sind, wobei der Eingangsstrom von den Widerstanden R1 ... R8 begrenzt wird. Der Oszillator ist in klassischer Weise aufgebaut und taktet den Wandler mit einer Frequenz von 300 kHz. Da der Ausgang Dout während der Wandlung hochohmig ist, sorgt der Pull-up Widerstand R10 für einen definierten Spannungspegel. Von der RS232-Schnittstelle werden nur drei Signalleitungen gebraucht, zwei davon zur Schaltung und eine zum PC. Normalerweise ist High mit 3...12 V und Low mit -3...-12 V definiert, bei den meisten PCs reichen 5 V beziehungsweise 0 V aus, weshalb auf eine aufwendige Pegelanpassung verzichtet wurde. Der Ausgang Dout wird durch den Puffer (1/6 IC3) invertiert an die RS232-Schnittstelle weitergeleitet wdhrend die Eingönge durch die Reihenschaltung von jeweils zwei Puffern (auch IC3) nicht invertieren. R12, R13 und die Schutzdioden in den Puffern sorgen dafür, daß auch bei negativen und bei positiven Eingangsspannungen über 5 V keine Zerstörung stattfindet. Etwas trickreich wird das CS-Signal des Wandlers erzeugt. Ein Low-Pegel am DTR (SCLK) Eingang setzt CS auf jeden Fall auf Low. Soll das CS-Signal High-Pegel annehmen, muß zuerst der DTR- (SCLK)-Eingang auf High gesetzt und anschließend eine positive Flanke auf der RST-(Din)-Leitung generiert werden. Da beim Auslesen des Wandlers das CS-Signal auf Low bleiben muß, dürfen die Wechsel der Din-Zustände nur bei einem Low auf der DTR-Leitung vorgenommen werden. Eine anschließende positive Flanke auf der DTR-Leitung ändert den Zustand des CS-Eingangs nicht.

Zur ausreichenden Stromversorgung der Schaltung müssen einige Zeit vor Beginn der Wandlung die RTS und DTR-Leitungen auf High-Pegel gesetzt werden. Dieser Iädt über D8/D9 den Kondensator C3, welcher auch als Puffer während der Datenübertragung dient. Aus der am Kondensator liegenden Spannung generiert die Referenzspannungsquelle IC4 genau 5 V. Diese Spannung stellt gleichzeitig auch die Stromversorgung der übrigen Bausteine dar. R11, C4 und C5 dienen der Entkopplung von Referenzspannung und 5-V-Versorgung.

die Platine wird am besten in ein Metallgehäuse eingebaut, um Störeinstrahlungen zu vermeiden. Der Anschluß der Schaltung kann über ein dreiadriges, abgeschirmtes Kabel erfolgen, wobei die Abschirmung gleichzeitig auch die GND-Leitung darstellt. Zur Inbetriebnahme wird die Schaltung mit der RS232-Schnittstelle verbunden und die Masse der Analogeingänge (COM beziehungsweise GND) mit jener der zu messenden Schaltung und anschließend die Analogeingänge entsprechend ihrer Aufgabe verschaltet. Beachten Sie dabei, daß die Spannung an den Analogeingängen zwischen COM/GND und 5 Volt liegen und die Quelle niederohmig sein muß. Ein weiterer ganz wichtiger Hinweis: Die Schaltung ist vom PC nicht galvanisch getrennt. Der COM-Anschluß liegt auf PC-Masse und damit eventuell am 230-V-Lichtnetz. Da der Ausgangspegel von Dout nichtnormgemäß ist, kann es zu Schwierigkeiten mit einer normgerechten RS232-Schnittstelle kommen. In diesem Fall ist eine entsprechende Anpassung vorzunehmen.

Für die Programmierung ist direkt auf den Schnittstellentreiber zuzugreifen (per ioctl). Über Bit 4 (= CTS) des Modem-Status-Registers (Adresse: Basis + 6) wird der Zustand von Dout des A/D-Wandleis abgefragt. Hat das Bit 4 den Wert 1, so entspricht das einer 0 an Dout und umgekehrt. Mit anderen Worten, Bit 4 stellt die Negation von Dout dar. Die Leitungen RTS (Din) und DTR (SCLK) werden über das Modem-Control-Register (Adresse: Basis + 4) bedient. Dabei entspricht Bit 0 des Registers der DTR-Leitung und Bit 1 der RTS-Leitung. Durch die fehlende Negation auf der A/D-Wandlerkarte entspricht das Setzen von Bit 0 beziehungsweise von Bit 1 dem Setzen von Din und SCLK. Die erste Wandlung wird mit dem Schreiben des ersten Input Data Word gestartet. Alle weiteren Kommunikationsvorgänge zwischen PC und A/D-Wandler geschehen synchron duplex, das heißt, während das Input Data Word der nächsten Wandlung geschrieben wird, wird gleichzeitig das Ergebnis der letzten Wandlung ausgelesen.

Beispiel einer Datenübertragung

---------------------------------------------------------------------------------------
Step    RTS      DTR        CTS      Bemerkung
        Din      SCLK       /Dout
---------------------------------------------------------------------------------------
1       1         1                  Kondensator C4 laden, 
2                                    10 ms warten
3       1         0                  CS auf LOW, H-L Flanke von SCLK, AD-Wandler stellt 
                                     B9 bereit, mindestens 30 Mikrosekunden warten.
4       M3        0                  M3 anlegen.
5                           /B9      Erstes Datenbit vom AD-Wandler lesen.
6       M3        1                  L-H Flanke von SCLK. AD-Wandler übernimmt M3.
7       M3        0                  H-L Flanke von SCLK, AD-Wandler stellt B8 bereit.
8       M2        0                  M2 anlegen.
9                           /B8      Zweites Datenbit mm AD-Wandler lesen.
10      M2        1                  L-H Flanke von SCLK. AD-Wandier übernimmt M2.
11      M2        0                  H-L Flanke von SCLK, AD-Wandler stellt B7 bereit.
12      M1        0                  Ml anlegen.
13                          /B7      Drittes Datenbit vom AD-Wandler lesen.
14      M1        1                  L-H Flanke von SCLK. AD-Wandler ümimmt M1.
15      M1        0                  H-L Flanke von SCLK, AD-Wandier stellt B6 bereit.
16      M0        0                  M0 anlegen.
17                          /B6      viertes Datenblt vom AD-Wandler lesen.
18      M0        1                  L-H Flanke von SCLK. AD-Wandler übernimmt MO.
19      M0        0                  H-L Flanke von SCLK, AD-Wandler stellt B5 bereit.
20      UNI       0                  UNI anlegen, hier UNI = 1!
21                          /B5      fünftes Datenbit vom AD-Wandler lesen.
22      UNI       1                  L-H Flanke von SCLK. AD-Wandler übernimmt UNI.
23      UNI1      0                  H-L Flanke von SCLK, AD-Wandler stellt B4 bereit.
24      MSBF      0                  MSBF anlegen.
25                          /B4      viertes Datenbit vom AD-Wandler lesen.
26      MSBF      1                  L-H Flanke von SCLK. AD-Wandler übernimmt MSBF.
27      MSBF      0                  H-L Flanke von SCLK, AD-Wandler stellt B3 bereit.
28      WLI       0                  WLI anlegen, für 10 Bit Datentransfer WLI = 0.
29                          /B3      siebtes Datenbit vom AD-Wandler lesen.
30      WLI       1                  L-H Flanke von SCLK, AD-Wandler übernimmt WLI.
31      WL1       0                  H-L Flanke von SCLK, AD-Wandler stellt B2 bereit.
32      WL0       0                  WLO anlegen, für 10 Bit Dauentransler WLO = 1.
33                          /B2      achtes Datenbit vom AD-Wandler lesen.
34      WL0       1                  L-H Flanke von SCLK, AD-Wandler überninimt WL0.
35      0         0                  H-L Flanke von SCLK. AD-Wandler stellt B1 bereit.
36                          /B1      neuntes Datenbit vom AD-Wandler lesen.
37      0         1                  L-H Flanke von SCLK.
38      0         0                  H-L Flanke von SCLK, AD-Wandler stellt B0 bereit.
39                          /B0      zehnten Datenbit vom AD-Wandler lesen.
40      0         1                  SCLK auf High legen.
41      1         1                  CS auf High, Wandlung starten, Dauer ca. 44 ACLK-Zyklen.
---------------------------------------------------------------------------------------
Ist ein Feld in der Tabelle leer, so findet auf diesem Bit kein Lese- oder Schreibvorgang statt. RTS und DTR müssen pro Step gleichzeitig geschrieben werden. Alle anderen Bits des Registers können auf Null gesetzt werden. Die Datenbits B9 bis BO werden invertiert übertragen

Grafische Oberfläche für den LTC 1090
von Lars Herzfeld

Mit den vier Dateien in LTC1090_QT.tar befindlichen Dateien bekommt man eine grafische Oberfläche fü die Ansteuerung des Moduls. Wichtig ist, dass die Bibliotheken von Qt4 installiert sind und das für das Kompilieren der Programme der Befehl qmake(-qt4) verwendet wird. Folgende Vorgehensweise empfiehlt sich:

  1. Die vier Dateien in einem eigenen Ordner abspeichern
  2. In der Konsole in diesen Ordner wechseln
  3. qmake(-qt4) -project ausführen [*.pro file wird erstellt]
  4. qmake ausführen [Makefile wird erstellt]
  5. make ausführen [ausführbares Programm wird erstellt]
Nach diesen Schritten sollte in dem Ordner das Programm aufgerufen werden können und das oben gezeigte Fenster erscheinen.

Vielleicht macht sich ja auch mal jemand die Mühe, alles so zu linken, dass die Qt4-Bibliotheken nicht extra installiert werden müssen.

Weiterführende Informationen


Copyright © FH München, FB 04, Prof. Jürgen Plate
Letzte Aktualisierung: 18. Dec 2007