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).