Nachdem der erste Schritt mit einem 8-Bit AD-Wandler (incl. einem DA-Ausgang) gemacht ist, gilt es nun, die Genauigkeit zu steigern. AD-Pins mit 8-10Bit Auflösung bringt schließlich bereits der kleinste ATMega mit.
Als Baustein wurde ein MCP3202 von Microchip gewählt. Dieser bringt zwei Eingänge mit, welche mit 12Bit aufgelöst werden können. Die Kommunikation läuft über das SPI. Wird die Wandlung bei 5V initiiert sind bis zu 100.000 Wandlungen je Sekunde möglich, bei 2,7V sind nur noch halb so viele möglich. Die maximale Busfrequenz beträgt bei der 5V-Variante 1,8MHz, dies gilt es bei der Wahl der Busfrequenz zu beachten.
Nun zur Pinbelegung. CH0:1 repräsentieren die
beiden Eingänge des AD-Wandler. /CS, DIN, DOUT und CLK
sind die Kommunikationsschnittstelle mit dem MC. VDD und VSS
stellen die Spannungsversorgung und gleichzeitig die Referenz dar, sie sollten
also bestmöglich entstört sein.
Genauer:
Pin 1 muss, soll der Baustein angesprochen werden, auf L-Pegel gelegt werden.
Nach Beendigung der Kommunikation muss der Pin wieder auf H-Pegel gelegt werden.
Auch zwischen Konvertierungen muss dieser Pin auf H-Pegel sein.
Die Pins 2 und 3 können entweder als getrennte AD-Kanäle arbeiten oder
alternativ als ein differentieller Eingang.
Worauf es zu achten gilt ist, dass bei Auflösungen größer/gleich 12V ein großes Augenmerk auf die Signalzuführung zu legen ist. Abhängig von den Anforderungen des Nutzers empfiehlt sich bereits hier ein OPV, welcher als Spannungsfolger geschalten ist, für die Signalzuführung.
Der Zusammenhang zwischen dem ausgegebenen Wert und der anliegenden Spannung (CH0:1) ist der folgende:
Datenwort = 4096 * Vx / VDD
Schade ist, dass die Entwickler von Microchip bei diesem Baustein darauf verzichtet haben, ihn komplett kompatibel mit dem Hardware-SPI eines MC zu machen. Dieses arbeitet byte-orientiert, wohingegen die Kommunikation mit dem Wandler eher bitorientiert ausgelegt ist. Was ich damit meine, wird im folgenden klar werden. Zum Glück gibt das Datenblatt eine gute Hilfestellung.
Ein Sende-/Empfangsvorgang hat die folgende Form:
Senderegister:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
SGL/DIFF | ODD/SIGN | MSBF | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Empfangsregister:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | B11 | B10 | B9 | B8 |
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
Nun der Reihe nach:
Das erste gesendete Byte beinhaltet lediglich ein Startbit (die Daten werden mit
dem MSB beginnend übertragen). Das folgende Byte konfiguriert den AD-Wandler für
die nächste Wandlung. Das 7. Bit legt fest, um im normalen AD-Modus oder im
differentiellen Modus gearbeitet wird. Das 6. Bit legt fest, welcher Kanal im
normalen Modus gewählt werden soll bzw. welcher Kanal welches Vorzeichen im
differentiellen Modus trägt. Ist MSBF=0, so wird der gewandelte Wert mit dem MSB
voran ausgegeben. Ist MSBF=1, so kann nach der normalen Ausgabe noch eine
Ausgabe mit dem LSB (least significant bit) voran erfolgen. Dazu muss der
Anwender lediglich zusätzliche Lesezyklen erzeugen. Hält man die Kommunikation
nach der Übermittlung des Wertes /der Werte weiterhin aufrecht, so werden nur
noch Nullen empfangen.
Die Interpretation des Empfangsregisters sollte kein Problem darstellen, sie ist
selbsterklärend.
Wie man sieht, war auch hier die Kommunikation im Endeffekt nicht die Riesenhürde. Ein Codebeispiel ist natürlich auch hier oder unter Programme verfügbar (nur der single channel mode ist implementiert).