• Keine Ergebnisse gefunden

A/D- und D/A-Wandler

Inter-IC-Bus-Komponenten

CONFIGURATION REGISTER

9.5 A/D- und D/A-Wandler

9.5.1 Philips PCF8591

Beim Philips PCF8591 handelt es sich um einen Wandlerbaustein mit vier analogen Eing¨angen, einem analogen Ausgang und einer Aufl¨osung von jeweils 8 bit. Die Eing¨ange k¨onnen wahlweise als einfache Eing¨ange mit Massebezug, als differentielle Eing¨ange mit gemeinsamer externer oder eigener Referenz oder im Mischbetrieb verwendet werden. F¨ur den Analogteil ist eine stabile Versorgungsspannung an Vref undAGND zu legen. Werden die Eing¨ange im differentiellen Modus betrieben, dann sind nur drei (bei gemeinsamer Referenz) bzw. zwei (bei eigener Referenz) Eing¨ange verf¨ugbar. Die Konfiguration wird

180 9 Inter-IC-Bus-Komponenten

zusammen mit Angaben ¨uber die A/D-Kanalnummer, dem Autoincrement-Modus und einem Aktivit¨atsbit f¨ur den Ausgang in einem Kontroll-Byte

¨ubertragen.

Im Autoincrement-Modus wird nach jedem gesendeten Daten-Byte automa-tisch der A/D-Kanal erh¨oht. Wird der A/D-Ausgang nicht ben¨otigt, kann dieser ¨uber das entsprechende Bit abgeschaltet werden. Dies bewirkt eine Ab-senkung des Stromverbrauchs auf unter 1 mA. Abbildung 9.7 zeigt die Basis-adresse des PCF8591 mit drei konfigurierbaren Bits.

!

1

Adresse

0 0 1 A2 A1 A0 R/W

Abb. 9.7.Adressregister des PCF8591.

Die A/D-Wandlung wird automatisch nach der ¨Ubertragung einer g¨ultigen Leseanforderung gestartet. W¨ahrend des Sendens des zuletzt konvertierten Daten-Bytes wird das nachfolgende Byte gewandelt. Dieser Umstand des ”ver-alteten“ ersten Daten-Bytes sollte bei zeitkritischen Messungen beachtet wer-den.

9.5.2 Die Klasse IICADConverter

Die Klasse IICADConverter repr¨asentiert I2C-Bausteine vom Typ PCF8591 und stellt entsprechende Erweiterungen der Basisklasse zur Verf¨ugung. In der Klassenbeschreibung ADConverter.hwerden die Modi der analogen Betriebs-arten ¨uber einen Aufz¨ahlungstyp definiert:

e n u m e A D C o n v e r t e r M o d e {

S I N G L E _ E N D E D _ I N P U T , // f o u r s i n g l e e n d e d i n p u t s T H R E E _ D I F F _ I N P U T S , // t h r e e d i f f e r e n t i a l i n p u t s

S I N G L E _ D I F F _ M I X E D , // s i n g l e e n d e d a n d d i f f e r e n t i a l m i x e d T W O _ D I F F _ I N P U T S // t w o d i f f e r e n t i a l i n p u t s

};

In den folgenden Membervariablen werden das Kontrollregister, der aktu-ell ausgew¨ahlte A/D-Kanal, der verwendete Modus und die Autoincrement-Option abgelegt:

c h a r m _ c o n t r o l _ b y t e ; // c o n t r o l b y t e

int m _ c h a n n e l ; // c u r r e n t AD - c h a n n e l

int m _ m o d e ; // AD i n p u t m o d e

b o o l m _ a u t o i n c ; // a u t o i n c r e m e n t f l a g

map < int , int > s c o r e T a b l e [ M A X C H ]; // s c o r e t a b l e f o r s e n s o r c h a r a c t .

Weiterhin sind mehrere Wertetabellen vom Typmap<int,int> definiert, wel-che der Hinterlegung von Kennlinien f¨ur A/D-Kan¨ale bzw. dort angeschlos-sene Sensoren dienen. Die Tabellen m¨ussen zu Beginn der Anwendung ¨uber setScoreTable() mit Wertepaaren gef¨ullt werden. Eine Abfrage ist mittels getScoreTable() m¨oglich. Zwischen zwei hinterlegten Messpunkten erfolgt eine lineare Interpolation.

Um Berechnungen m¨oglichst effizient zu gestalten, werden inscoreTablenur Ganzzahlen abgelegt. Bei der Repr¨asentation physikalischer Gr¨oßen m¨ussen die Einheiten entsprechend skaliert werden. F¨ur den Anwender stellt die Klasse IICADConvertereine API mit folgenden Methoden zur Verf¨ugung:

IICADConverter(IICBus& bus, int addr, string name, eADConverterMode mode);

Neben der ¨ublichen Angabe des Bus-Objekts, einer I2C-Adresse und der Bezeichnung muss in mode der Modus f¨ur die A/D-Wandlung fest-gelegt werden. Das Autoincrement-Flag ist zu Beginn standardm¨aßig abgeschaltet.

int setAutoInc(bool autoinc);

Setzt das Autoincrement-Flag und ¨ubertr¨agt anschließend das Kontroll-Byte. Ein R¨uckgabewert von−1 signalisiert ein Lese- oder Schreibproblem.

int readChannel(int channel, bool read immediate, int table num);

Gibt im manuellen Kanalmodus den letzten konvertierten Wert (0−255) f¨ur Kanal channel zur¨uck. Um einen aktuellen Wert zu erhalten, ist read immediate auf true zu setzen. Hiermit werden zwei Bytes gelesen und der neuere Wert zur¨uckgeliefert. Im Autoincrement-Modus ist die Angabe von channel prinzipiell unbedeutend. Sinnvoll ist aber eine

¨Ubergabe von −1, um beim sp¨ateren Umschalten in den manuellen Mo-dus einen Kanalwechsel zu erzwingen. ¨Uber table num kann angegeben werden, ob der Registerwert (−1) oder ein mittels getScoreTable() umgerechneter Wert (>0) zur¨uckgegeben wird. Schl¨agt der Vorgang fehl, so wird −1 zur¨uckgeliefert.

int setChannel(int channel);

Setzt den aktiven A/D-Kanel auf channel, falls dieser nicht bereits aus-gew¨ahlt ist. Werte ausserhalb des verf¨ugbaren Bereiches (man beachte die unterschiedlichen A/D-Modi) werden durch den R¨uckgabewert −1 quit-tiert. Im Erfolgsfall wird die neue Kanalnummer zur¨uckgegeben.

int setOutput(int value);

Setzt den A/D-Ausgang auf den Registerwertvalue. Ist der Ausgang ab-geschaltet, wird dieser automatisch aktiviert. Bei einem ¨Ubergabewert−1 wird der Ausgang deaktiviert. Ein R¨uckgabewert−1 signalisiert ein Lese-oder Schreibproblem. Im Erfolgsfall wird die Anzahl ¨ubertragener I2 C-Bytes zur¨uckgeliefert.

182 9 Inter-IC-Bus-Komponenten

void setScoreTable(int v1, int v2, int channel);

F¨ugt der TabellescoreTable[channel]ein Wertepaar v1,v2hinzu. Bei v1 handelt es sich um den Registerwert eines A/D-Kanals, bei v2 um den Funktionswert an dieser Stelle. Das F¨ullen der Wertetabellen sollte zu Beginn einer Anwendung im zeitlich unkritischen Teil erfolgen.

int getScoreTable(int value, int channel);

Liefert zu einem Messwert value f¨ur einen bestimmten Kanal channel den hinterlegten Wert aus Tabelle scoreTable[channel] zur¨uck. Zwi-schen zwei Tabelleneintr¨agen wird linear interpoliert. Sollte der Messwert außerhalb des Bereichs liegen, wird dieser auf die Grenzen abgebildet. Die-se Funktion wird von readChannel() verwendet und muss entsprechend bei regul¨arer Anwendung nicht aufgerufen werden. Durch die Integration in die API ist jedoch auch eine Verwendung der Umrechnungstabellen f¨ur andere Zwecke m¨oglich.

Abb. 9.8. PCF-AD4-HS von CC-Tools mit Sharp-Distanzsensor GP2Y0A02 [CC-Tools 07].

Im Beispiel distance measuring wird ein I2C-Baustein PCF8591 verwen-det, um die Distanzinformation einer Infrarotlichtschranke vom Typ Sharp GP2Y0A02 auszulesen. Abbildung 9.8 zeigt die PCF-AD4-HS-Platine von CC-Tools mit angeschlossener Lichtschranke (vgl. auch die Tabellen E.1 und E.2 im Anhang).

Der Sensor wird mit 5 V versorgt und liefert eine Ausgangsspannung zwischen 0 und 2,8 V bei einem Messbereich von 20–150 cm. Abbildung 9.9 zeigt den Zusammenhang zwischen Ausgangsspannung und Distanz des Sensors. Die

zu-geh¨orige Kennlinie wird in Form einer Wertetabelle hinterlegt. In dieser Ta-belle werden zu Beginn Punktepaare als Eintr¨age in folgender Form f¨ur Kanal 0 hinzugef¨ugt:

c o n v e r t e r . s e t S c o r e T a b l e ( < m e s s w e r t > , < a u s g a b e w e r t > , 0) ; ...

Als<messwert>dient der Registerwert. Die Spannungswerte in Abbildung 9.9 werden deshalb zu <messwert>= VVoutref ·255 berechnet. Da die Ausgabe in der Einheit Zentimeter erfolgen soll, kann<ausgabewert>direkt auf den zu-geh¨origen Abstand gesetzt werden.

Analog output voltage (V)

0 1 2

0.5 1.5 3 2.5

0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 Distance to reflective object L (cm)

White Reflectivity:90%

Gray Reflectivity:18%

Abb. 9.9. Zusammenhang zwischen Ausgangsspannung und gemessener Distanz f¨ur den Infrarot-Abstandssensor Sharp GP2Y0A02. Quelle: Sharp, Datenblatt GP2Y0A02.

Aufgrund der Doppeldeutigkeit am Anfang der Kennlinie wird nur der Mess-bereich oberhalb 20 cm in der Wertetabelle hinterlegt (vgl. Abbildung 9.9). Im Beispiel l¨asst sich mit einer Abtastung von 1 Hz die Latenz einer Abfrage mit readChannel(x,0,x)undreadChannel(x,1,x)sehr gut nachvollziehen.

184 9 Inter-IC-Bus-Komponenten