Wir verwenden den Comparator A nun für ein Millivolt-Meter. Dazu muss der Mikrocontroller zunächst nach Bild 6.5 beschaltet werden. Die Funktionsweise eines Single-Slope-A/D-Wandlers haben wir ja in Kapitel 5.2.3 kennengelernt.
Für die A/D-Wandlung wird der Kondensator über den Widerstand durch Setzen des Pins P1.0 auf HIGH geladen. Damit steigt die Spannung über dem Kondensator, die über den Pin P2.3 am positiven Eingang des Comparator-A-Moduls ausgewertet werden kann. An den negativen Eingang (Pin P2.4) wird das analoge Eingangssignal angeschlossen. So lange der Ausgang des Komparators (das Bit CAOUT) 0 ist, ist die Spannung über der Kapazität kleiner als das analoge Eingangssignal. Währenddessen wird mit dem Timer A die Zeit zum Aufladen des Kondensators gemessen. Wenn CAOUT den Zustand auf 1 wechselt, ist die Spannung über dem Kondensator gerade etwas größer als die analoge Eingangsspannung, und der Timer A wird gestoppt. Mit dem Ergebnis aus dem Zählregister des Timers A kann nun der A/D-Wert und damit die Eingangsspannung bestimmt werden.
Während der A/D-Wandlung muss sichergestellt sein, dass sich das analoge Eingangssignal nicht ändert. Dies ist notwendig, da wir keine Sample-and-Hold-Schaltung vorgesehen haben. Als einfachste Maßnahme sollte zumindest ein Tiefpassfilter am analogen Eingang vorgesehen werden, dessen Grenzfrequenz deutlich unterhalb der längsten Wandlungszeit (fg ≪ 1∕2πTmax ≈ 13Hz) liegt.
Für eine genaue Berechnung des Spannungswertes müssen wir berücksichtigen, dass die Spannung über dem Kondensator und die Zeit in einem nichtlinearen Zusammenhang stehen (Bild 6.6):
Eine Möglichkeit wäre, die Exponentialfunktion mit einer Reihenentwicklung über i zu approximieren und auf dem MSP in C zu implementieren:
Wir werden nun einen A/D-Wandler mit einer Auflösung von 8 Bit entwickeln. Die kleinste messbare Spannung beträgt dann bei einer maximalen Amplitude von 3.3V etwa 13mV. Wir stellen nun Gleichung 6.1 nach t um und berechnen die Zeiten für die 256 Spannungsschritte:
Diese Tabelle werden wir in unserem Code als Look-Up-Tabelle verwenden. Zudem müssen wir noch die Zeiten in die Zählerstände des Timers A mit Bezug zur realen Zählerfrequenz umrechnen. In unserem Beispiel soll diese Frequenz 1MHz betragen.
Im Listing 6.1 ist die Look-Up-Tabelle für die Auswertung des Comparator-A-Eingangs implementiert.