User manual
99 100
11.6 OLED und DA Umsetzer am AD Umsetzer Sinus
Hier ein Beispiel für die Ausgabe eines Sinus-Signals über den D/A-Umsetzer. Die Anzahl der Punkte und damit
auch die Frequenz deniert man über SINAUFLOES. Die Frequenz ist auch durch die Periodendauer der Schleife
bestimmt, hier begrenzt die Ausgabe der OLED die maximale Frequenz, die im Hz Bereich liegt.
+
-
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_36 OLED Beispiele - DA Umsetzer am AD Umsetzer mit Sinus
#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 -----------------------------------------
char advalbuf[64]; // loop buffer zyklisch
void setup() {
Wire.begin(); // I2C Initialisieren
i2c_oled_initall(i2coledssd); // OLED initalisieren
for (int i=0; i<64; i++) advalbuf[i]=47; // Zykl. Buffer
}
#dene SINAUFLOES 10 // n Punkte
void loop() {
// 64x48 Pixel OLED
static int cxx = 0; // zyklischer Zaehler
static int phi=0; // Phase fuer Sinus
int daval = 0; // Zwischenspeicher
int poti11 = analogRead(A0); // Einlesen A/D-Umsetzer
char buffer[40]; // Textbuffer fuer Ausgabe
disp_buffer_clear(COLOR_BLACK); //
double p1 = (poti11*5000.0)/1023.0; // mV umrechnen
int y1 =0; // Y-Position
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]; // Aeltester Wert
for (i=0; i<63; i++) { // Alle Spalten ausgeben
y1 =advalbuf[(cxx+1+i)%64]; // Zyklische Buffer
disp_line_lcd (i, yold, i, y1, COLOR_WHITE);
yold = y1; // ist neues old
}
if (cxx >63) cxx =0; // 0..63
disp_lcd_frombuffer(); // Ausgeben auf OLED
// DA Umsetzer Sinus ausgeben und berechnen
daval = (int)(2048 + 2047*sin((double)phi*3.141592*2.0/(double)SINAUFLOES)); //
i2c_da_write_command(i2cdasel1,daval);
i2c_da_write_command(i2cdasel2,daval);
i2c_da_write_command(i2cdasel3,daval);
phi++; // Phase neu
if (phi>SINAUFLOES) phi = 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 Sinus-
kurve dargestellt werden, die dann langsam
durchscrollt.










