Der 12-Bit-DA-Wandler MCP4725
Einen
DA-Wandler mit hoher Auflösung kann man immer gebrauchen. Und zum
Geburtstag bekam ich von meinem Freund Rainer eine kleine Platine mit
dem MCP4725 vom Microchip geschenkt. Das besondere an diesem Chip
ist, dass man die Ausgangsspannung jederzeit per I2C-Bus einstellen
kann. Zusätzlich gibt es ein EEPROM, in dem ein Startwert
festgehalten wird. Man könnte also z.B. eine ganz bestimmte
Spannung einstellen, die dann beim nächsten Einschalten ganz ohne
Zutun eines Mikrocontrollers sofort erscheint.
Der
DA-Wandler hat ein winzigkleines SOT-23-6-Gehäuse. Da ist es eine
große Hilfe, dass alles bereits auf einer kleine Platine von
Adafruit montiert ist.
Die
kleine Platine passt prima zum Lernpaket Mikrocontroller mit seinem
ATtiny13. Es werden nur vier Verbindungsleitungen verwendet: Vcc, GND,
SCL an PB4 und SDA an PB3. Der Adresseingang A0 wird zusätzlich an
GND gelegt. Die Schreibadresse ist dann 11000100.
Um
einen Spannungswert zwischen Null und 4095 auszugeben sind nur drei
Bytes erforderlich: I2C-Adresse, Highbyyte (0...15) und Lowbyte
(0...255). Also los, der erste Test mit Bascom ist ganz einfach:
'MCP4725
$regfile = "attiny13.dat"
$crystal = 1200000
Waitms 500
Config Scl = Portb.4
Config Sda = Portb.3
I2cinit
Do
I2cstart
I2cwbyte &HC4 'Adresse 11000100
I2cwbyte &H02
I2cwbyte &H00 '512/4096, 1/8*5V
I2cstop
Waitms 500
Loop
Mit
dem Oszilloskop am Ausgang Vout sieht man was passiert. Das interne
EEPROM ist offensichtlich werksseitig auf halbe Spannung eingestellt.
Also erscheint erstmal 2,5 V. eine halbe Sekunde später schickt
das Programm dann seine eigenen Daten. Die Spannung wird in einem
Sprung kleiner und landet bei ca. 0,6 V.
Und hier noch ein Rampengenerator mit langsamen Anstieg von 0 V auf 5 V in ca. 4 s:
'MCP4725 Rampe
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 16
$framesize = 16
Dim D As Word
Dim Hi As Byte
Dim Lo As Byte
Waitms 500
Config Scl = Portb.4
Config Sda = Portb.3
I2cinit
Do
For D = 0 To 4095
I2cstart
I2cwbyte &HC4 'Adresse 11000100
Hi = High(d)
Lo = Low(d)
I2cwbyte Hi
I2cwbyte Lo
I2cstop
Waitms 1
Next D
Waitms 500
Loop
Und
zum guten Schluss muss auch noch das EEPROM ausprobiert werden. Der
DA-Wandler soll nach jedem Neustart 3,14 V ausgeben. Wenn man dann mal
vergessen hat, wie groß Pi ist, kann man es mit dem DVM
nachmessen. Es gibt aber auch andere Anwendungen, wie z.B. das
Speichern einer Abstimmspannung eines Empfängers oder eines
Sollwerts für einen Temperaturregler. Für diese Aktion sind
vier Bytes nötig: I2C-Adresse, das Steuerbyte &H60 und
Highbyte und Lowbyte des Messwerts, diesmal aber um vier Bit nach links
geschoben (mal 16). Gleichzeitig mit dem Schreiben ins EEPROM wird der
aktuelle ausgabewert erneuert.
'MCP4725 EEPROM + DAC
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 16
$framesize = 16
Dim D As Word
Dim Hi As Byte
Dim Lo As Byte
Waitms 500
Config Scl = Portb.4
Config Sda = Portb.3
I2cinit
D = 2573 '3,14 V (Pi V)
D = D * 16
Hi = High(d)
Lo = Low(d)
I2cstart
I2cwbyte &HC4 'Adresse 11000100
I2cwbyte &H60 'EEPROM und DAC
I2cwbyte Hi
I2cwbyte Lo
I2cstop
Do
Loop
End
Simmt genau!
Elektronik-Labor Projekte AVR