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 deniert 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
C
C OLED 64x48
SCL
SDA
SCL
SDA
+9V
Adr:8x,Xx
+9V
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
#dene 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
}
#dene 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.