User manual

101 102
12. Anwendungen
12.1 Entladekurve messen - Anzeige auf OLED
Der Kondensator wird alle 3 Sekunden im Wechsel geladen und dann wieder entladen. Auf dem Mini-Oszil-
loskop Display sieht man die Lade- und Entladekurve dargestellt. Zur Zeitnahme wird diesmal der eingebaute
Timer millis() verwendet, der die abgelaufene Zeit seit dem Start des Programms in ms enthält (alle 54 Tage hat
der Timer einen Überlauf auf 0). Die Messwerte werden wie früher beim Mini-Oszilloskop aufgezeichnet und
ausgegeben. Will man das ganze beschleunigen, müssen Aufzeichnung und Wiedergabe von einander getrennt
werden. In unserem Beispiel reicht die zeitliche Auösung aber aus. Man erhält je nach CPU Version ca. 1-2 Ent-
lade- und Ladekurven gleichzeitig auf dem OLED. Der D/A-Umsetzer ist für den Bereich 0-5V eingestellt, damit
stimmt er auch mit dem Messbereich des A/D-Umsetzers von 0-5V überein.
Die Zeitkonstante kann man auch ausrechnen: t=R*C, bei uns 100000.0 Ohm * 10E-6 F = 1 sec. Dies kennzeich-
net den Zeitpunkt, bei der der Kondensator 63% aufge- oder entladen wurde.
+
-
9V
1A
10µF 25V
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
P3
0-5V
0-10V
+-10V
P1
+-5V
P2
0-20V
01
10
11
Adr.
Vout
JP1
// DE 37 Anwendungen - Entladekurve
.....
int milisec=0; // merker fuer ms
void setup() {
Wire.begin(); // I2C Initialisierung
i2c_oled_initall(i2coledssd); // OLED Initialsierung
for (int i=0; i<64; i++) advalbuf[i]=47; // Default fuer Buffer
}
void loop() { // Schleife
// 64x48 Pixel OLED
static int cxx = 0; // Cyklischer Zaehler
static int state = 0; // State system verwenden fuer DA
int ms = 0; // Messzeit ms
static int daval = 0; // Ausgabewert
int ana0 = analogRead(A0); // Einlesen A/D-Umsetzer
char buffer[40]; // ASCII Buffer fuer V Anzeige
disp_buffer_clear(COLOR_BLACK); // BIldschirm loeschen
double p1 = (ana0*5000.0)/1023.0; // in mV
int y1 =0; // Position y
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
if (cxx >63) cxx =0; // Zyklischer Zaehler
disp_print_xy_lcd(2, 0, (unsigned char *)buffer, COLOR_WHITE, 0);
int i=0; // Fuer Spalten
int yold = advalbuf[(cxx+1)%64]; // Aktueller AD Wert
for (i=0; i<63; i++) { // Fuer alle Spalten durchlaufen
y1 =advalbuf[(cxx+1+i)%64]; // Aus dem Ringbuffer holen
disp_line_lcd (i, yold, i, y1, COLOR_WHITE);
yold = y1; // Neues old
}
disp_lcd_frombuffer(); // Auf den Bildscirm
// Kondensator auaden und entladen
// Dazu Sprungfunktion verwenden
// Im festen Intervall messen
//
ms=millis(); // aktuelle Zeit
if (ms > (milisec+3000)) { // 3sec warten
switch(state) { // State abhaengeig
case 0:
daval = 0xfff; // Auaden
state = 1; // danach in State 1 nach 3sec
break;
case 1: // Dann wieder entlanden
daval = 0; // nach 3 sec
state = 0; // UNd state wieder auf 0
break;
default: // Im Falle eines Falles
state = 0; // 0 immer sicher
}
milisec = ms; // Neue Zeit
}
// DA Umsetzer
i2c_da_write_command(i2cdasel1,daval);
i2c_da_write_command(i2cdasel2,daval);
i2c_da_write_command(i2cdasel3,daval);
}
Was passiert? Auf der OLED sollten Entlade- und Ladekurve dargestellt
werden. Die Darstellung auf der OLED scrollt auch automatisch durch.