Hallo!
Ich möchte eine Thermosäule zur Messung der Strahlungsintensität
basteln. Für ein Laserleistungsmessgerät habe ich dies mit einem
Peltierelement bereits umgesetzt.
Nun bin ich auf der Suche nach einem geeigneten Operationsverstärker, um
die Spannungen im Bereich niedriger µV zu verstärken. Ich hätte an ein
gain = 1000 gedacht. Dann kann ich die Spannungen mit einem 16bit ADC
weiterverarbeiten. Die Eingangsspannung ändert sich nur sehr langsam im
Sekundenbereich, von daher würde auch eine lahme Krücke ausreichen.
Ich hätte jetzt aber eine Frage zur input offset voltage: Diese beträgt
etwa beim AD820 vom Temperaturdrift einmal abgesehen typischerweise 100
µV. Das würde ja bedeuten, dass der "Nullpunkt" um 100µV verschoben ist.
Dann wäre doch dieser OPV völlig ungeeignet, um Spannungen im Bereich
von 10µV zu verstärken, wenn ich das richtig verstanden habe (siehe auch
Wikipedia-Graphik). Ich würde dann ja einen sehr großen
output-voltage-offset bekommen und nicht etwa ca. 0 mV output bei 0 µV
input.
Kann mich bitte jemand aufklären? Danke im voraus, stoppi
Christoph E. schrieb:> Das würde ja bedeuten, dass der "Nullpunkt" um 100µV verschoben ist.> Dann wäre doch dieser OPV völlig ungeeignet, um Spannungen im Bereich> von 10µV zu verstärken, wenn ich das richtig verstanden habe
Ja. Ein LM358 tut es auch nicht. Die
http://dse-faq.elektronik-kompendium.de/dse-faq.htm nennt
TLC2652 (1uV
http://www.ebay.de/itm/TLC2652-Chopper-Amplifier-Module-DC-Signal-Amplifiers-Weak-Acquisition-Module-/191848843270
) LTC2051HV/LTC2052HV (3uV zerodrift bis 12V Reichelt) LTC2057HV (4uV
zerodrift bis 60V) LMP2021 (5uV max) ICL/TC7650/7651/7652 (5uV max
chopper, TME 2.12 EUR) LTC1050/LTC1250 (5uV chopper) MCP6V11 (8uV
zerodrift 1.6-5.5V, Reichelt) TSZ121 (8uV, ST, 1.8-5.5V) LTC1049/LTC1152
(10uV zerodrift, Ladungspumpe, Reichelt) AD8551 (1uV typ 10uV max, zero
drift, Reichelt 2.7-5.5V) AD8622 (10uV) LMP2015/LMP2016 (800nV typ. 10uV
max. 2.7..5.25V) AD8671 (20uV, Reichelt) OPA177F/OPA188 (10uV typ 25uV
max, 36V, 0.6MHz, Reichelt) OPA376/2376/4376 (5uV typ 25uV max 2.2-5.5V
R2R TI) OPA192 (5uV typ 75uV max, 10MHz, 36V) TC913 (15uV max chopper
TME) TSZ182 (R2R 25uV typ 45uV max 2.2-5.5V) OP07 (30uV typ. 75uV max.
36V, kein Rail-To-Rail)
Vielen Dank einmal für eure Hilfe! Der AD8551 sieht schon einmal sehr
gut aus...
Wenn ich den habe und es mit der thermosäule weiter geht, melde ich mich
wieder...
Mein erster, nicht invertierender Testverstärker mit gain = 1000
verwendet den LF357. Wenn dieser eine input-offset-voltage von z.b. 3 mV
hat, dann müsste ich ja eine Ausgangsspannung im Bereich von 3 V
erhalten, selbst bei 0 microvolt am Eingang. Und wenn ich dann 10
microvolt am Eingang anlege entsprechend 3.01 V am Ausgang. Soweit ich
mich erinnere, ist dies aber nicht der Fall. Werde es aber gleich noch
einmal ausprobieren...
Sind meine Überlegungen soweit richtig?
> Wenn dieser eine input-offset-voltage von z.b. 3 mV
hat, dann müsste ich ja eine Ausgangsspannung im Bereich von 3 V
erhalten, selbst bei 0 microvolt am Eingang. Und wenn ich dann 10
microvolt am Eingang anlege entsprechend 3.01 V am Ausgang. Soweit ich
mich erinnere, ist dies aber nicht der Fall.
Der kann ja auch -1mV oder +1mV Offset haben. die +/-3mV sind das
Maximum.
Eine Verstärkerschaltung für diese Anwendung, egal mit welchem Opamp,
benötigt eine positive und eine negative Versorgungsspannung da selbst
nach der Verstärkung mit Faktor 1000 nur wenige mV Spannung
herauskommen. Hast du das beachtet?
Hallo Helmut!
Die 3 mV waren ja nur als Beispiel gedacht, wobei dieser Wert beim LF357
nicht das maximum sondern typisch ist...
Das mit der symmetrischen Spannungsversorgung ist mir klar, wobei der
AD8551 ein single supply Typ ist. Ist dann nur die Frage, ob er bei
Eingangsspannungen so knapp über GND noch richtig arbeitet. Obwohl, dass
die Eingangsspannungen sehr klein sind, davon ist ja bei OPV zu
rechnen...
Aber prinzipiell sind meine Überlegungen richtig gewesen?
Eine Frage habe ich noch: Wenn ich den AD8551 mit 5V single supply nicht
invertierend betreibe und nur positive Eingangsspannungen vorkommen,
brauche ich dann auch noch eine virtuelle Masse z.b. Auf 2.5V?
> brauche ich dann auch noch eine virtuelle Masse z.b. Auf 2.5V?
Das müssen jetzt nicht 2,5V sein. Es tun auch 0,xV. oder eine negative
Versorgungsspannung mit -0,xV. Beachte, dass die Thermospannung der
Übergänge deiner Messleitungen schnell mal einige 10uV betragen könnnen,
wenn die nicht exakt auf gleicher Temperatur sind.
Christoph E. schrieb:> Eine Frage habe ich noch: Wenn ich den AD8551 mit 5V> single supply nicht invertierend betreibe und nur> positive Eingangsspannungen vorkommen, brauche ich> dann auch noch eine virtuelle Masse z.b. Auf 2.5V?
Auch wenn das überall "im Internet" anders steht: Ein
separat erzeugtes Bezugspotenzial ist KEINE virtuelle
Masse, sondern eine ganz reale Masse, wenn sie denn als
Masse (=Bezugspotenzial) verwendet wird.
Eine echte virtuelle Masse tritt bei manchen OPV-
Schaltungen auf. Fast alles, was von Laien als virtuelle
Masse bezeichnet wird, ist keine.
Hallo,
> Nun bin ich auf der Suche nach einem geeigneten Operationsverstärker, um> die Spannungen im Bereich niedriger µV zu verstärken. Ich hätte an ein> gain = 1000 gedacht. Dann kann ich die Spannungen mit einem 16bit ADC> weiterverarbeiten. Die Eingangsspannung ändert sich nur sehr langsam im> Sekundenbereich, von daher würde auch eine lahme Krücke ausreichen.
in Kurzform einige Hinweise:
- eine solche Verstärkung geht mit einem Zero-Drift-Amplifier.
- Eine geätzte Platine mit Massefläche ist bei diesen Spannungen m. E.
Pflicht.
- Kontaktspannungen und Thermospannungen können relevant werden.
- eine (+/-)-Spannungsversorgung ist leichter zu realisieren als ein in
der Luft hängendes Bezugspotential von 2,5V.
- Schaltregler würde ich nach Möglichkeit nicht verwenden, um eine
potentielle Fehlerquelle/Rauschquelle wegzuhalten.
- Beim ADC solltest Du darauf achten, dass er den 50-Hz-Anteil
rausnimmt, z. B. ADS1243. Bei einer Verstärkung von 1000 findest Du
ansonsten überall 50 Hz.
Leseempfehlung: Keithley Low Level Measurement Handbok (6th edition), im
Netz erhältlich.
Viele Erfolg und viele Grüße
Michael
Hallo!
Vielen Dank einmal für eure Bemühungen.
Da ich noch glaubte in Erinnerung zu haben, mit einem 0815-OPV und gain
= 1000 die µV-Spannungen einer gekauften Thermosäule ohne nennenswerten
offset im Griff gehabt zu haben, habe ich schnell einen nicht
invertierenden Verstärker mit dem LF357 und gain_max = 1000 gelötet.
Und siehe da: Bei 0µV Eingang erhalte ich (wie zu vermuten war) eine
sehr große offset-Spannung von 1.424 V. Speise ich 15 µV ein, so steigt
diese um rund 15 mV auf 1.441 V. Von daher passt alles bis auf den
extrem großen offset.
Habe bereits AD8551 bei reichelt bestellt. Wenn diese und der SO-8 auf
Dip Adapter eintrudeln, versuche ich mein Glück nochmals...
ÄXl schrieb:> Der Offeset lässt sich doch auch weggegeln. viele Operationsverstärker> haben hierfür einen extra Eingang.
Das ist im Prinzip richtig, nur ist mit dem großen Offset in den meisten
Fällen auch ein hoher TK des Offsets verbunden. Der stört hier auch
massiv.
Hallo,
> Und siehe da: Bei 0µV Eingang erhalte ich (wie zu vermuten war) eine> sehr große offset-Spannung von 1.424 V. Speise ich 15 µV ein, so steigt> diese um rund 15 mV auf 1.441 V. Von daher passt alles bis auf den> extrem großen offset.
ja, sieht gut aus.
Ich habe derartige Verstärkungen für ein µOhm-Meter genutzt. Das Problem
mit den 50 Hz war sofort sichtbar, vermutlich weil die Leitungen relativ
lang und in der Umgebung größere Maschinen bedient wurden. Ein
Verdrillen war bei derartig dicken Leitungen nicht möglich.
Die Massefläche dient vor allem dazu, überall das gleiche
Bezugspotential zu haben. Wenn auf deiner Massleitung 1mA fließen und
die Masseleitung 10mOhm hat, so kommst Du sofort auf eine Differenz von
10µV zwischen dem Anfang und dem Ende Deiner Masseleitung. Und die
verstärkst du dann, wenn Dein Messignal und der OPV ihr Bezugspotential
an unterschiedlichen Stellen abgreifen. Besonders lästig wird das, wenn
die Ströme auf der Masseleitung sich zeitlich ändern (z. B. durch
weitere Bauelemente im Rahmen einer größeren Schaltung). Insofern achte
bei der endgültigen Schaltung, wo Du das Massepotential abgreifst.
Die Probleme mit dem Bezugspotential treten erst recht auf, wenn Du mit
einem 2,5V-Bezugspotential arbeitest. Dann machen dir leichte
Schwankungen in der Versorgungsspannung die 2,5V-Bezugspotential kaputt,
sofern sie sich nicht auf alle Schaltungsteile auswirken.
> Habe bereits AD8551 bei reichelt bestellt. Wenn diese und der SO-8 auf> Dip Adapter eintrudeln, versuche ich mein Glück nochmals...
Das wird schon :-)
Viele Grüße
Michael
So, die Teile (AD8551, SO-8 Adapter) sind eingetroffen. Am Eingang des
nicht-invertierenden Verstärkers hängt ein 1:1 000 000 Spannungsteiler
mittels 1k und 1GOhm Widerstand.
Bei 0 µV am Eingang erhalte ich nun mit dem AD8551 einen offset von rund
1.5 mV. Steigere ich die Eingangsspannung auf z.B. 10 µV, habe ich bei
einer fixen Verstärkung von 1000 rund 7 mV erhalten, also deutlich zu
wenig. Deshalb habe ich den 1 MOhm-Widerstand im Rückkoppelzweig durch
ein 2 MOhm-Poti ersetzt. Nun erhalte ich einigermaßen die zu erwartenden
Messwerte (ca. 10 mV bei 10 µV am Eingang).
Diese Spannungen im mV-Bereich werde ich dann mittels 16bit AD-Wandler
ADS1115 dem Arduino zuführen. Auf der Anzeige der Thermosäule werde ich
dann die Ursprungsspannung in µV und die Strahlungsintensität in W/m²
angeben.
Ich würde die Verstärkung auf 2 OPV's aufteilen. Jeder OPV braucht
natürlich eine Offsetkompensation.
Vorteil des Verfahrens ist auf alle Fälle, das die Rauschspannungen
kleiner werden, da Du bei niedrigeren Verstärkungen auch kleinere
Widerstandswerte einsetzen kannst.
Erste Stufe würde ich Verstärkung 10 einstellen und bei der 2. Stufe
Verstärkung 100. Die zweite Stufe ist dann schon weniger kritisch, da
dort die Eingangsspannung schon ca. 100µV also 0,1mV beträgt und das ist
mit guten OPV's kein Problem mehr.
Weiterer Vorteil bei geringeren Verstärkungen ist das das Ganze stabiler
wird.
Bei 10V am Eingang müssten 20mV am Ausgang herauskommen. Dass da nur
10mV herauskommt liegt daran, dass
a) der Opamp im Bereich 0 bis 10mV eher nur Fahrkarten erzeugt und
b) schon eine kleine Thermospannung der Messleitungsübergänge von -10uV
genügen um 10mV Ablage am Ausgang zu bekommen. Da der Opamp ja keine
negative Versorgung hat stimmt deshalb die lineare Zunahme der
Ausgangsspannung nicht.
Irgendwie kann man hier hundertmal erzählen, dass single supply und 0V
Ausgangsspannung bei 0V EIngangsspannung eben nie richtig funktionieren
kann. Versorge den Opamp mal mit -100mV oder negativer. Achtung der
Opamp verträgt maximal 5,5V zwischen den Versorgungsspannungen V+ und
V-.
Christoph E. schrieb:> Danke einmal für die Kommentare...>>>Bei 10V am Eingang müssten 20mV am Ausgang herauskommen>> Wie kommst du auf das?
Tippfehler. Das sollte 10uV heißen.
Bei 10uV am Eingang müssten 20mV am Ausgang herauskommen. Dass da nur
10mV herauskommt liegt daran, dass
a) der Opamp im Bereich 0 bis 10mV eher nur Fahrkarten erzeugt und
b) schon eine kleine Thermospannung der Messleitungsübergänge von -10uV
genügen um 10mV Ablage am Ausgang zu bekommen. Da der Opamp ja keine
negative Versorgung hat stimmt deshalb die lineare Zunahme der
Ausgangsspannung nicht.
Irgendwie kann man hier hundertmal erzählen, dass single supply und 0V
Ausgangsspannung bei 0V EIngangsspannung eben nie richtig funktionieren
kann. Versorge den Opamp mal mit -100mV oder negativer. Achtung der
Opamp verträgt maximal 5,5V zwischen den Versorgungsspannungen V+ und
V-.
Für eine niedrige Frequenz und mit AZ OP kann man eine 1000 fache
Verstärkung noch gut in einer Stufe machen. Auf einen Poti / Trimmer im
Feedback sollte man eher verzichten.
Mit Eingangsspannung ganz an der 0 sollte der AD8551 kein Problem haben,
für den Ausgang wird es aber schwer.
Eine mögliche Fehlerquelle sind Einstreuungen, die so dicht am unteren
Rand Gleichgerichtet werden - denn negative kann der OP am Ausgang
nicht, auch nicht für ein überlagerte Wechselspannung (z.B. 50 Hz).
So, der 16bit ADC ADS1115 zur Weiterverarbeitung der vom AD8551
kommenden mV-Spannungen ist heute eingetroffen. Der ADS1115 arbeitet
sehr zuverlässig und liefert sehr stabile Werte.
In Kombination mit der AD8551-Verstärkerschaltung (gain = 1000) ist das
dann schon etwas anders. Die µV-Spannungswerte schwanken etwa um +/-15%,
was mir aber eigentlich ausreicht. Jetzt warte ich nur noch auf die
Thermosäule, dann geht es ans Eichen...
1
#include <LiquidCrystal_I2C.h>
2
#include <Wire.h>
3
#include <Adafruit_ADS1015.h>
4
5
//Adafruit_ADS1015 ads1015; // Construct an ads1015 at the default address: 0x48
6
//Adafruit_ADS1115 ads1115(0x49); // construct an ads1115 at address 0x49
7
8
Adafruit_ADS1115 ads1115; // Construct an ads1115 at the default address: 0x48
9
10
int16_t adc0, adc1, adc2, adc3;
11
12
int i;
13
14
float voltage;
15
float Leistung;
16
float Intensitaet;
17
18
LiquidCrystal_I2C lcd(0x3F,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!!
19
20
// Anschlüsse:
21
// GND - GND
22
// VCC - 5V
23
// SDA - ANALOG Pin 4
24
// SCL - ANALOG pin 5
25
26
27
// ===========================
28
// ======= SETUP =========
29
// ===========================
30
31
void setup()
32
{
33
Serial.begin(9600);
34
35
lcd.init(); // initialize the lcd
36
lcd.backlight();
37
lcd.setCursor(0,0);
38
lcd.print("Thermosaeule");
39
lcd.setCursor(0,1);
40
lcd.print("uV-Meter");
41
42
delay(4000);
43
44
lcd.setCursor(0,0);
45
lcd.print(" ");
46
lcd.setCursor(0,1);
47
lcd.print(" ");
48
49
//ads1015.begin(); // Initialize ads1015
50
ads1115.begin(); // Initialize ads1115
51
52
// The ADC input range (or gain) can be changed via the following
53
// functions, but be careful never to exceed VDD +0.3V max, or to
54
// exceed the upper and lower limits if you adjust the input range!
55
// Setting these values incorrectly may destroy your ADC!
56
// ADS1015 ADS1115
57
// ------- -------
58
// ads1115.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3 mV 0.1875 mV (default)
59
// ads1115.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2 mV 0.125 mV
60
// ads1115.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1 mV 0.0625 mV
61
// ads1115.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5 mV 0.03125 mV
62
// ads1115.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25 mV 0.015625 mV
63
// ads1115.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125 mV 0.0078125 mV
64
65
ads1115.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 0.0625mV
66
67
}
68
69
70
// ===========================
71
// ======= LOOP =========
72
// ===========================
73
74
void loop()
75
{
76
adc0 = 0.0;
77
78
for(i = 1; i <= 10; i++)
79
{
80
adc0 = adc0 + ads1115.readADC_SingleEnded(0);
81
}
82
83
adc0 = adc0 / 10.0;
84
85
/*
86
adc1 = ads1115.readADC_SingleEnded(1);
87
adc2 = ads1115.readADC_SingleEnded(2);
88
adc3 = ads1115.readADC_SingleEnded(3);
89
*/
90
91
voltage = adc0 * 0.0625; // eingelesene Spannung in mV bzw. durch gain = 1000 in uV
92
93
Leistung = voltage * 1.0; // Auf den Sensor auftreffende Strahlungsleistung
94
95
Intensitaet = voltage * 2.0; // Strahlungsintensität in W/m²
96
97
Serial.print("AIN0: ");
98
Serial.println(adc0);
99
Serial.print(" U = ");
100
Serial.print(voltage,2);
101
Serial.println(" uV");
102
103
/*
104
Serial.print("AIN1: "); Serial.println(adc1);
105
Serial.print("AIN2: "); Serial.println(adc2);
106
Serial.print("AIN3: "); Serial.println(adc3);
107
*/
108
109
lcd.setCursor(0,0);
110
lcd.print("U = ");
111
lcd.print(voltage,1);
112
lcd.print(" uV ");
113
114
lcd.setCursor(0,1);
115
lcd.print("I = ");
116
lcd.print(Intensitaet,2);
117
lcd.print(" W/m2 ");
118
119
delay(2000);
120
121
adc0 = 0.0;
122
123
for(i = 1; i <= 10; i++)
124
{
125
adc0 = adc0 + ads1115.readADC_SingleEnded(0);
126
}
127
128
adc0 = adc0 / 10.0;
129
130
voltage = adc0 * 0.0625; // eingelesene Spannung in mV bzw. durch gain = 1000 in uV
131
132
Leistung = voltage * 1.0; // Auf den Sensor auftreffende Strahlungsleistung
133
134
Intensitaet = voltage * 2.0; // Strahlungsintensität in W/m²
Christoph E. schrieb:> Am Eingang des> nicht-invertierenden Verstärkers hängt ein 1:1 000 000 Spannungsteiler> mittels 1k und 1GOhm Widerstand.
Nicht gut.
Schau dir mal die Temperaturkoeffizienten solcher Hochohmwiderstände an!
Ausserdem reicht dann schon eine geringfügige Verschmutzung der Platine
(oder des Widerstands durch Fingerabdrücke) um grosse Meßfehler zu
bekommen.
Thermolemente sind doch niederohmig und ermöglichen die Verwendung
vernünftiger Widerstandswerte.
@nachtmix: Danke für deine Einwände. Ich brauchte einfach etwas zum
Testen am Eingang im µV-Bereich. Die Peltierelemente bzw. die
Thermosäule sind noch auf dem Weg zu mir...
So, habe heute die Thermosäule mit der auf dem Peltierelement
befindlichen Widerstandskette kalibriert (siehe Excel-Graph und
-Tabelle). Dies ergab folgende Beziehung: 11.26 mW/mV. Dieser Wert
stimmt auch sehr gut mit meinem zweiten Laserleistungsmessgerät auf
Peltierbasis überein (siehe älterer Beitrag weiter oben).
Jetzt bin ich von der Peltierfläche A = 16 cm² = 1/625 m² ausgegangen.
Treffen also 11.26 mW auf 1/625 m², so erhält man 1 mV. Demnach gilt
auch: 625 * 11.26 mW auf 1 m² ergeben 1 mV. 7037.5 mW/m² ergeben 1 mV.
Die zweite Beziehung lautet also: 7.0375 W/m²/mV.
Richte ich etwa einen schwachen 532nm-Laser auf die Thermosäule, zeigt
mir das Display rund 3 mW an. Das ist durchaus plausibel.
Als Verstärkung des AD8551 habe ich jetzt 10x gewählt. Damit entspricht
1 bit des ADS1115 einer Spannung von rund 6 µV. Anzeigen lasse ich noch
1/100 mV, also 10 µV.
Achtung: Der obige Code für den ADS1115 machte bei folgender
Mittelwertsbildung Probleme:
1
adc0 = 0.0;
2
3
for(i = 1; i <= 10; i++)
4
{
5
adc0 = adc0 + ads1115.readADC_SingleEnded(0);
6
}
7
8
adc0 = adc0 / 10.0;
Da zeigte der ADS1115 nur bis rund 200mV richtige Werte, darüber
wechselte er in den negativen Bereich...
Also einfach die Mittelwertsbildung weglassen und einen Einzelwert
einlesen oder ein delay einbauen.
Der Bausatz für die Thermosäule ist wie gesagt bei AATiS für nur 19 Euro
zu beziehen:
https://www.aatis.de/content/bausatz/AS516_Thermo%E2%80%90S%C3%A4ule
Ja, 200mV / 6uV sind ca 30'000, 15 bit, das 16.Bit ist das Vorzeichen
wenn du mit Vorzeichen arbeitest. Deine variable adc0 ist also signed 16
bit ?
Mach diese Variable 32 bit und es passt.
Wozu duch 10 Teilen ? Lass das weg. Das bringt nichts.