User manual
97 98
11.5 OLED und DA Umsetzer am AD Umsetzer
Wenn man den D/A-Umsetzer mit dem eingebauten A/D-Umsetzer und einer OLED kombiniert, kann man ganz
interessante Experimente durchführen. Hier ist das Mini-Oszilloskope-Beispiel zur Darstellung eingesetzt. Der
D/A-Umsetzer wird mit einer Rampe angesteuert, das heißt die Spannung steigt von 0V auf 5V an. Der Wert
wird mit dem A/D-Umsetzer gemessen und als Text ausgegeben oder grasch dargestellt. Die Auösung des
A/D-Umsetzers ist hier nicht so hoch, wie bei dem D/A-Umsetzer. Daher werden ein paar Werte identisch ausge-
geben, obwohl der D/A-Umsetzer einen steigenden Wert ausgibt.
Das Beispiel kann auch leicht abgeändert werden, indem statt daval++ eine Formel eingesetzt wird und damit
eine andere Wertesequenz ausgegeben wird. Der Phantasie sind hier keine Grenzen gesetzt.
Wichtig: Kontrolle der Jumperstellung! Der Ausgang des DA-Umsetzers ist hier ohne SCHUTZSCHALTUNG! an
den AD Umsetzer geschaltet.
Die Jumperstellung muss unbedingt stimmen, da der Brick sonst Schaden nehmen kann. Nur 0 bis 5V sind als
Eingangs-Bereich erlaubt, der DA-Umsetzer hat aber bei anderer Jumperstellung auch andere Ausgangsberei-
che die für den DA-Umsetzer eine Gefahr darstellen können,
Man kann mit der Schaltung elegant die Schwellwerte von LEDs messen, Dazu testweise einmal die Dual-LED-
Bricks am T-Stück links anschalten.
+
-
9V
1A
SCLS DA
+9V
A0
A1
Tx
Rx
PD2
SCLKMOSI
PD3
PD 6
PD 4
PD 5
PD 7
A7
A3
A2
A6
NANO
to
Br ick`R`
3,3V 5V
USB
B0
SS
MISC
B1
I²C
I²C OLED 64x48
SCL
SDA
SCL
SDA
+9V
Adr:8x,Xx
+9V
I²C 12BIT DAC
SCL
SDA
SCL
SDA
+9V
Adr:18-1F
P1
123
P2
P3
Vout
ab
Imax 20mA
// DE_35 OLED Beispiele - DA Umsetzer am AD
Umsetzer
#include <Wire.h>
#include <avr/pgmspace.h>
// Hier ggf Adresse anpassen 78 oder 7A je
nach Schalter
#dene i2coledssd (0x7A>>1) // default ist
7A
// -------------------------OLED ------------
----------------------------------
...
// -------------------------END OLED --------
--------------------------------------
// 1E=GND,1c=Open,1a=VCC AD5622 JUmper offen
dann 1Ch
// 0001 1aa0
// aber nur aa=01 10 11 sind moegliche Ad-
ressen
#dene i2cdasel1 (0x1a>>1) // ADRESSE Ein-
stellen 1a,1c,1e
#dene i2cdasel2 (0x1c>>1) // ADRESSE Ein-
stellen 1a,1c,1e
#dene i2cdasel3 (0x1e>>1) // ADRESSE Ein-
stellen 1a,1c,1e
void i2c_da_write_command(unsigned char i2c-
baseadr, unsigned short cmdvalue)
{
// BIt15,14=0 13,12=pd (std=0) dann 11..0 =
DA Value
cmdvalue = cmdvalue & 0xFFF; // 12 Bits va-
lide // 0..4095 Wertebereich
Wire.beginTransmission(i2cbaseadr); // I2C
Start senden
Wire.write((cmdvalue>>8)&0xff); // dann
MSB zuerst
Wire.write(cmdvalue&0xff); // danach das
LSB
Wire.endTransmission(); // I2C beenden
}
char advalbuf[64]; // loop buffer zyklisch
void setup() {
Wire.begin(); // I2C Initialisieren
i2c_oled_initall(i2coledssd); // OLED ini-
talisieren
for (int i=0; i<64; i++) advalbuf[i]=47; //
Zykl. Buffer
}
void loop() {
// 64x48 Pixel OLED
static int cxx = 0; // zyklischer
Counter
static int daval=0; // DA Wert fuer
Ausgabe
int poti11 = analogRead(A0); // Einle-
sen A/D-Umsetzer
char buffer[40]; // Textbuffer zusa-
etzlich
disp_buffer_clear(COLOR_BLACK); //
Loeschen des Buffers
double p1 = (poti11*5000.0)/1023.0;
// Umrechnen in mV
int y1 =0; // Ausgabeposition
sprintf(buffer, „A0=%d.%03dV“,(int)
p1/1000,(int)p1%1000);
y1 = 47 - (p1 * 30.0)/5000.0; // 5V
Max -> 30 pixel
advalbuf[cxx++] = y1; // merken 0..4xx
V +-128
disp_print_xy_lcd(2, 0, (unsigned char
*)buffer, COLOR_WHITE, 0);
int i=0; // Counter fuer Spalten
int yold = advalbuf[(cxx+1)%64]; //
Letzer Wert
for (i=0; i<63; i++) { // Dann alle
Spalten ausgeben
y1 =advalbuf[(cxx+1+i)%64]; // aus
zyk. Buffer
disp_line_lcd (i, yold, i, y1, CO-
LOR_WHITE);
yold = y1; // und wieder nach old
}
if (cxx >63) cxx =0; // 0..63 Ringbuf-
fer
disp_lcd_frombuffer(); // Bildschirm
ausgeben
// DA Umsetzer alle Werte an DA Umset-
zer
i2c_da_write_command(i2cdasel1,daval);
i2c_da_write_command(i2cdasel2,daval);
i2c_da_write_command(i2cdasel3,daval);
daval++; // Ergibt Saegezahn
if (daval>4095) daval = 0;
}
ACHTUNG:
0-5V einstellen
!
P3
0-5V
0-10V
+-10V
P1
+-5V
P2
0-20V
01
10
11
Adr.
Vout
JP1
Was passiert? Auf der OLED sollte
eine Rampe dargestellt werden, die
dann langsam durchscrollt.










