Forum: Analoge Elektronik und Schaltungstechnik Problem bei Temp-Messung Rasp. Pi Pico & Pt1000


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Manfred M. (mm_lauf)


Lesenswert?

Ich will Temperaturen mittels PT1000 an Raspberry Pi Pico messen, aber 
so wie ich es mache erhalte ich Schwankungen (in Messungen die in 10 sec 
Abstand gemacht werden) bis zu 8 °C, obwohl die Temp des Sensors 
konstant gehalten wird
So mache ich es: 1k5 Widerstand in Reihe mit Pt1000. Angelegte 
Spannungen 3,3 V oder 5,1 V. Zwischen Widerstand und Sensor liegt der 
Eingang zum ADC des Pico. Messungen in 10-sek-Zyklus

Vermutlich müsste ich OP-Amp benutzen. Meine Frage: welchen?
Dessen Stromversorgung sollte mit 5,1 V (oder 3,3 V - m.E. vielleicht 
nicht so gut) möglich sein.

Die tatsächlichen Temp interessiert mich nicht so sehr wie deren 
Änderung. Die anstrebte Anwendung steht in Zusammengang zu Meteorologie.

Vielen Dank vorab
& viele Grüße
Manfred
Dipl. Math. mit Nebenfächern Physik und Informatik
Meine ersten "PC" habe ich selbst gebaut, aber vor 40 Jahren - 
hauptsächlich Fädeltechnik benutzt. spätestens 5 Jahre später ging mein 
Elektronik-Fachwissen gegen Null. Bin beeindruckt was der Pico kann, 
aber enttäuscht, dass meine Idee, so wie bisher realisiert, nicht gut 
ist.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Manfred M. schrieb:
> Zwischen Widerstand und Sensor liegt der
> Eingang zum ADC des Pico

Glätte das noch etwas mit einem Kondensator parallel zum PT1000. Kann 
ein 47nF-2,2µF sein. Am besten eine 25V oder 50V Type.

von Pete K. (pete77)


Lesenswert?

Kann ja auch an der Software liegen. Zeig mal her.

von Manfred M. (mm_lauf)


Lesenswert?

@ Pete K.
1
import machine
2
import utime
3
from machine import ADC, Pin
4
i=0
5
while i<12 :
6
    adc_0 = ADC(Pin(26))   
7
    adc_1 = ADC(Pin(27))
8
    adc_2 = ADC(Pin(28))
9
    adc_3 = ADC(Pin(29))
10
    adc_i = machine.ADC(machine.ADC.CORE_TEMP)
11
    i=i+1
12
    adc= adc_0.read_u16()
13
    adc= adc_1.read_u16()
14
    adc= adc_2.read_u16()
15
    adc= adc_3.read_u16()
16
    print(i, adc_0.read_u16(), adc_1.read_u16(), adc_2.read_u16(), adc_3.read_u16(), adc_i.read_u16())
17
    utime.sleep(10)

am adc_0 hängt meine Schaltung, an adc_1  ADC_Vref
die Werte  adc_1, adc_2, adc_3, adc_i schau ich mir nur an, um zu sehen 
wie gut die Messungen reproduzierbar sind

(Mod.: Code-Tags erg.)

: Bearbeitet durch Moderator
von Manfred M. (mm_lauf)


Lesenswert?

@matthias

Dank für Deinen Tipp. Hier habe ich zufällig nur einen mit 33 µF 
Elektrolyt für 400 V (war als Ersatz in einem Netzteil gedacht). Bin 
überrascht, weil das Teil die Unterschiede vergrößert hat.
VG
MM

von Koller (Gast)


Lesenswert?

Manfred M. schrieb:
> am adc_0 hängt meine Schaltung, an adc_1  ADC_Vref
> die Werte  adc_1, adc_2, adc_3, adc_i schau ich mir nur an, um zu sehen
> wie gut die Messungen reproduzierbar sind

Wie kommst du auf Schwankungen von 8 Grad? Verwechselst du das mit 
Schwankungen der ADC Werte (LSBs)? Ich sehe in deinem Code keine 
Umrechnung von ADC Werten in Grad Celsius.

von MaWin (Gast)


Lesenswert?

Manfred M. schrieb:
> So mache ich es

Über einen Pt1000 sollten maximal 0.33V anliegen, sonst verfälscht die 
Eigenerwärmung das Messergebnis

Manfred M. schrieb:
> Vermutlich müsste ich OP-Amp benutzen

Jein, da der rPi Pico 12bit an 3.3V Referenz auflöst, also 0.8mV, 
während sich die Spannung an einem Pt1000 um ca. 1.3mV/GradC ändert, 
könntest du auf 1 GradC auflösen. Da jedoch die letzten 4 bit der 12 bit 
ziemlich gestört sind, müsstest du lange den Mittelwert bilden zur 
Filterung.

Wenn du aber 1/10 GradC auflösen willst, brauchst du einen OpAmp.

https://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.32

Man verstärkt mit einen Rail-To-Rail OpAmp den Spannungsbereich im 
interessierenden Temperaturbereich auf den 0-3.3V Bereich des ADC, da 
ratiometrisch gemessen wird WENN DU DIE GEFILTERTEN 3.3V an AREF als 
Quelle für deinen Pt1000 Spannungsteiler verwendest und nicht die 
gestörte 3.3V VCC Betriebsspannung des rPiPico.

von Manfred M. (mm_lauf)


Lesenswert?

@Koller

im Pico rechne ich noch keine Daten um. Das mache ich momentan noch per 
Tabellenkalkulation.
Von meinen früheren Elektronik-Kenntnissen ist nicht mehr viel übrig. 
Dazu kommt, dass diese aus der Digitaltechnik stammten.

Rechnen lassen kann ich noch (hoffe ich).

Für Pt1000 fand ich 0,4 K je mW durch PT1000 (habe keine Ahnung ob das 
allgemeingültig ist). Bei mir fließen 1,9 mA bei 2,1 V Verlust also 4 mW 
entsprechend 1,6 K

Hier Rohwerte, die eine Schwankung der Temp von 4,3 ° ergeben :
58846
58990
58942
58958
58894
59070
58702
58718
58942
58830
58974
59086

Umrechnung in Spannung (*3,3/65535) über 1488 Ohm und Strom durch 1488 
Ohm, also auch durch Pt1000, dann Spannung über Pt1000, dann Widerstand 
des PT1000 (woraus ich die Temp berechne (mit 0,257731959 K / Ohm)
Spannung        Strom           Spannung        Widerstand
über                             über           des
1488 Ohm                         Pt1000         Pt1000
   [V]             [A]             [V]           [Ohm]

2,963177   0,001991   2,134823   1072
2,970428   0,001996   2,127572   1066
2,968011   0,001995   2,129989   1068
2,968817   0,001995   2,129183   1067
2,965594   0,001993   2,132406   1070
2,974456   0,001999   2,123544   1062
2,955926   0,001987   2,142074   1078
2,956732   0,001987   2,141268   1078
2,968011   0,001995   2,129989   1068
2,962371   0,001991   2,135629   1073
2,969622   0,001996   2,128378   1066
2,975262   0,002000   2,122738   1062

Alles ok?

von Manfred M. (mm_lauf)


Lesenswert?

@MaWin

Die Idee Mittelwerte zu bilden gefällt mir (am besten wohl gleitend). 
Gut. Aber ohne wär es mir viel lieber. Andererseits Mittel über 5 oder 
10 Min wäre ok.
Dank für den Tipp!

VG
MM

von Manfred M. (mm_lauf)


Lesenswert?

Die Zuleitungen (4m) zu den PT100 sin mit Drahtgeflecht ummandelt. 
Liegen momentan als Schleifen hier (sind also  alles schöne Antennen für 
EM-Einstrahlung). Ich hatte gehoffte, dass die Schwankungen kleiner 
werden wenn ich das Drahtgeflecht mit GND oder 5 V des Pico verbinde. 
Hat nichts gebracht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Manfred M. schrieb:
> Hier habe ich zufällig nur einen mit 33 µF
> Elektrolyt für 400 V (war als Ersatz in einem Netzteil gedacht). Bin
> überrascht, weil das Teil die Unterschiede vergrößert hat.

Nana, bitte nicht übertreiben. Dieser Elko ist völlig daneben.

von Manfred M. (mm_lauf)


Lesenswert?

Nochmal mit Korrekturen & Ergänzung

Die Zuleitungen (4m) zu den PT1000 sind mit Drahtgeflecht ummandelt.
Liegen momentan als Schleifen hier (sind also  alles schöne Antennen für
EM-Einstrahlung). Ich hatte gehoffte, dass die Schwankungen kleiner
werden wenn ich das Drahtgeflecht mit GND oder 5 V des Pico verbinde.
Hat nichts gebracht.

Ergänzung:
z.Zt lass ich alle 60 sec messen und werde dann Mittel aus 10 Werten 
berechnen lassen. Natürlich muss ich dann auch auf die 
Standardabweichung achten müssen.

Nächster Versuch ist dann all 10 sec 10 Min lang, dann mitteln lassen

Hinweis:
20 Ohm Diff beim Widerstand des Pt1000 sind ein Delta von ca. 5,15 K

von Koller (Gast)


Lesenswert?

Manfred M. schrieb:
> Hier Rohwerte, die eine Schwankung der Temp von 4,3 ° ergeben :
> 58846
> 58990
> 58942
> 58958
> 58894
> 59070

Deine Rohwerte deuten auf ein Problem in deinem Aufbau hin. Lange 
Leitungen? Vermutlich fängst du dir damit Störungen ein. Versuche es mal 
einem 100 nF Kondensator am ADC Eingang.

> Umrechnung in Spannung (*3,3/65535) über 1488 Ohm und Strom durch 1488
> Ohm, also auch durch Pt1000, dann Spannung über Pt1000, dann Widerstand
> des PT1000 (woraus ich die Temp berechne (mit 0,257731959 K / Ohm)
> Spannung        Strom           Spannung        Widerstand
> über                             über           des
> 1488 Ohm                         Pt1000         Pt1000
>    [V]             [A]             [V]           [Ohm]

> 2,975262   0,002000   2,122738   1062
>
> Alles ok?

Nein. Bei einer ratiometrischen Messung sollten ADC_REF und der 
Spannungsteiler von der gleichen Spannungsquelle gespeist werden (hat 
MaWin schon erwähnt). Dann geht diese Spannung, wenn sie stabil und 
ungestört ist, nicht mehr in das Ergebnis ein.

Aus deiner Rechnung sehe ich, daß du 3,3V als Referenz und 5,1V für den 
Spannungsteiler genommen hast. Nimm ADC_REF auch für den 
Spannungsteiler.

von Manfred M. (mm_lauf)


Lesenswert?

Koller schrieb:
> Aus deiner Rechnung sehe ich, daß du 3,3V als Referenz und 5,1V für den
> Spannungsteiler genommen hast. Nimm ADC_REF auch für den
> Spannungsteiler.

So begann ich und weil die Schwankungen zu groß waren ging ich auf 5,1 
V. Ich kann aber auch wieder zurück. 2k2 oder 3k3 statt 1k5 in Reihe zum 
Pt1000. Mit Vref also 3,3 V wird der Spannungsbereich, in dem der ADC 
messen soll aber kleiner. Ich will im Bereich von 1000 bis 1100 Ohm 
messen.

Leider habe ich keine Info wieviel Strom der ADC zieht. Er soll in 
Schaltung mussen in der max. 2 mA fließen; einen davon Teil zieht er 
währen Messung ab. Daher: Die Idee mit den Kondensatoren könnte schon 
auch gut sein.

von Cartman (Gast)


Lesenswert?

4 Si-Dioden in Reihe haben beim passenden Strom 10 mV/K.
Wenn ich die mit den 10 bit eines uralten PIC-ADC messe,
dann zappelt da nichts und rauscht auch nichts.
Wenn man nicht gerade einen Wert zwischen 1 LSB erwischt,
sind die AD-Werte wie in Stein gemeisselt.
Da braucht man nicht mal einen "Glaettungskondensator".

Irgendwas machst du also falsch.

von Manfred M. (mm_lauf)


Lesenswert?

Mag sein, aber: Was?

von Koller (Gast)


Lesenswert?

Manfred M. schrieb:
> Leider habe ich keine Info wieviel Strom der ADC zieht. Er soll in
> Schaltung mussen in der max. 2 mA fließen; einen davon Teil zieht er
> währen Messung ab. Daher: Die Idee mit den Kondensatoren könnte schon
> auch gut sein.

In dem verlinkten Datenblatt stehen im Kapitel 4.3 noch ein paar Dinge 
zum ADC, vielleicht hilft dir das ja noch etwas.

https://components101.com/sites/default/files/2021-01/Raspberry-Pi-Pico-Microcontroller-Datasheet.pdf

von Cartman (Gast)


Lesenswert?

> Was?

Das ist doch nun einfach.
Ersetzte nacheinander jeden Teil deines Aufbaus.
Natuerlich immer Alternativen waehlen.

von Dirk B. (dirkb2)


Lesenswert?

Manfred M. schrieb:
> Die Zuleitungen (4m) zu den PT1000

Ist das denn ohne die Kable stabiler?

von Manfred M. (mm_lauf)


Lesenswert?

Cartman schrieb:
> Irgendwas machst du also falsch.

Aha
Naja, den Verdacht habe ich auch, weiß aber nicht was. Deshalb poste ich 
in dieses Forum

von Manfred M. (mm_lauf)


Lesenswert?

Neue Messungen

10 Min 60 Messwerte, Mittelwert 1096 Ohm entspricht 17,9 °C
Standardabweichung der Rohdaten 128; der in °C umgerechneten 0,891 °C

ABER:
Minimaler Messwert: 1055 Ohm, entspricht  14,1 °C
Maximaler Messwert: 1086 Ohm, entspricht  22,2 °C
Deltas: 31 Ohm * 0,257731959  °C / Ohm = 8 °C

von m.n. (Gast)


Lesenswert?

Ein Blick ins Datenblatt vom RP2040 auf Seite 583 unten zeigt typische 
"Schwankungen" nebst einer Entschuldigung. Alles etwas unterirdisch.

von Manfred M. (mm_lauf)


Lesenswert?

Ich zeichne jetzt mal:
1
              R1                 R2
2
          |---------|       |----------|
3
5,1 V  ---| Pt1000  |-------| 1488 Ohm |------- GND     
4
          |---------|   ^   |----------|
5
              U1        |       U2
6
                        |
7
                       ADC  ------------------- GND

Nun rechnen:
ADC misst also U2 einen Wert (MW) mit MW = 65535 entspricht 3,3 V, dh.
1
U2 = MW * 3,3 / 65535
2
3
U1= 5,1 V - U2
4
5
I = U2 / R2 = U2 / 1488 (V/A)
6
7
U1 = 5,1 - U2
8
9
R1= 
10
= U1 / I = (5,1 V - U2) /  (U2 / R2 ) = 
11
= (5,1 V - U2) / (U2 / 1488 (V/A)) = 
12
= (5,1 V - U2) * 1488 V/A / U2  oder
13
= (5,1 V - MW * 3,3 V / 65535) * 1488 V/A / (MW * 3,3 V / 65535)  =
14
= ( 5,1 V * 65535 / (MW * 3,3 V) - 1) * 1488 V/A

richtig?

(Mod.: PRE-Tags)

: Bearbeitet durch Moderator
von Norbert (Gast)


Lesenswert?

Also, mal ein paar Infos.
1) Der ADC des RP2040 ist derart hochohmig das praktisch kein Strom in 
den Eingang fließt. Kondensatoren braucht es nicht, sind sogar 
kontraproduktiv.
2) Wenn das microPython ist (und so sieht's aus), dann musst du noch 
etwas machen um die ADC-Eingänge sauber abzukoppeln. (Genaueres im 
DaBla)
1
#!/usr/bin/python3
2
from machine import mem8
3
PADS_BANK0_BASE = const(0x4001c000)
4
GPIO26 = const(0x6c)
5
GPIO27 = const(0x70)
6
GPIO28 = const(0x74)
7
GPIO29 = const(0x78)
8
mem8[PADS_BANK0_BASE + GPIO26] = 1 << 7
9
mem8[PADS_BANK0_BASE + GPIO27] = 1 << 7
10
mem8[PADS_BANK0_BASE + GPIO28] = 1 << 7
11
mem8[PADS_BANK0_BASE + GPIO29] = 1 << 7
3) Lass das verdammte Ding ordentlich kreisen und lese ein paar tausend 
mal pro Sekunde die ADCs und filtere sanft. Dann wird das alles glatt 
wie ein Seidentuch.
1
#!/usr/bin/python3
2
anal = 0.99 * anal + 0.01 * adc_0.read_u16()
4) Der rp2040 hat vier Macken im ADC Verlauf, bei 1×512, 3×, 5×, 7×
Solltest du mit deiner Eingangsspannung genau auf einem dieser Punkte 
liegen, dann noch einen kleinen R in Serie zu PTC. Dann verschiebt's 
sich ein wenig.

von Norbert (Gast)


Lesenswert?

Norbert schrieb:
> Der rp2040 hat vier Macken im ADC Verlauf, bei 1×512, 3×, 5×, 7×
Müssen natürlich durch 4096 dividiert und mit 65535 multipliziert 
werden, da microPython schon skalierte Werte produziert.

von Manfred M. (mm_lauf)


Lesenswert?

m.n. schrieb:
> Ein Blick ins Datenblatt vom RP2040 auf Seite 583 unten zeigt typische
> "Schwankungen" nebst einer Entschuldigung.

> Alles etwas unterirdisch.

Leider verstehe ich das Meiste, das dort steht, nicht. Weiterhin weiß 
ich nicht was zwischen Pin des Chips RP2040 und Pin der Platine passiert 
oder da nichts passiert.

Ja: Alles etwas unterirdisch. Vielleicht ist der Pico nur als Spielzeug 
gedacht (?)

von Alois (Gast)


Lesenswert?

Manfred M. schrieb:
> So mache ich es: 1k5 Widerstand in Reihe mit Pt1000. Angelegte
> Spannungen 3,3 V oder 5,1 V. Zwischen Widerstand und Sensor liegt der
> Eingang zum ADC des Pico.

Matthias S. schrieb:
> Glätte das noch etwas mit einem Kondensator parallel zum PT1000. Kann
> ein 47nF-2,2µF sein. Am besten eine 25V oder 50V Type.

Manfred, mach dir mal klar, was der Begriff "ratiometrisch" bedeutet und 
wie ein ADC funktioniert. (Ich verwende im Folgenden mal deine Begriffe 
in Anführungszeichen).

Dein Teiler 1k5/PT1000 teilt die "angelegte Spannung (3,3V oder 5,1V)" 
um einen bestimmten Faktor. Es ist dieser Faktor, den du wissen willst.

Das im ADC (z.B. 10 bit) eingebaute SAR (Successive Approximation 
Register) verstellt einen "digitalen Teiler" (0/1024, 1/1024, ... 
1023/1024) so lange, bis die ADC-Eingangsspannung der Ausgangsspannung 
des digitalen Teilers entspricht.

Speist man nun den 1k5/PT1000-Teiler und den "digitalen Teiler" aus 
exakt der gleichen "angelegten Spannung", gibt der ADC einen Messwert 
aus, der in erster Näherung unabhängig von der "angelegten Spannung" 
ist.

Das SAR kann man bei der Arbeit aber stören, wenn die "angelegte 
Spannung" oder die ADC-Eingangsspannung während eines Wandelvorgangs 
nicht konstant bleibt, also z.B. mit Störungen beaufschlagt ist.

Du musst unbedingt darauf achten, dass beide Zweige (1k5/PT1000-Teiler 
und ADC-Teiler) genau gleich gespeist werden, also nicht, dass Du z.B. 
im 1k5/PT1000-Zweig durch übermäßige Kondensatoren Störungen raus 
filterst, und im ADC-Zweig nicht - sonst kann das SAR den richtigen 
Teiler-Faktor nicht finden. Filtere statt dessen den Zweig "angelegte 
Spannung". Dort sollte (Grund wie oben beschrieben) eine rauschfreie und 
konstante Spannung anstehen.

Die "angelgte Spannung" nennt man i.A. Vref = Referenz-Spannung ...

von Zeno (Gast)


Lesenswert?

Rechne mal die Velustleiszung in Deinem Pt1000 aus.
In Deinem Aufbau 1,5kOhm + Pt1000 an 5V fließen 2mA durch die 
Widerstände. Aus I^2*R errechnet sich damit für Deinen Pt1000 eine 
Verlustleistung von 4mW. Das ist zuviel, Du mußt deutlich unter 1mW 
kommen.
Beim Pt100 wird im allgemeinen von einem max. Messstrom von 1mA 
ausgegangen, was dort 0,1mW entspricht. 1mA beim Pt1000 wären dann 1mW. 
Mit anderen Worten der Strom sollte für den Pt1000 deutlich niedriger 
als Deine 2mA sein.

von Ein alter Hase (Gast)


Lesenswert?

Es bietet sich hier die Verwendung eines NTC von z.B. 10K bei 25°C mit 
einem Vorwiderstand von 39K2 0,1% an. Betriebsspannung max. 3.3V. Mit 
dieser Kombi
erreicht bei 10-Bit ADC eine Genauigkeit von 0,1°C! Den ADC-Kanal 
mehrfach messen und nur den letzten Wert zur Berechnung verwenden. 
Dadurch wird das
Übersprechen der ADC-Kanäle reduziert und man erhält einen stabilen 
Messwert.
Viel Erfolg

von Cartman (Gast)


Lesenswert?

> Ja: Alles etwas unterirdisch.
> Vielleicht ist der Pico nur als Spielzeug gedacht (?)

Nun, wer die bisherigen "Designergebnisse" der Truppe gesehen hat,
weiss dass da nur Spielzeug hergestellt wird.
Ich verschwende an die schon lange keinen Euro mehr.

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Vielleicht ist der Pico nur als Spielzeug gedacht (?)
Zwei ARM Kerne a 133MHz bis auf über 270MHz übertaktbar.
1/4 MiB RAM, 2 PIO, 8 SM bei maximaler Taktfrequenz nutzbar.
DMA, RTC, USB, UART, SPI, ADC 12bit, …

Preis: 1 Euro

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:
> 1) Der ADC des RP2040 ist derart hochohmig das praktisch kein Strom in
> den Eingang fließt. Kondensatoren braucht es nicht, sind sogar
> kontraproduktiv.

OK. Und woher weißt Du das?

> 2) Wenn das microPython ist (und so sieht's aus),
richtig

> dann musst du noch
> etwas machen um die ADC-Eingänge sauber abzukoppeln. (Genaueres im
> DaBla)

= Datenblatt? Welches? S. ?

Und was passiert da:

> #!/usr/bin/python3
> from machine import mem8
> PADS_BANK0_BASE = const(0x4001c000)
> GPIO26 = const(0x6c)
> GPIO27 = const(0x70)
> GPIO28 = const(0x74)
> GPIO29 = const(0x78)
> mem8[PADS_BANK0_BASE + GPIO26] = 1 << 7
> mem8[PADS_BANK0_BASE + GPIO27] = 1 << 7
> mem8[PADS_BANK0_BASE + GPIO28] = 1 << 7
> mem8[PADS_BANK0_BASE + GPIO29] = 1 << 7

????? Huch. Sieht so aus als würdest Du in 4 IO Adressen schreiben aber 
wieso "1 << 7" ? Bitshift  1 * 2^7 = 128 ?

Quelle: Rot umrandeter Text auf S. 584 des Datasheets?

Weckt dunkle Erinnerung an DEC-PDP11

Und nun frag ich mich wieso mir nicht auffiel, dass in machine mem8 
enthalten ist.

Mir scheint, dass langsam ein Schuh entsteht... :-)

Habe mich schon gewundert wie das wohl funktioniert, dass ein Pin für 
digital IO und für ADC verwendet wird ohne dass irgendwie ein 
(digitaler) Switch betätigt wird.

In
https://docs.micropython.org/en/latest/library/machine.ADC.html
und
https://docs.micropython.org/en/latest/library/machine.ADCBlock.html
las ich, aber verstanden hab ich fast nix. Leider


> 3) Lass das verdammte Ding ordentlich kreisen und lese ein paar tausend
> mal pro Sekunde die ADCs und filtere sanft.

D.h.???

> Dann wird das alles glatt
> wie ein Seidentuch.
> #!/usr/bin/python3
> anal = 0.99 * anal + 0.01 * adc_0.read_u16()
> 4) Der rp2040 hat vier Macken im ADC Verlauf, bei 1×512, 3×, 5×, 7×
Aha. Ist das von RP2040 Datasheet  S. 589 Figure 117?
Ich habe § 4.9.4 im Datasheet nicht verstanden

> Solltest du mit deiner Eingangsspannung genau auf einem dieser Punkte
> liegen, dann noch einen kleinen R in Serie zu PTC. Dann verschiebt's
> sich ein wenig.

von Wolfgang (Gast)


Lesenswert?

Zeno schrieb:
> Rechne mal die Velustleiszung in Deinem Pt1000 aus.

Eine zu hohe Verlustleistung im Pt1000 führt nicht zu Schwankungen des 
ADC-Wertes. Das ist eine andere Baustelle.

Norbert schrieb:
> 1) Der ADC des RP2040 ist derart hochohmig das praktisch kein Strom in
> den Eingang fließt. Kondensatoren braucht es nicht, sind sogar
> kontraproduktiv.

Praktisch fließt da durchaus Strom, weil bei der Kanalumschaltung und 
Abtastung des Signals interne Kapazitäten umgeladen werden müssen. Die 
Umladeströme belasten den Spannungsteiler. Ein Kondensator wirkt hier 
stützend und kann die Ladungen bereitstellen, ohne dass sich die 
Spannung zu sehr ändert.

von Norbert (Gast)


Lesenswert?

In Kürze.
Das offizielle RP2040 datasheet v1.7.1

S.640 ADC Input Impedance >= 100kΩ

S.647 Errata: Reference RP2040-E6
Summary GPIO digital inputs not disabled for ADC pins by default

Tausend Mal:
1
#!/usr/bin/python3
2
anal = adc.read_u16() # Grundwert laden
3
for _ in range(1000):
4
    anal = 0.99*anal + 0.01*adc.read_u16()
Gibt einen schönen glatten float Wert. Wenn's etwas träger sein darf 
gerne auch ×0.999  und ×0.001

S.589 DNL error
Muss man wie gesagt auf die unsigned 16bit Werte von microPython 
umrechnen.

von Klaus S. (kseege)


Lesenswert?

Wenn man bei Messungen nicht recht weiß, woher seltsame Effekte kommen, 
empfiehlt es sich nach meiner Erfahrung:

1.) 50-Hertz-Brumm verringern:
Zum Beispiel durch 2 Messungen im Abstand von genau 10ms und diese 
zusammenzählen

2.) Sowenig Aktionen wie möglich:
Nur 1 ADC-Kanal, keinerlei Umschaltungen, nur Messen und Ergebnis 
ausgegen. Wenn es dann immer noch wackelt wie ein Lämmerschwanz, 1000 
Messungen speichern und erst anschließend ausgeben.

Meist wird man dabei klüger.

Just my 2 cents

Klaus (der sounsovielte)

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Ich habe § 4.9.4 im Datasheet nicht verstanden

Optimal (unerreichbar) wäre eine flache Null-Linie.
Der ADC ist deutlich entfernt von Optimal!

Aber, mit heftigem Oversampling und einem schönen erwünschten Rauschen 
ist der prächtig zu gebrauchen.
Habe viele Messungen gemacht, zB. eine Kondensator-Entladekurve sieht 
dann plötzlich wie im Lehrbuch aus. Und der Herr Euler wäre begeistert.

von Cartman (Gast)


Lesenswert?

Wenn man 133 MHz durch
> Tausend Mal:
teilt, bleibt nicht viel uebrig.
Von 270 MHz auch nicht.

> prächtig

Ich weiss ja nicht. Meine Vorstellungen sind da wohl andere.
Ist das Rauschverhalten ueberhaupt vernuenfig dokumentiert?
Oder stehen an der Stelle dann Ausreden und Entschuldigungen?

Eigentlich kann man 12 bit ADC so aufbauen und in einen Controller
integrieren, dass das letzte Bit vielleicht ein wenig zappelig ist.
Kann man sich z.B. bei TMS320 von TI ansehen...
Die gibt es allerdings nicht fuer 1 Euro.

Selbst die Chinesen bekommen es bei ihren 4 1/2-stelligen
Panelmetern hin, mit einem MCP3421 (18 bit) eine ruhige Anzeige zu
praesentieren.

von Norbert (Gast)


Lesenswert?

Cartman schrieb:
> Wenn man 133 MHz durch
>> Tausend Mal:
> teilt, bleibt nicht viel uebrig.
> Von 270 MHz auch nicht.
Das ist ein Strohpuppen-Argument und das weißt du auch!

Aber nur zur Sicherheit: Man kann die vollen 500ksps mit C++, C, oder 
Assembler nutzen. Mit nur einem Kern, Teillast! Mit microPython etwas 
weniger (native/viper), aber immer noch sechs-stellig.
Wenn man jedoch clever ist nutzt man die DMA Funktionalität. Die kann 
endlos Buffer füllen. Völlig ohne CPU!

> Eigentlich kann man 12 bit ADC so aufbauen und in einen Controller
> integrieren, dass das letzte Bit vielleicht ein wenig zappelig ist.

Selbst STM schafft es mit ihrem F407 auf ihrem eigenen Board nicht.
Hab' ich schon vor einigen Jahren hier im Board mit reichlich Messungen 
dokumentiert.

> Kann man sich z.B. bei TMS320 von TI ansehen...
> Die gibt es allerdings nicht fuer 1 Euro.
Gut zu wissen.

von Norbert (Gast)


Lesenswert?

Cartman schrieb:
> Selbst die Chinesen bekommen es bei ihren 4 1/2-stelligen
> Panelmetern hin, mit einem MCP3421 (18 bit) eine ruhige Anzeige zu
> praesentieren.
Noch 'ne Strohpuppe.
Messen die auch FÜNFHUNDERTTAUSEND Mal pro Sekunde?
Oder eher zwei bis drei Mal?

von Manfred M. (mm_lauf)


Lesenswert?

Hallo

vielen Dank für Eure Tipps.

Ich habe nun mal meine Schaltung geändert:


              R1                 R2
          |---------|       |----------|
GND ------| Pt1000  |-------| 3257 Ohm |------- 5,1 V
          |---------|   ^   |----------|
              U1        |       U2
                        |
GND ----------------  ADC

jetzt habe also I =~ 0,001166 und eine Verlustleistung von 0,00149847 W

ABER das Problem mit den Schwankungen ist nicht weg.
Bei 60 Messungen: 8,346 K
Mittelwert  28,077
Standardabw  1,242

Ich werde jetzt noch auf 3,3 V  (Vref) statt 5,1 gehen.
Danach kümmere ich mich um die Hinweise von Norbert (14.03.2022 18:27) .

von Wolfgang (Gast)


Lesenswert?

Manfred M. schrieb:
> ABER das Problem mit den Schwankungen ist nicht weg.

Um deine Störquellen zu trennen, schmeiß doch erstmal den Pt1000 raus 
und setze statt dessen einen 1kΩ Widerstand ohne die lange Leitung rein.

Außerdem sehe immer noch keinen Kondensator, weder auf den 5.1V noch am 
ADC-Eingang. Wie sind die 5.1V vom Digitalkram entkoppelt. Sitzt da 
irgendein vernünftiges Filter zwischen?

von Cartman (Gast)


Lesenswert?

> FÜNFHUNDERTTAUSEND Mal pro Sekunde

Von denen man zum Averaging scheinbar auch jede Menge braucht.
Pech nur dann, wenn man mal nicht repetierende Signale messen
und womoeglich genauer auswerten muss.
Oder ist bei deinem DSO das Averaging fuer die "schoenen glatten"
Kurven auch immer an? Weil die Welt dann viel runder aussieht?

Die besten der TMS320(F2809) schaffen uebrigens 12.5 MILLIONEN/s.
Und ein LPC4370 gar 80! (und hat noch EINEN M4-Kern mehr!)
Aber nicht fuer einen Euro. Gottseidank moechte man fast sagen.

Oben erwaehnte wirkliche alte PIC schaffen bei Einhaltung
der Zeitbedingungen nach dem Datenblatt immerhin noch ca.
EINHUNDERTTAUSEND per Sekunde. Und kosten je nach Quelle
nur 30-40 Ct! Und brauchen kein Averaging.

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb im Beitrag #7003789 (saudumme Angabe, besser wäre: 
14.03.2022 20:02):
> In Kürze.
> Das offizielle RP2040 datasheet v1.7.1

Ich suchte in dem das ich habe, fand aber keine Versionsnr, nur dies:
Copyright © 2020 Raspberry Pi (Trading) Ltd
build-date: 2021-11-04
build-version: 150df05-clean

Aaah S. 652 ist als 1.7.1 eintragen

>
> S.640 ADC Input Impedance >= 100kΩ

gefunden! Dank!

>
> S.647 Errata: Reference RP2040-E6
Auch gefunden
> Summary GPIO digital inputs not disabled for ADC pins by default
 UPS:
> If the pins are connected to an analogue signal to measure, there could be > 
unexpected signal levels on
> these pads. This is unlikely to cause a problem as the digital inputs have > 
hysteresis enabled by default.
> Workaround
> If analogue inputs are used, the digital input should be disabled as early > as 
possible after startup. This is
> done in the RP2040B2 bootrom and early on in SDK platform setup code on > > 
RP2040B0 and RP2040B1. If
> user wishes to use digital inputs, they must be enabled

Ich hätte erwartet, dass
from machine import ADC, Pin
das macht, weil das ja die Ankündigung ist,dass ich den ADC benutzen 
will. Spätestens beim Aufruf ADC(Pin(xy)) sollte es dann erfolgen.
Wenn's nicht erfolgt, dann betrachte ich die Unterlassung als 
Softwarefehler

>
> Tausend Mal:#!/usr/bin/python3
> anal = adc.read_u16() # Grundwert laden
> for _ in range(1000):
>     anal = 0.99*anal + 0.01*adc.read_u16()
> Gibt einen schönen glatten float Wert. Wenn's etwas träger sein darf
> gerne auch ×0.999  und ×0.001
>
> S.589 DNL error
> Muss man wie gesagt auf die unsigned 16bit Werte von microPython
> umrechnen.
512, 1,536, 2,560, and 3,584 kommen in meinen Werten nicht vor, auch 
nicht wenn ich * 2^4  = * 16 rechne, also 8192, 24576, 40960, 57344

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Ich hätte erwartet, dass
> from machine import ADC, Pin
> das macht, weil das ja die Ankündigung ist,dass ich den ADC benutzen
> will.
Neee, da noch nicht.
> Spätestens beim Aufruf ADC(Pin(xy)) sollte es dann erfolgen.
> Wenn's nicht erfolgt, dann betrachte ich die Unterlassung als
> Softwarefehler
Ganz genau, da müsste es passieren.
Das Gute ist, der kleine Workaround mit mem8 funktioniert 
›One-Wall-Free‹
Selbst wenn die nächste Maskenversion beim Prozessor das Problem schon 
berücksichtigen sollte.

> 512, 1,536, 2,560, and 3,584 kommen in meinen Werten nicht vor, auch
> nicht wenn ich * 2^4  = * 16 rechne, also 8192, 24576, 40960, 57344
Gut, außerhalb dieser Punkte ist der ADC verdammt gut linear.
Und mit ›filtering‹, ›averaging‹ oder ›sliding window‹ eine Freude.
Nebenbei, aus den Dreien kann man übrigens prima Klassen machen.

von Manfred M. (mm_lauf)


Lesenswert?

Jetzt mit Vref:

Mittelwert  21,561
Delta max  9,503
Standardabw  1,474

Welcher Wert real ist, weiß ich nicht. Sensor steht momentan in ca. 300 
g Wasser. Zweck: die realen Änderungen verringern.

Jetzt also zu Norbert Vorschlag von
14.03.2022 18:27

Mein Code nun:

from machine import ADC, Pin
from machine import mem8
PADS_BANK0_BASE = const(0x4001c000)
GPIO26 = const(0x6c)
GPIO27 = const(0x70)
GPIO28 = const(0x74)
GPIO29 = const(0x78)
mem8[PADS_BANK0_BASE + GPIO26] = 1 << 7
mem8[PADS_BANK0_BASE + GPIO27] = 1 << 7
mem8[PADS_BANK0_BASE + GPIO28] = 1 << 7
mem8[PADS_BANK0_BASE + GPIO29] = 1 << 7
i=0
while i<60 :
    adc_0 = ADC(Pin(26))   # create ADC object on ADC pin
    adc_1 = ADC(Pin(27))
    adc_2 = ADC(Pin(28))
    adc_3 = ADC(Pin(29))
    adc_i = machine.ADC(machine.ADC.CORE_TEMP)
    i=i+1
    adc= adc_0.read_u16()
    adc= adc_1.read_u16()
    adc= adc_2.read_u16()
    adc= adc_3.read_u16()
    print(i, adc_0.read_u16(), adc_1.read_u16(), adc_2.read_u16(), 
adc_3.read_u16(), adc_i.read_u16())
    utime.sleep(10)

Ergebnis:
Mittelwert  21,516
Delta max  2,208
Standardabw  0,546

Das sieht richtig gut aus!
Nun werde ich meine Formeln im Excel prüfen und hoffe, dass ich dann 
Norbert ein dickes Lob senden kann -- Schaumermal

von Norbert (Gast)


Lesenswert?

1
#!/usr/bin/python3
2
from machine import ADC, Pin, mem8
3
PADS_BANK0_BASE = const(0x4001c000)
4
GPIO26 = const(0x6c)
5
GPIO27 = const(0x70)
6
GPIO28 = const(0x74)
7
GPIO29 = const(0x78)
8
mem8[PADS_BANK0_BASE + GPIO26] = 1 << 7
9
mem8[PADS_BANK0_BASE + GPIO27] = 1 << 7
10
mem8[PADS_BANK0_BASE + GPIO28] = 1 << 7
11
mem8[PADS_BANK0_BASE + GPIO29] = 1 << 7
12
13
analog = [
14
    ADC(Pin(26)),   
15
    ADC(Pin(27)),
16
    ADC(Pin(28)),
17
    ADC(Pin(29)),
18
    ADC(ADC.CORE_TEMP)
19
]
20
21
for loopcount in range(60):
22
    for index in range(5):
23
        avg = analog[index]
24
        for _ in range(1000):
25
            avg = 0.99*avg + 0.01*analog[index]
26
        print('{:10.3f}'.format(avg), end=' ')
27
    print()
28
    utime.sleep(10)

Nur so aus dem Kopf, Syntax ungeprüft.

von Manfred M. (mm_lauf)


Lesenswert?

Wolfgang schrieb:
> Manfred M. schrieb:
>> ABER das Problem mit den Schwankungen ist nicht weg.
>
> Um deine Störquellen zu trennen, schmeiß doch erstmal den Pt1000 raus
> und setze statt dessen einen 1kΩ Widerstand ohne die lange Leitung rein.

Guter Tipp.. So sollte man einen Fehler suchen: Erst mal die 
Fehlerquellen wegwerfen und das ganze auf des Pudel Kern reduzieren, 
,dann ausbauen
>
> Außerdem sehe immer noch keinen Kondensator,##

Wie ich schon schrieb: Hier gibt es keine Kondensatoren, die zum 
Erweitern der Schaltung geeignet wären

> weder auf den 5.1V noch am
> ADC-Eingang. Wie sind die 5.1V vom Digitalkram entkoppelt.

Keine Ahnung. Es sind wahrscheinlich die 5.1 V vom Netzteil (via 
USB-Anschluss), die das board  an Pin 40 (VBUS) weitergibt (oder ist da 
noch etwas dazwischen?)


> Sitzt da
> irgendein vernünftiges Filter zwischen?
Frag mal beim Hersteller des Boards nach. Ich kenne keinen Schaltplan 
von dem Teil.

Besonderen Dank für den Hinweis auf die Vereinfachung der Schaltung!

VG
MM

von Alois (Gast)


Angehängte Dateien:

Lesenswert?

Kuck da: 
https://proto-pic.co.uk/wp-content/uploads/2021/03/RPI-PICO-R3-PUBLIC-SCHEMATIC.pdf

"For best performance use external 3.0V shunt ref (eg. LM4040)

For lower offset (at expense of noise) connect VREF to 3V3 with lower 
resistance"

Versuche es mal mit einem 'geeigneten' C an VREF.

Aber ich wiederhole mich ...

von kikeriki (Gast)


Lesenswert?

Manfred M. schrieb:
> Hier gibt es keine Kondensatoren, die zum
> Erweitern der Schaltung geeignet wären

Diverse Cs sind doch unverzichtbares Hühnerfutter für alles
- ganz egal ob Analog- oder Digitalteil. Dringend besorgen...

von Manfred M. (mm_lauf)


Lesenswert?

@Alois
Dank für den Hinweis auf RPI-PICO-R3-PUBLIC-SCHEMATIC.pdf

Was Du mir mit der Belehrung "ratiometrisch" betreffend, mitteilen 
willst, habe ich nicht erkannt. Ich kannte das Wort nicht, habe bei 
Wikipedia nachgesehen und festgestellt: Das Prinzip kenne ich sehr wohl, 
besonders hinsichtlich der Eliminierung von Störungen beim Messen 
mittels ADC. Es war ca. 1982 als ich erstmals mit AD-Wandlung zu tun 
hatte, aber bereits davor das Problem kannte, Störungen in elektrischen 
Netzen zu beseitigen. Das war die Zeit als HIFI-Anlagen einen Hype 
hatten und Netzbrumm immer ein Problem war. Etwas später haben wir bei 
einer Firma über einige 100 Meter Daten von einem Kleinrechner (Damals 
mit Z80) zu einem größeren übertragen. Die Leitung (Telefon) hing in 
einem Maschendrahtzaun. Immer wenn ein Gewitter in der Nähe war haben 
die Eingänge  der V.24 Blasen bekommen. Als habe ich eine symmetrische 
Beschaltung davor installiert. Dann war ich in einer Fa. die mit Strom 
Tonnen mit flüssigem Stahl aufheizte. Der war dann in  einem großen 
Kübel (sog. Pfanne) und mittels einem Thermoelement wurde die Temp. des 
Stahls gemessen. Da gab es Rechner mit AD-Wandlern. Und wie haben wir 
die Störungen auf Leitungen beherscht? 2mA Stromschleife ist ein 
mögliche Lösung. Oder AD-Wandler mit symmetrischen Eingängen (nennt man 
Differenzmessung) benutzen.
In einem Betrieb dessen Gelände einige qkm groß ist kann man in flsch 
verschalteten Abschirmungen ordentlich große Ströme haben
......

von Manfred M. (mm_lauf)


Lesenswert?

20 mA Stromschleife und nicht 2 mA

von Manfred M. (mm_lauf)


Lesenswert?

Das ist die aktuelle Schaltung:

              R1                 R2
          |---------|       |----------|
GND ------| Pt1000  |-------| 3257 Ohm |------- 3,3 V (PIN36)
          |---------|   ^   |----------|
              U1        |       U2
                        |
GND ----------------  ADC

Kondensatoren hab ich hier keine (vielleicht bald)

So sehen jetzt die Zusammenfassungen der Messwert von 3 Sensoren aus, 
die im gleichen Glas mit Wasser stehen. Es wurden 60 Messungen in 
Abstand von 10 sek ausgewertet (umgerechnet in °C).

Mittelw 21,3
Stdabw 1,8
Max 27,5
Min 16,6
Delta 11,0

Mittelw 21,7
Stdabw 1,1
Max 26,5
Min 18,0
Delta 8,4

Mittelw  21,5
Stdabw 1,4
Max 24,3
Min 17,0
Delta 7,3

Obwohl die Mittelwerte nahe zusammen sind, irritieren mich die Deltas = 
Max - Min. Diese sehen also nicht mehr so gut aus wie es schon mal war.
Als nächstes ersetze ich die Pt1000 durch "normale" Widerstände

von Manfred M. (mm_lauf)


Lesenswert?

off topic:

Ich beobachtete nebenbei:
Northrop Grumman RQ-4B Global Hawk
REGISTRATION 10-2045
ALTITUDE 16,154 m

Diese startete auf Sizilien, flog Schleifen über dem schwarzen Meer, ist 
dann ab Constanta über Rumänien in ca. 50 km Abstand zur Grenze entlang 
von Moldavien und der Ukraine geflogen und fliegt jetzt wieder Schleifen 
über Polen zwischen Rzezwo und Siedlce

von Stefan (Gast)


Lesenswert?

Manfred M. schrieb:
> Das ist die aktuelle Schaltung:
>           R1                 R2
>       |---------|       |----------|
>
> GND ------| Pt1000  |-------| 3257 Ohm |------- 3,3 V (PIN36)
> |---------|   ^   |----------|
> U1        |       U2
> |
> GND ----------------  ADC
> Kondensatoren hab ich hier keine (vielleicht bald)

Besorg dir Kondensatoren, neu oder aus Elektronikschrott.

Berücksichtige MaWins Beitrag vom 14.03.2022 13:03:

MaWin schrieb:
> da ratiometrisch gemessen wird WENN DU DIE GEFILTERTEN 3.3V an AREF als
> Quelle für deinen Pt1000 Spannungsteiler verwendest und nicht die
> gestörte 3.3V VCC Betriebsspannung des rPiPico.

Mittel über viel mehr Messungen, das kostet doch nichts.
Ich würde versuchen über eine Netzperiode von 20 ms (oder ein Vielfaches 
davon) so viele Messungen wie möglich zu machen, alle Werte zu addieren 
und am Schluss durch die Anzahl der Messungen zu teilen.

von Norbert (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal eine Messung mit dem RP2040 ADC unter den denkbar schlechtesten 
Bedingungen.
Breadboard, lange Drähte, direkt und nahe neben zwei Monitoren, 
Spannungsteiler aus einem Kohle- und einem Metallfilmwiderstand.
Software auf dem Controller: Python, Mittelwerte und Sliding Window.

Skalierung auf den Bereich 0.0 … 4095.0, aber float um die Feinheiten zu 
erkennen.
Der erste sanfte Hügel ist eine Berührung mit dem Finger 
(Metallfilm-Widerstand)
Der zweite giftige Hügel ist eine Berührung mit dem Finger 
(Kohleschicht-Widerstand)
Man kann sehr schön sehen wie der Körper als Antenne wirkt.
Alles vor dem ersten Bump ist normale Messung, Variation ungefähr im 
Bereich unterhalb eines zehntel Bits.
Oh ja, Zeitraster. Ungefähr 16,6ms pro Messung von 1000 Werten plus 
Mittelwertbildung und ›Sliding Window‹ (100).

von m.n. (Gast)


Lesenswert?

Norbert schrieb:
> Oh ja, Zeitraster. Ungefähr 16,6ms pro Messung von 1000 Werten plus
> Mittelwertbildung und ›Sliding Window‹ (100).

1000 Messungen, um einen Messwert zu erhalten? Immer dieser 
Arduino/Python/Bastler-Müll.
Wenn die erwarteten Werte nicht stabil sind, wird mit Kondensatoren, 
Drosseln oder Filtern um sich geworfen, anstatt sich um die Ursachen zu 
kümmern.

Manfred M. schrieb:
> Ich beobachtete nebenbei:

Das interssiert niemanden. Informiere Dich über ratiometrische Messung 
(auf deutsch auch Verhältnismessung), schalte zwei gleiche 1 k 
Widerstände als Spannungsteiler zwischen GND und ADC_VREF und den 
Mittelabgriff an einen ADC-Eingang. Der zu erwartende ADC-Wert ist 2048 
und sollte trotz ADC-Macken stabil sein.
Und dann berichte, wie die Ergebnisse einzelner Messungen aussehen.

Manfred M. schrieb:
> Keine Ahnung. Es sind wahrscheinlich die 5.1 V vom Netzteil (via
> USB-Anschluss), die das board  an Pin 40 (VBUS) weitergibt (oder ist da
> noch etwas dazwischen?)

Das ist schon mal keine ratiometrische Messung sondern eine Katastrophe.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Wenn man sich mal fertige ADC für Meßaufgaben anschaut, dann sieht man 
schön, daß da doch einiger Aufwand für genaue Messungen getrieben wird.
Z.B. im AD7793 ist eine Konstantstromquelle integriert, die den RTD und 
den Referenzwiderstand speist. Der Referenzwiderstand sollte 
vorzugsweise einen geringen TK haben (<=5ppm/°C).
Die Messung erfolgt ratiometrisch, d.h. der ADC liefert das Verhältnis 
der beiden Spannungen:
ADC_val = ADC_max * V_RTD / V_R_REF.
Und da beide vom gleichen Strom durchflossen werden:
ADC_val = ADC_max * R_RTD / R_REF.
D.h. alle Einflußfaktoren kürzen sich heraus und nur der 
Referenzwiderstand bleibt übrig.

von m.n. (Gast)


Lesenswert?

Da muß garkein großer Aufwand getrieben werden.
Hier ein Beispiel für ratiometrische PT1000 Messung mit einem ATmega328 
und nachfolgend der Code für Arduino UNO: 
Beitrag "PT1000, einfache Auswertung mit AVR (ATmega328)"

Nach Initialisierung des ADCs ist nur eine einzige Messung für ein 
stabiles Ergebnis notwendig. Und wenn man das Programm nicht nur 
oberflächlich versteht, sieht man auch, daß keine Eigenerwärmung des 
PT1000 stattfindet.

von Norbert (Gast)


Lesenswert?

m.n. schrieb:
Unsinn. Eine Menge davon … Ernsthaft, eine gewaltige Menge Unsinn.

Wenn du nicht lesen (oder nicht verstehen) kannst das ich vom denkbar 
schlechtesten Aufbau geredet hatte, dann solltest du dir deine Ergüsse 
besser für eine Kasper-Show sparen.

Außerdem schrieb ich … mal sehen … ach ja:
Variation ungefähr im Bereich unterhalb eines zehntel Bits.

Und also abschließende Bemerkung, mir erschließt sich nicht 
vollumfänglich was die benutzte Programmiersprache mit der Hardware 
eines ADC zu tun hat.

von Manfred M. (mm_lauf)


Lesenswert?

Sollte ich mir einen LM4040 beschaffen? Den versorge ich aus Pin36 (3V3) 
des Pico-Boards und benutze seinen Ausgang dann als Stromquelle für 
meine Widerstand-PT1000-Kette?

Aus der Zeit, in der ich einen "PC" bastelte, habe ich noch ein Oszi (70 
MHz von HAMEG). Sollte ich mal einige Spannungen genauer ansehen? Ich 
suchte nach einer CLK-rate (ohne dass ich versuchen würde das Teil höher 
zu takten), fand 12 MHz. Richtig? Up to 133 MHz; hmm, Faktor 10, nicht 
schlecht.

Kondensatoren an die ADC-Eingänge (also z.B. zwischen Pin 31 und GND)? 
Kondensatoren habe ich sicher noch solche, die damals(!) an VCC der 
TTL-Chips angebracht wurden, wahrscheinlich auch andere. C momentan 
unbekannt.

Stromversorgung erfolgt über USB eines Note-Books (wie sonst könnte es 
sein?)
Verbindungen auf einem Breadboard erstelle ich mit 20 cm langen Jumpern.

Schade ist, dass Schwankungen nicht so klein blieben wie sie schon mal 
waren (s. 14.03.2022 23:32). Warum waren sie bereits mal klein? Warum 
Änderung?  :-(

60 Messungen mit R = 1k509 statt Pt 1000 ergeben (gem. Spannung über R 
und errechneter Widerstand), Stromquelle war 3V3 (gemessen: 3V267) an 
Pin 36 des
"Boards".

Mittelw  1,044 V 1549 Ohm
Stdabw   0,004 V    8 Ohm
Max      1,051 V 1564 Ohm
Min      1,037 V 1535 Ohm
Delta    0,014 V   30 Ohm

Bitte entschuldigt die Änderung der Schriftgröße; ich bekam das nicht 
weg :- (

-----------------------
nebenbei: Die o.g. Drohne flog inzw. wieder nach Sizilien. Ein 
Stratotanker flog Schleifen etwas östl. von Brasov, flog auch zurück 
(kam aus Ramstein). Eine Boeing RC-135V Rivet Joint fliegt nach Osten, 
wird wahrscheinlich über östlichem Polen Schleifen fliegen.
----------------------

von Koller (Gast)


Lesenswert?

Manfred M. schrieb:
> Kondensatoren an die ADC-Eingänge (also z.B. zwischen Pin 31 und GND)?
> Kondensatoren habe ich sicher noch solche, die damals(!) an VCC der
> TTL-Chips angebracht wurden, wahrscheinlich auch andere. C momentan
> unbekannt.

Ja versuche es damit, die Werte waren typischerweise entweder 100nF oder 
10nF.

> Stromversorgung erfolgt über USB eines Note-Books (wie sonst könnte es
> sein?)
> Verbindungen auf einem Breadboard erstelle ich mit 20 cm langen Jumpern.

Für welche Verbindung sind da noch Jumperkabel notwendig? Die 2 
Widerstände des Spannungsteilers können doch direkt gesteckt werden. Der 
PT1000 kommt erst später wieder ins Spiel.

> 60 Messungen mit R = 1k509 statt Pt 1000 ergeben (gem. Spannung über R
> und errechneter Widerstand), Stromquelle war 3V3 (gemessen: 3V267) an
> Pin 36 des
> "Boards".

Irgendwie scheinst du sehr selektiv zu lesen, oder vielleicht auch gar 
nicht. Dir wurde schon mehrfach gesagt, daß bei einer ratiometrischen 
Messung der Spannungsteiler und die Analogreferenz von der gleichen 
Quelle versorgt werden sollen. Also gehört der Spannungsteiler an Pin 35 
des Boards (ADC_VREF)!

> Mittelw  1,044 V 1549 Ohm
> Stdabw   0,004 V    8 Ohm
> Max      1,051 V 1564 Ohm
> Min      1,037 V 1535 Ohm
> Delta    0,014 V   30 Ohm

Du solltest hier auch die Rohwerte mitliefern. Dann bekommt man einen 
schnelleren Überblick wie sehr die ADC Messwerte schwanken.

von Manfred M. (mm_lauf)


Lesenswert?

Koller schrieb im Beitrag #7005182 (16.03.2022 13:11):

Erst mal hierzu, dann folgt noch ein Foto, damit die alle die mir helfen 
wollen, sehen können was ich zusammengesteckt habe.

> Manfred M. schrieb:
>> Kondensatoren an die ADC-Eingänge (also z.B. zwischen Pin 31 und GND)?
>> Kondensatoren habe ich sicher noch solche, die damals(!) an VCC der
>> TTL-Chips angebracht wurden, wahrscheinlich auch andere. C momentan
>> unbekannt.
>
> Ja versuche es damit, die Werte waren typischerweise entweder 100nF oder
> 10nF.
OK

>
>> Stromversorgung erfolgt über USB eines Note-Books (wie sonst könnte es
>> sein?)
>> Verbindungen auf einem Breadboard erstelle ich mit 20 cm langen Jumpern.
>
> Für welche Verbindung sind da noch Jumperkabel notwendig? Die 2
> Widerstände des Spannungsteilers können doch direkt gesteckt werden.

"direkt" heißt was? Wohin direkt?

> Der
> PT1000 kommt erst später wieder ins Spiel.
>
>> 60 Messungen mit R = 1k509 statt Pt 1000 ergeben (gem. Spannung über R
>> und errechneter Widerstand), Stromquelle war 3V3 (gemessen: 3V267) an
>> Pin 36 des
>> "Boards".
>
> Irgendwie scheinst du sehr selektiv zu lesen, oder vielleicht auch gar
> nicht.

Eine Psychoanalyse hilft mir nicht weiter. Sicherlich übersehe ich 
manches oder vergesse es wieder.

> Dir wurde schon mehrfach gesagt, daß bei einer ratiometrischen
> Messung der Spannungsteiler und die Analogreferenz von der gleichen
> Quelle versorgt werden sollen. Also gehört der Spannungsteiler an Pin 35
> des Boards (ADC_VREF)!
Hatte ich bereits, dadurch brach die Spannung an ADC_REF erheblich ein 
s. Bild, das Alois um 15.03.2022 02:57 sendete: 150 mikroA.
Ich will 3 PT1000 verwenden.

>
>> Mittelw  1,044 V 1549 Ohm
>> Stdabw   0,004 V    8 Ohm
>> Max      1,051 V 1564 Ohm
>> Min      1,037 V 1535 Ohm
>> Delta    0,014 V   30 Ohm
>
> Du solltest hier auch die Rohwerte mitliefern. Dann bekommt man einen
> schnelleren Überblick wie sehr die ADC Messwerte schwanken.

OK, kommt also dann , aber als nächstes erst mal in Foto.

von Manfred M. (mm_lauf)


Angehängte Dateien:

Lesenswert?

Nun also Foto. Ein Labor habe ich hier leider nicht :-((

VG
MM

von m.n. (Gast)


Lesenswert?

Manfred M. schrieb:
> Sollte ich mir einen LM4040 beschaffen?

Nein. Statt einzukaufen solltest Du Deinen Kopf gebrauchen. Es ist ja 
bereits alles gesagt.

Norbert schrieb:
> das ich vom denkbar
> schlechtesten Aufbau geredet hatte,

Daß stimmt nicht. Mit einem PT1000 ist die ganze Schaltung so 
niederohmig, daß nicht einmal ein Abblockkondensator am ADC-Eingang 
notwendig ist.
Noch etwas: wenn ich die aktuelle Aussentemperatur wissen möchte, nehme 
ich nicht den Mittelwert der letzten 1000 Tage auch wenn das Ergebnis 
dadurch auf 1 mK genau wäre ;-)

von Manfred M. (mm_lauf)


Lesenswert?

Werte einer Messung wobei die Sensoren durch R mit ca. 3k3 ersetzt 
wurden,
 bei den hier gesendeten Werten war es einer mit  3248 Ohm



20581
20613
20741
20693
20773
20613
20565
20773
20597
20677
20789
20677
20773
20629
20757
20693
20773
20613
20789
20645
20693
20629
20757
20597
20629
20709
20581
20581
20709
20581
20741
20565
20693
20693
20613
20789
20677
20629
20581
20597
20789
20613
20661
20773
20613
20773
20629
20693
20709
20613
20741
20789
20629
20693
20773
20533
20773
20789
20613
20773

von Peter D. (peda)


Lesenswert?

Manfred M. schrieb:
> Nun also Foto.

Das sind ja geschirmte Sensoren. Den Schirm einfach mit auf GND legen, 
dann kommt nichts von außen rein.

Ein USB-Netzteil 5V würde ich aber nicht als Analogversorgung nehmen. Da 
sollte wenigstens ein 3,3V Linearregler dahinter.
Was so ein Pi an digitalem Störnebel selber erzeugt, weiß ich nicht.
Ich nehme für Analogkrams lieber störarme AVRs. Die kann man sogar 
wärend der AD-Wandlung anhalten (ADC Noise Reduction).

von Norbert (Gast)


Lesenswert?

m.n. schrieb:
> Noch etwas: wenn ich die aktuelle Aussentemperatur wissen möchte, nehme
> ich nicht den Mittelwert der letzten 1000 Tage auch wenn das Ergebnis
> dadurch auf 1 mK genau wäre ;-)
Das sei dir gegönnt.

Aber, wenn 1000 samples etwa 12ms dauern, warum nicht?
Ändert sich die Temperatur innerhalb dieser 12ms derart signifikant?
Zumindest habe ich einen Messwert der wirklich fest steht und auch den 
einen  oder anderen gelegentlichen Spike überlebt.
Der Prozessor ist gekauft, da kann er auch ein wenig arbeiten. Gut, die 
Stromaufnahme wird sich um mehrere µA erhöhen. Sei's drum.

von Peter D. (peda)


Lesenswert?

Norbert schrieb:
> Aber, wenn 1000 samples etwa 12ms dauern, warum nicht?

Ungünstig. Ich teile das Meßintervall immer so auf, daß es genau 20ms 
sind. Damit erreicht man eine gute 50Hz Unterdrückung.
Z.B. für den Mittelwert aus 256 Messungen setze ich den Timerinterrupt 
zum Starten des ADC auf 78µs.

von Manfred M. (mm_lauf)


Lesenswert?

m.n. schrieb:
> Manfred M. schrieb:
>> Sollte ich mir einen LM4040 beschaffen?
>
> Nein. Statt einzukaufen solltest Du Deinen Kopf gebrauchen.

Ach je, auch das noch. Glaubt ich doch der Pico würde das ersetzen ;-)

> Es ist ja
> bereits alles gesagt.
>
> Norbert schrieb:
>> das ich vom denkbar
>> schlechtesten Aufbau geredet hatte,
>
> Daß stimmt nicht. Mit einem PT1000 ist die ganze Schaltung so
> niederohmig, daß nicht einmal ein Abblockkondensator am ADC-Eingang
> notwendig ist.
Dann könnte ich mir also das Fahren zum Holen von Kondensatoren sparen?

> Noch etwas: wenn ich die aktuelle Aussentemperatur wissen möchte, nehme
> ich nicht den Mittelwert der letzten 1000 Tage auch wenn das Ergebnis
> dadurch auf 1 mK genau wäre ;-)
 Darauf wär ich nicht gekommen. Also: Kopf gebrauchen! ;-)

von Manfred M. (mm_lauf)


Lesenswert?

Peter D. schrieb:
> Manfred M. schrieb:
>> Nun also Foto.
>
> Das sind ja geschirmte Sensoren. Den Schirm einfach mit auf GND legen,
> dann kommt nichts von außen rein.
Hatte ich bereit gemacht. Folge: Keine wesentliche Änderung. Aber nun 
bin ich ja bei Widerständen, mit denen ich die PT1000 an den 
Schraubklemmen ersetzte
>
> Ein USB-Netzteil 5V würde ich aber nicht als Analogversorgung nehmen. Da
> sollte wenigstens ein 3,3V Linearregler dahinter.

Ich nehme z.Zt. 3V3 aus Pin36 weil diese mit bis zu 300mA belastbar 
sind. Wie belastbar ist Pin35 (ADC_REF)?

von m.n. (Gast)


Lesenswert?

Manfred M. schrieb:
> bei den hier gesendeten Werten war es einer mit  3248 Ohm
>
> 20581
> 20613
> 20741
> 20693
> 20773
> 20613

Was soll man mit diesen Zahlen anfangen?
Der Pico hat ein 12 Bit ADC. Der max. mögliche Ausgangswert ist 4095.

Manfred M. schrieb:
> Dipl. Math. mit Nebenfächern Physik und Informatik
> Meine ersten "PC" habe ich selbst gebaut, aber vor 40 Jahren

Tut mir Leid. Aber da erwarte ich doch etwas mehr Substanz!

von Norbert (Gast)


Angehängte Dateien:

Lesenswert?

Peter D. schrieb:
> Ich teile das Meßintervall immer so auf, daß es genau 20ms
> sind. Damit erreicht man eine gute 50Hz Unterdrückung.
> Z.B. für den Mittelwert aus 256 Messungen setze ich den Timerinterrupt
> zum Starten des ADC auf 78µs.

Kann man machen, wirkt sich hier aber weniger aus, da Python nicht µs 
genau den ADC liest. (Solange man nicht DMA nutzt!)
Der ADC könnte 500ksps, µPython schafft mit Polling nur ~80 ksps.
Wer damit spielen möchte, ich habe von diesem schlimmen Breadboard 
Aufbau mal 80000 Werte gelesen und nur aus dem Bereich 0 … 65535 in den 
Bereich 0 … 4095 zurück skaliert.
Das ist übrigens etwas das ich wirklich dämlich an embedded Python 
finde. Es wird ohne guten Grund der gelesene 12bit Wert auf 16bit 
hochskaliert. 33.3% mehr Platzverbrauch für nichts.

von Zeno (Gast)


Lesenswert?

Manfred M. schrieb:
> Werte einer Messung wobei die Sensoren durch R mit ca. 3k3 ersetzt
> wurden,
>  bei den hier gesendeten Werten war es einer mit  3248 Ohm
>
> 20581
> 20613
> 20741
> 20693
> 20773
> 20613
> 20565 .....

Wenn die Werte mit Festwiderständen schon derartig schwanken, dann ist 
da was oberfaul.
Entweder der windige Aufbau auf dem Steckbrett oder Dein 
Berechnungsalgorithmus ist fehlerhaft.
Du bist ganz gewiß nicht der erste der ein Thermometer mit Pt1000 baut.

von Manfred M. (mm_lauf)


Lesenswert?

m.n. schrieb:
> Manfred M. schrieb:

>> bei den hier gesendeten Werten war es einer mit  3248 Ohm
>>
>> 20581
>> 20613
>> 20741
>> 20693
>> 20773
>> 20613
>
> Was soll man mit diesen Zahlen anfangen?

s. Koller schrieb im Beitrag #7005182 (16.03.2022 13:11)
> Du solltest hier auch die Rohwerte mitliefern. Dann bekommt man einen
> schnelleren Überblick wie sehr die ADC Messwerte schwanken.

deshalb sendete ich die Werte.

> Der Pico hat ein 12 Bit ADC. Der max. mögliche Ausgangswert ist 4095.
>
> Manfred M. schrieb:
>> Dipl. Math. mit Nebenfächern Physik und Informatik
>> Meinen ersten "PC" habe ich selbst gebaut, aber vor 40 Jahren
>
> Tut mir Leid. Aber da erwarte ich doch etwas mehr Substanz!

Wart ab bis Du älter geworden bist

Ich hoffe auf fachlich gute Tipps, so wie sie z.B. Norbert sendet, auch 
etwas Geduld (dazu ist vielleicht hier und da mal eine Wiederholung 
nötig).

Aber ganz sicher erwarte ich Höflichkeit.

von Manfred M. (mm_lauf)


Lesenswert?

m.n. schrieb:
> Manfred M. schrieb:
>> bei den hier gesendeten Werten war es einer mit  3248 Ohm
>>
>> 20581
>> 20613
>> 20741
>> 20693
>> 20773
>> 20613
>
> Was soll man mit diesen Zahlen anfangen?
> Der Pico hat ein 12 Bit ADC. Der max. mögliche Ausgangswert ist 4095.

Man sieht aus den Rohwerten, die ich postete, dass der PICO etwas 
anderes liefert.
Melde Dich wieder, wenn Du mehr weißt als jetzt

von Koller (Gast)


Lesenswert?

Manfred M. schrieb:
>> Für welche Verbindung sind da noch Jumperkabel notwendig? Die 2
>> Widerstände des Spannungsteilers können doch direkt gesteckt werden.
>
> "direkt" heißt was? Wohin direkt?

Direkt heißt, den Anschlussdraht des Widerstandes direkt in dein 
Steckbrett neben den entsprechenden Pin des Pico. Ich hoffe du gehst mit 
dem Spannungsteiler auch direkt auf den AGND (Pin 33).

>> Dir wurde schon mehrfach gesagt, daß bei einer ratiometrischen
>> Messung der Spannungsteiler und die Analogreferenz von der gleichen
>> Quelle versorgt werden sollen. Also gehört der Spannungsteiler an Pin 35
>> des Boards (ADC_VREF)!
> Hatte ich bereits, dadurch brach die Spannung an ADC_REF erheblich ein
> s. Bild, das Alois um 15.03.2022 02:57 sendete: 150 mikroA.

Das ist doch gerade der Vorteil der ratiometrischen Messung, daß die 
Spannung nicht in das Ergebnis eingeht. Ob nun Vref 3,3V oder nur 2,9V 
beträgt ist egal, wenn du nicht noch zusätzlich eine Absolutmessung 
benötigst. Schreibe dir mal die Spannungsteilerformel auf, und die 
Umrechnung auf ADC Werte, dann siehst du, daß sich Vref herauskürzt. 
Also juckt dein beobachteter Spannungseinbruch nicht, solange die 
Spannung während jeder ADC Einzelmessung stabil ist.

> Ich will 3 PT1000 verwenden.

Jetzt geht es doch erstmal darum, Messungen ohne allzugroße Schwankungen 
hinzubekommen, bzw. Störursachen auszuschließen. Also lass die PT1000 
weg, und arbeite zum Testen mit Festwiderständen.

m.n. schrieb:
> Daß stimmt nicht. Mit einem PT1000 ist die ganze Schaltung so
> niederohmig, daß nicht einmal ein Abblockkondensator am ADC-Eingang
> notwendig ist.

Du meinst also, daß der gezeigte Aufbau HF-mäßig niederohmig ist. Wenn 
du dich da mal nicht täuscht.

Manfred M. schrieb:
> m.n. schrieb:
>> Manfred M. schrieb:
>
>>> bei den hier gesendeten Werten war es einer mit  3248 Ohm
>>>
>>> 20581
>>> 20613
>>> 20741
>>> 20693
>>> 20773
>>> 20613
>>
>> Was soll man mit diesen Zahlen anfangen?
>
> s. Koller schrieb im Beitrag #7005182 (16.03.2022 13:11)
>> Du solltest hier auch die Rohwerte mitliefern. Dann bekommt man einen
>> schnelleren Überblick wie sehr die ADC Messwerte schwanken.
>
> deshalb sendete ich die Werte.

Und gemeint habe ich, daß du bei deiner Übersicht (Mittelwert, Min, Max 
..) die dazugehörigen Rohwerte hinschreibst.

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Man sieht aus den Rohwerten, die ich postete, dass der PICO etwas
> anderes liefert.
Ja, das ist nicht ganz korrekt. Der Pico-ADC (die Hardware) hat 
tatsächlich nur 12 bit Auflösung.
microPython skaliert den Wert hoch:
1
resultat = int(ADC<<4 + ADC>>8)
Das bringt die Werte von 0…4095 in den Bereich 0…65535.
Unnötigerweise wie ich hinzu fügen möchte.

von Manfred M. (mm_lauf)


Lesenswert?

Zeno schrieb:
> Manfred M. schrieb:
>> Werte einer Messung wobei die Sensoren durch R mit ca. 3k3 ersetzt
>> wurden,
>>  bei den hier gesendeten Werten war es einer mit  3248 Ohm
>>
>> 20581
>> 20613
>> 20741
>> 20693
>> 20773
>> 20613
>> 20565 .....
>
> Wenn die Werte mit Festwiderständen schon derartig schwanken, dann ist
> da was oberfaul.
Vermute ich auch, ABER was? Ich sollte wohl mal mein Oszi auspacken?

> Entweder der windige Aufbau auf dem Steckbrett oder Dein
> Berechnungsalgorithmus ist fehlerhaft.
Ich sendete als letztes Rohwerte wegen Hinweis von Koller
Er schrieb im Beitrag #7005182 (16.03.2022 13:11)
> Du solltest hier auch die Rohwerte mitliefern. Dann bekommt man einen
> schnelleren Überblick wie sehr die ADC Messwerte schwanken.

> Du bist ganz gewiß nicht der erste der ein Thermometer mit Pt1000 baut.

Nehme auch ich an. Aber wer hat da mal möglichst genau hingesehen?
Für mich ist es selbstverständlich, dass ich mir mal auch die 
Wiederholgenauigkeit ansehe. Und dann habe ich mich doch etwas 
gewundert.

von Norbert (Gast)


Lesenswert?

Hab mir Manfreds Werte mal angesehen. Sehen auch nicht wesentlich 
schlechter aus als das was STM mit den 12bit ADCs des 32F407 Discovery 
bietet.
Zur Referenz von damals:
STM32 ADC Verhalten eigentümlich
Beitrag "STM32 ADC Verhalten eigentümlich"

von Manfred M. (mm_lauf)


Lesenswert?

Koller schrieb:
> Manfred M. schrieb:
>>> Für welche Verbindung sind da noch Jumperkabel notwendig? Die 2
>>> Widerstände des Spannungsteilers können doch direkt gesteckt werden.
>>
>> "direkt" heißt was? Wohin direkt?
>
> Direkt heißt, den Anschlussdraht des Widerstandes direkt in dein
> Steckbrett neben den entsprechenden Pin des Pico. Ich hoffe du gehst mit
> dem Spannungsteiler auch direkt auf den AGND (Pin 33).
Ne, sondern Pin 38
>
>>> Dir wurde schon mehrfach gesagt, daß bei einer ratiometrischen
>>> Messung der Spannungsteiler und die Analogreferenz von der gleichen
>>> Quelle versorgt werden sollen. Also gehört der Spannungsteiler an Pin 35
>>> des Boards (ADC_VREF)!
>> Hatte ich bereits, dadurch brach die Spannung an ADC_REF erheblich ein
>> s. Bild, das Alois um 15.03.2022 02:57 sendete: 150 mikroA.
>
> Das ist doch gerade der Vorteil der ratiometrischen Messung, daß die
> Spannung nicht in das Ergebnis eingeht. Ob nun Vref 3,3V oder nur 2,9V
> beträgt ist egal, wenn du nicht noch zusätzlich eine Absolutmessung
> benötigst. Schreibe dir mal die Spannungsteilerformel auf, und die
> Umrechnung auf ADC Werte, dann siehst du, daß sich Vref herauskürzt.
> Also juckt dein beobachteter Spannungseinbruch nicht, solange die
> Spannung während jeder ADC Einzelmessung stabil ist.

Richtig, aber ich wollte diesen Ausgang nicht überlasten.

>
>> Ich will 3 PT1000 verwenden.
>
> Jetzt geht es doch erstmal darum, Messungen ohne allzugroße Schwankungen
> hinzubekommen, bzw. Störursachen auszuschließen. Also lass die PT1000
> weg, und arbeite zum Testen mit Festwiderständen.
Habe ich als letzte gemacht, aber mit den Widerständen in den Klemmen.
Wahrscheinlich sollte ich ein besseres Steckbrett benutzen, habe ich 
noch eines ca. 40 Jahre alt. Mit den nun mir bekannten Problemen habe 
ich halt nicht gerechnet.

>
> m.n. schrieb:
>> Daß stimmt nicht. Mit einem PT1000 ist die ganze Schaltung so
>> niederohmig, daß nicht einmal ein Abblockkondensator am ADC-Eingang
>> notwendig ist.
>
> Du meinst also, daß der gezeigte Aufbau HF-mäßig niederohmig ist. Wenn
> du dich da mal nicht täuscht.
das meinte m.n.
>
> Manfred M. schrieb:
>> m.n. schrieb:
>>> Manfred M. schrieb:
>>
>>>> bei den hier gesendeten Werten war es einer mit  3248 Ohm
>>>>
>>>> 20581
>>>> 20613
>>>> 20741
>>>> 20693
>>>> 20773
>>>> 20613
>>>
>>> Was soll man mit diesen Zahlen anfangen?
>>
>> s. Koller schrieb im Beitrag #7005182 (16.03.2022 13:11)
>>> Du solltest hier auch die Rohwerte mitliefern. Dann bekommt man einen
>>> schnelleren Überblick wie sehr die ADC Messwerte schwanken.
>>
>> deshalb sendete ich die Werte.
>
> Und gemeint habe ich, daß du bei deiner Übersicht (Mittelwert, Min, Max
> ..) die dazugehörigen Rohwerte hinschreibst.

Ich habe sie, wie von Dir vorgeschlagen, nachgeliefert. Ich kann aber 
auch mal die Datei mit den Rohwerten aus den 3 ADC, ggf auch aus allen 
5, die abgefragt werden können hierher posten. Soll ich?

Dank für Deine Bemühungen, auch an Norbert!
Es ist erfreulich, dass es hier auch Poster gibt, die nicht trolliges 
schreiben.

von Rüdiger B. (rbruns)


Lesenswert?

Ich weiss warum ich inzwischen 1-Wire sensoren verwende.

von Manfred M. (mm_lauf)


Angehängte Dateien:

Lesenswert?

Hier mal die Tabelle mit der ich die Rohwerte umrechnen lasse

nochmal der Code:
import machine
import utime
from machine import ADC, Pin
from machine import mem8
PADS_BANK0_BASE = const(0x4001c000)
GPIO26 = const(0x6c)
GPIO27 = const(0x70)
GPIO28 = const(0x74)
GPIO29 = const(0x78)
mem8[PADS_BANK0_BASE + GPIO26] = 1 << 7
mem8[PADS_BANK0_BASE + GPIO27] = 1 << 7
mem8[PADS_BANK0_BASE + GPIO28] = 1 << 7
mem8[PADS_BANK0_BASE + GPIO29] = 1 << 7
i=0
while i<60 :
    adc_0 = ADC(Pin(26))   # create ADC object on ADC pin
    adc_1 = ADC(Pin(27))
    adc_2 = ADC(Pin(28))
    adc_3 = ADC(Pin(29))   # Vref ???
    adc_i = machine.ADC(machine.ADC.CORE_TEMP)
    i=i+1
    adc= adc_0.read_u16()
    adc= adc_1.read_u16()
    adc= adc_2.read_u16()
    adc= adc_3.read_u16()
    print(i, adc_0.read_u16(), adc_1.read_u16(), adc_2.read_u16(), 
adc_3.read_u16(), adc_i.read_u16())
    utime.sleep(10)

von Norbert (Gast)


Lesenswert?

Rüdiger B. schrieb:
> Ich weiss warum ich inzwischen 1-Wire sensoren verwende.
Den einen Draht kann man bestimmt gut mit 'nem ADC auslesen…

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Hier mal die Tabelle mit der ich die Rohwerte umrechnen lasse
>     adc_0 = ADC(Pin(26))   # create ADC object on ADC pin
>     adc_1 = ADC(Pin(27))
>     adc_2 = ADC(Pin(28))
>     adc_3 = ADC(Pin(29))   # Vref ???
>     adc_i = ADC(ADC.CORE_TEMP)

Nimm die fünf mal aus der Schleife raus und weiter nach oben.
Die Objekte müssen nur einmal erstellt werden und sind dann beliebig oft 
nutzbar.

Fällt das auch schon unter resourcen-schonendes,
nachhaltiges Programmieren? ;-)

von Norbert (Gast)


Lesenswert?

…und mach' mal ein: import math
Das kleine Ding kann verdammt gut und verdammt schnell rechnen, da 
braucht's kein Spreadsheet eines fragwürdigen Anbieters… Duck und wech'

von Koller (Gast)


Lesenswert?

Manfred M. schrieb:
> Koller schrieb:
>> Manfred M. schrieb:
>>>> Für welche Verbindung sind da noch Jumperkabel notwendig? Die 2
>>>> Widerstände des Spannungsteilers können doch direkt gesteckt werden.
>>>
>>> "direkt" heißt was? Wohin direkt?
>>
>> Direkt heißt, den Anschlussdraht des Widerstandes direkt in dein
>> Steckbrett neben den entsprechenden Pin des Pico. Ich hoffe du gehst mit
>> dem Spannungsteiler auch direkt auf den AGND (Pin 33).
> Ne, sondern Pin 38

Wenn man mit unbekannten Störeinflüssen zu kämpfen hat, dann versucht 
man seinen Aufbau soweit wie möglich zu reduzieren um einen ungestörten 
Betrieb zu erreichen. Wenn das dann der Fall ist, kann man wieder die 
fehlenden Teile hinzufügen.

Also konzentriere dich auf nur einen ADC Kanal, z.B. ADC2, und entferne 
alle weiteren Anschlüsse. Ein Festwiderstand zwischen Pin 35 (ADC_VREF) 
und Pin 34 (ADC2), und ein Festwiderstand zwischen Pin 34 (ADC2) und Pin 
33 (AGND). Damit machst du mal deine Messungen. Wenn damit keine 
ungestörte Messungen möglich sind, dann hast du schlechte Karten für den 
Betrieb mit den PT1000.

>>>> Dir wurde schon mehrfach gesagt, daß bei einer ratiometrischen
>>>> Messung der Spannungsteiler und die Analogreferenz von der gleichen
>>>> Quelle versorgt werden sollen. Also gehört der Spannungsteiler an Pin 35
>>>> des Boards (ADC_VREF)!
>>> Hatte ich bereits, dadurch brach die Spannung an ADC_REF erheblich ein
>>> s. Bild, das Alois um 15.03.2022 02:57 sendete: 150 mikroA.
>>
>> Das ist doch gerade der Vorteil der ratiometrischen Messung, daß die
>> Spannung nicht in das Ergebnis eingeht. Ob nun Vref 3,3V oder nur 2,9V
>> beträgt ist egal, wenn du nicht noch zusätzlich eine Absolutmessung
>> benötigst. Schreibe dir mal die Spannungsteilerformel auf, und die
>> Umrechnung auf ADC Werte, dann siehst du, daß sich Vref herauskürzt.
>> Also juckt dein beobachteter Spannungseinbruch nicht, solange die
>> Spannung während jeder ADC Einzelmessung stabil ist.
>
> Richtig, aber ich wollte diesen Ausgang nicht überlasten.

Schau dir das von Alois gelieferte Bild nochmal an. Für den Prozessor 
ist ADC_VREF ist kein Ausgang sondern ein Eingang, der über 200+1 Ohm an 
den 3,3V hängt und noch etwas gefiltert ist. ADC_VREF ist also schon 
belastbar, der Spannungsabfall an den 200 Ohm darf halt nicht zu hoch 
werden.

von Stefan (Gast)


Lesenswert?

Manfred M. schrieb:
> Sollte ich mir einen LM4040 beschaffen? Den versorge ich aus Pin36 (3V3)
> des Pico-Boards und benutze seinen Ausgang dann als Stromquelle für
> meine Widerstand-PT1000-Kette?

Mach erst einmal das, was Koller im letzten Beitrag geschrieben hat.
Falls du später doch noch einen 3V LM4040 kaufst: das ist ein 
Parallelregler.
Der wird angeschlossen wie eine Z-Diode, Anode an Pin 35 (ADC_VREF) und 
Kathode an AGND (Pin 33) und erzeugt so mit dem 200 Ohm Widerstand auf 
dem Pico stabilisierte 3V an Pin 35 (ADC_VREF), allerdings nur solange, 
wie der Strom für den ADC und an Pin 35 angeschlossene Last nicht zu 
groß wird.

Die wichtigsten Dokumente zum Raspberry Pi Pico und zum RP2040 gibt es 
übrigens auch direkt bei Raspberry Pi: 
https://www.raspberrypi.com/products/raspberry-pi-pico/specifications/
Der Schaltplan findet sich z.B. im Raspberry Pi Pico datasheet.

von m.n. (Gast)


Lesenswert?

Manfred M. schrieb:
> Melde Dich wieder, wenn Du mehr weißt als jetzt

Gut, dann mache ich es mal.
Bei mir schwanken die Werte im Bereich 2063 - 2067. Mit 10 facher 
Mittelwertbildung sind es 2065 +/-1.
Dazu ist alles gesagt worden.

Manfred M. schrieb:
> Es ist erfreulich, dass es hier auch Poster gibt, die nicht trolliges
> schreiben.

Wenn Du es nur bewerten könntest ;-)

von N. M. (mani)


Lesenswert?

Norbert schrieb:
> Das ist übrigens etwas das ich wirklich dämlich an embedded Python
> finde. Es wird ohne guten Grund der gelesene 12bit Wert auf 16bit
> hochskaliert. 33.3% mehr Platzverbrauch für nichts.

Brauchen 12 Bit in Python keine 16 Bit im Speicher?
Wenn doch, macht es vom Platz keinen Unterschied ob auf 16 Bit skaliert 
wird. Es hat dann aber den Vorteil dass es egal wird ob unter der Haube 
ein 8 Bit, ein 12 Bit oder ein 16 Bit Wandler werkelt.

Was mich viel eher wundert... Wenn das wirklich nur eine Skalierung von 
12 auf 16 Bit ist, wie kann dann bei den meisten/allen Werten die 1 
gesetzt sein?

: Bearbeitet durch User
von Norbert (Gast)


Lesenswert?

N. M. schrieb:
> Brauchen 12 Bit in Python keine 16 Bit im Speicher?
> Wenn doch, macht es vom Platz keinen Unterschied ob auf 16 Bit skaliert
> wird.
Bei der Weiterverarbeitung schon. Wenn man 12bit Werte bekäme, dann 
könnte man zB. 16 Stück aufsummieren und bliebe dennoch im 16bit 
Bereich. So aber kommt man ohne Not in den 32bit Bereich. Bei großen 
arrays besonders ärgerlich.

> Es hat dann aber den Vorteil dass es egal wird ob unter der Haube
> ein 8 Bit, ein 12 Bit oder ein 16 Bit Wandler werkelt.
Wenn der Programmierer es nötig hat sich auf so etwas zu verlassen, dann 
sollte er besser weiterhin <das kann hier jeder selbst ausfüllen>

> Was mich viel eher wundert... Wenn das wirklich nur eine Skalierung von
> 12 auf 16 Bit ist, wie kann dann bei den meisten/allen Werten die 1
> gesetzt sein?
Das ist alles noch viel schlimmer. Einen linearen Bereich unsigned int 
0…4095 kann man unmöglich sauber und gleichmäßig in einen Bereich 
unsigned int 0…65535 skalieren.
Wenn man so etwas Dämliches macht, entstehen zwangsläufig fünfzehn 
Diskontinuitäten. Bei der bestmöglichen aller schlechten 
Hochskalierungen findet man diese bei allen 0x1000 weiten Schritten.
Da steigt der Sprung immer einmalig von 16 auf 17.
Wenn man's mal sauber plottet, dann ist eine vormals perfekt gerade 
Steigung nun mit fünfzehn Treppenstufen versehen.
Wie gesagt, nicht nur unnötig sondern maximal blödsinnig.

von Norbert (Gast)


Lesenswert?

N. M. schrieb:
> Was mich viel eher wundert... Wenn das wirklich nur eine Skalierung von
> 12 auf 16 Bit ist, wie kann dann bei den meisten/allen Werten die 1
> gesetzt sein?
Mir fällt gerade auf das ich darauf nicht richtig eingegangen bin.
Dieses Phänomen lässt sich eben genau mit dieser Art der Hochskalierung 
erklären.
Wenn die zu messenden Daten in einem anderen Bereich lägen, würden sie 
plötzlich alle mit anderen Zahlen enden. Grob gesagt, die ersten 256 
enden mit ›0‹, die nächsten 256 mit ›1‹ und so weiter.
Bis zu den letzten 256 welche mit hex ›f‹ enden.

von m.n. (Gast)


Lesenswert?

Norbert schrieb:
> Und also abschließende Bemerkung, mir erschließt sich nicht
> vollumfänglich was die benutzte Programmiersprache mit der Hardware
> eines ADC zu tun hat.

Norbert schrieb:
> Das ist alles noch viel schlimmer.
> ...
> Wie gesagt, nicht nur unnötig sondern maximal blödsinnig.

Jetzt troll ich mich aber endgültig ;-)

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:
> Einen linearen Bereich unsigned int
> 0…4095 kann man unmöglich sauber und gleichmäßig in einen Bereich
> unsigned int 0…65535 skalieren.

Ich verstehe diesen Text nicht, da ich nicht weiß, was mit "sauber" und 
"gleichmäßig" gemeint sein könnte.

Ich kann mir nur vorstellen, dass man mit 16 multipliziert (linksshift 
um 4 bits). Dann hat man 16er Sprünge und die Ergebnisse müssten durch 
16 teilbar sein. Da die Ergebnisse aber nicht einmal alle durch 2 
teilbar sind ...

Als Math würde ich umgangssprachliches "gleichmäßig in "stetig" 
übersetzen, was aber auch nicht passt, weil ja Funktionen auf den 
natürlichen Zahlen niemals stetig sein können. Dann könnt noch linear 
gemeint sein, aber dann ist man eben bei der Teilbarkeit durch 16 (es 
sei denn die letzte 4 bits werden gewürfelt oder irgendwas so ähnliches 
gemacht)

von N. M. (mani)


Lesenswert?

Norbert schrieb:
> Bei der Weiterverarbeitung schon. Wenn man 12bit Werte bekäme, dann
> könnte man zB. 16 Stück aufsummieren und bliebe dennoch im 16bit
> Bereich. So aber kommt man ohne Not in den 32bit Bereich. Bei großen
> arrays besonders ärgerlich.

Man zieht sich also ein komplettes Micropython System rein, hat dann 
aber Probleme wegen 2 Byte mehr 😂

Aber ich gebe dir Recht dass eine normale read() nicht schaden würde 
damit man die Wahl hat. Im Notfall müsste man eine Funktion schreiben wo 
diese Operation halt übernimmt.

Norbert schrieb:
> Das ist alles noch viel schlimmer. Einen linearen Bereich unsigned int
> 0…4095 kann man unmöglich sauber und gleichmäßig in einen Bereich
> unsigned int 0…65535 skalieren.

Verstehe ich nicht ganz. Das ist ja kein krummer Faktor. Das ist einfach 
eine Multiplikation mit 16 oder ein links Shift mit 4. Es werden ja 
einfach die Stufen größer, was ja sein muss. Der Wertebereich wird ja 
größer und es ist weiterhin eine gleichmäßige Verteilung. Deshalb ist es 
ja auch umso Verwunderlicher warum es beim TO Werte gibt wo die unteren 
4 Bits verwenden.

Da gibt es doch ein Problem mit der Skalierung. Das kann so nicht sein.

von Norbert (Gast)


Lesenswert?

Nimm die Werte von 0…4095 und multipliziere sie mit 16.
Das Ergebnis wäre wieder eine stetige Reihe. Die reicht aber dummerweise 
nur bis 4095 × 16 = 65520
Wir wollen aber 65535 erreichen, da sind also noch 15 Punkte zu 
vergeben. Also machen wir alle 256 Eingangswerte einen Sprung von 17 
anstatt 16.
Nun enden wir sauber bei 65535, haben aber 15 Sprünge in der Rampe.

von Norbert (Gast)


Lesenswert?

N. M. schrieb:
> Man zieht sich also ein komplettes Micropython System rein, hat dann
> aber Probleme wegen 2 Byte mehr 😂
Ja im RAM. Bei großen arrays. Irgendwann sind die 200KiB weg. Entweder 
mit einem 50000 array uin32_t oder einem doppelt so großen mit uint16_t.

> Verstehe ich nicht ganz. Das ist ja kein krummer Faktor. Das ist einfach
> eine Multiplikation mit 16 oder ein links Shift mit 4. Es werden ja
> einfach die Stufen größer, was ja sein muss. Der Wertebereich wird ja
> größer und es ist weiterhin eine gleichmäßige Verteilung. Deshalb ist es
> ja auch umso Verwunderlicher warum es beim TO Werte gibt wo die unteren
> 4 Bits verwenden.
>
> Da gibt es doch ein Problem mit der Skalierung. Das kann so nicht sein.

doch, ist krumm.
65535 ÷ 4095 = 16,003663003663
Die Skalierung ist:
1
Resultat = ADC<<4 + ADC>>8

von Manfred M. (mm_lauf)


Lesenswert?

zwischen 0 und 65535 sind 2^16 schritte

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> zwischen 0 und 65535 sind 2^16 schritte

Also ich biete: 2^16-1
Von 0 bis 1 ist ein Schritt
Von 0 bis 2 sind zwei Schritte
Von 0 bis 65535 sind …

Und 2^16 sind nun mal 65536, also einer zuviel.

von N. M. (mani)


Lesenswert?

Hier werden 12 Bit auf 16 Bit abgebildet. Das ist ein Shift um 4 links 
was ein Faktor 16 glatt ist.

12 Bit sind 4096 Werte. 16 Bit sind 65536 Werte. Wenn ich jetzt 65536 
durch 4096 teile... Was für ein Wert kommt da raus?

von Manfred M. (mm_lauf)


Lesenswert?

Du hast Recht. Es sind 2^16 -1 Schritte.Womit wird denn beim linkschift 
aufgefüllt? Mit 0 oder 1? Oder irgendeiner von beiden, die grad aus dem 
All kommt?

von Wolfgang (Gast)


Lesenswert?

Manfred M. schrieb:
> Vermute ich auch, ABER was? Ich sollte wohl mal mein Oszi auspacken?

Miss den Kanal versuchsweise mal immer direkt zweimal hintereinander und 
verwerfe dabei die erste Messung. Werden die Werte dann stabiler?

Auf welchem Eingang hast du das Signal gemessen und was liegt auf dem 
unmittelbar davor abgetasteten Kanal für ein Signal an 
(Signalverschleppung?)?

von Norbert (Gast)


Lesenswert?

Leute, Bitte!

Der Maximalwert des ADC ist 4095. Multipliziert den mit 16 und ihr 
bekommt nur 65520 und nicht 65535.
Das können wir jetzt noch endlos diskutieren, ändert aber nichts an den 
Fakten.
Schreibt euch einen 10-Zeiler in Python oder lasst von mir aus die 
Tabellenkalkulation heiß laufen.
Aber bitte testet es wirklich mal aus.
Für alle ADC-Werte von 0…4095:
Einmal mit: ADC × 16
und einmal mit:  int(ADC × 16 + ADC ÷ 256)

von PC-Freak (Gast)


Lesenswert?

Schwanken die Messergebnisse, oder laufen die in eine Richtung davon?

Wenn diese 'davonlaufen', ist es die Eigenerwärmung des PT1000 durch 
seinen eigenen Strom, wie oben schon mal erklärt. Dann muss der Strom 
durch den PT1000 runter.

von Manfred M. (mm_lauf)


Lesenswert?

richtig, es sei denn man zieh von rechts Einsen rein.
So dunkel meine ich dass es auf manchen Rechnern im Maschinencode zwei 
Arten von Linkshift gab. Sicher bin ich ist, ist lange her, dass ich das 
genau wusste

von Manfred M. (mm_lauf)


Lesenswert?

Klar doch mit linksshift von 1 in 16 bit kommt man nur bis 2^15 also ist 
der Divisor 65535 falsch?

von Manfred M. (mm_lauf)


Lesenswert?

Oder werden Einser reingeschoben?

von Manfred M. (mm_lauf)


Lesenswert?

Weiterer Gedanke: Egal was beim Linkssift reingeschoben wird mittels 
Rechtshift schiebt man's halt wider raus.

von N. M. (mani)


Lesenswert?

Norbert schrieb:
> Der Maximalwert des ADC ist 4095. Multipliziert den mit 16 und ihr
> bekommt nur 65520 und nicht 65535.

Ist ja auch klar, ein Shift um 4 links bedeutet ja normalerweise das in 
den unteren 4 Bits eine 0 steht. Das sind 15 Werte die nicht verwendet 
werden. Und was macht nochmal 65535-65520? Was fällt uns hier auf? Gibt 
es da evtl sogar einen Zusammenhang?

Manfred M. schrieb:
> richtig, es sei denn man zieh von rechts Einsen rein.

Nein macht er bei einem ordentlichen System eben gerade nicht. Bei 
signed Typen und Rechtsshift ja. Aber nicht bei Linkshift.

m.n. schrieb:
> Jetzt troll ich mich aber endgültig ;-)

Ich kann dich verstehen. Ich bin jetzt auch raus. In der Zeit wo hier 
rumgegurkt wird hätte man das Ding vernünftig aufbauen und Coden können.
Und tschüss.

von Norbert (Gast)


Lesenswert?

1
 SkalierterWert = int(ADC << 4 + ADC >> 8)

Wo kann man hier Fett, Unterstrichen und doppelte Schriftgröße 
einstellen?
Oh ja, blinken auch. Und ROT.

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:
>
1
 SkalierterWert = int(ADC << 4 + ADC >> 8)

Also mal versuch Spache zu benutzen:

ADC-Wert (im Bereich von 0 bis 2^12 - 1) wird nach links geschoben und 
dann die obersten 4 Bitt des ADC-Wertes aufaddiert.

Hmmm kann man auch machen. Ist diese Funktion invertierbar? Scheint mir, 
dass es so ist.

So allmählich kommt es mir so vor als wäre es am sinnvollsten aus den 
16-bit-Werten 12-bit-Wert zu machen.


>
> Wo kann man hier Fett, Unterstrichen und doppelte Schriftgröße
> einstellen?
> Oh ja, blinken auch. Und ROT.
kommt nicht an

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Ist diese Funktion invertierbar? Scheint mir,
> dass es so ist.
ADC-Wert = SkalierterWert >> 4

Und schon isses wieder sauber!

> So allmählich kommt es mir so vor als wäre es am sinnvollsten aus den
> 16-bit-Werten 12-bit-Wert zu machen.

Jaaaaaaaaaaaaaaaaaaaaaaaa! Da wollten wir hin.

Danke!

von Manfred M. (mm_lauf)


Lesenswert?

Meine nächsten Schritte:

Ich habe inzwischen das Steckbrett gewechselt, dann den Vorschlag von 
Koller gesteckt, meine Code ausführen lassen. Dann bekam ich vollkommen 
verrückte Wert. Sieht so aus als passe jetzt meine Tabellenkalkulation 
nicht mehr.

Wegen der in den letzten stundn geführte Diskussion und das Rätselraten 
wir aus 12-bitwerten 16-bit-Werte enstehen könnten habe ich nun 
beschlossen die Rohwerte vor dem print um 4 Bit nach rechts zu schieben, 
um wieder 12-bitige zu bekommen.

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:
> Manfred M. schrieb:
>> Ist diese Funktion invertierbar? Scheint mir,
>> dass es so ist.
> ADC-Wert = SkalierterWert >> 4
>
> Und schon isses wieder sauber!
>
>> So allmählich kommt es mir so vor als wäre es am sinnvollsten aus den
>> 16-bit-Werten 12-bit-Wert zu machen.
>
> Jaaaaaaaaaaaaaaaaaaaaaaaa! Da wollten wir hin.
Warum hat das niemand am Anfang schon geschrieben?  :-))

>
> Danke!

von Zeno (Gast)


Lesenswert?

Norbert schrieb:
> Für alle ADC-Werte von 0…4095:

Ja und das sind genau 4096 Werte, 0 ist ja auch ein Wert. Die Anzahl der 
Werte muß auch zwangläufig gerade sein, da 2^x mit x>0 immer eine gerade 
Zahl ergibt.

von Norbert (Gast)


Lesenswert?

Zeno schrieb:
> Norbert schrieb:
>> Für alle ADC-Werte von 0…4095:
>
> Ja und das sind genau 4096 Werte, 0 ist ja auch ein Wert. Die Anzahl der
> Werte muß auch zwangläufig gerade sein, da 2^x mit x>0 immer eine gerade
> Zahl ergibt.

Werte sind nicht das gleiche wie Schritte zwischen den Werten.
Weiter oben habe ich alles, wirklich alles beschrieben.
Lies!
Oder soll ich das alles für jeden der hier noch so auftaucht noch mal 
wiederholen?

von Manfred M. (mm_lauf)


Lesenswert?

Ich habe Quatsch geschrieben. Bin wohl bereits zu müde. Versuch einer 
Verbesserung:

Ich hab noch ein anderes Problem, dessen Lösung aber nicht so wichtig 
ist wie das Beseitigen des Gezappeles in den sog.(!!!) Messwerten.

Ich würde gerne die Messwerte in eine Datei des Pico schreiben. Dafür 
brauch ich praktische Dateinamen, dh. solche die alphabetisch sortiert 
sinnvolle Reihenfolge ergeben. Also brauch ich wohl führende Nullen. 
Habe schon gesucht wie ich aus der Zahl 1  die Zeichenkette 0001 machen 
kann. Fand ich nicht (kann sein, dass ich zu dumm zu suchen bin). Habe 
nur fürs Lernen von Python "Python3" von Ernest & Kaiser. Da sind viel 
Beispiele drin, aber Syntax ist schwierig zu finden. Keine BNF oder 
Syntaxdiagramme. Kannst Du etwas besseres empfehlen? ggf auch mitteilen 
wo ich das dann finde?

Und woher kennst Du die Möglichkeiten Bibliotheken / Klassen zu 
importieren? z.B. "math" hatte ich bisher nicht gefunden. Mein Verdacht: 
Du kannst die Sourcen lesen. Wenn Du mir nicht in reram publico das 
mitteilen willst, dann Alternative: manfredmeier@gmx.de

Gute N8

: Bearbeitet durch User
von Norbert (Gast)


Lesenswert?

https://docs.python.org/3/

Ich hab's mir hier direkt lokal auf dem Linux System installiert. (die 
Docs)
Da braucht es auch keine zusätzlichen Bücher.
1
"{:04d}Dateiname.ext".format(345)

von Manfred M. (mm_lauf)


Lesenswert?

Aaaah.

>>>> print("{:04d}Dateiname.ext".format(42))
>0042Dateiname.ext

Dank!

von Alois (Gast)


Lesenswert?

Koller schrieb:
> Schau dir das von Alois gelieferte Bild nochmal an. Für den Prozessor
> ist ADC_VREF ist kein Ausgang sondern ein Eingang, der über 200+1 Ohm an
> den 3,3V hängt und noch etwas gefiltert ist. ADC_VREF ist also schon
> belastbar, der Spannungsabfall an den 200 Ohm darf halt nicht zu hoch
> werden.

@TO:
Und lies auch mal das, was Alois geschrieben hat, über ratiometrische 
Messung, und wann es auf den genauen Wert der Referenz eben NICHT 
ankommt - weswegen du in dem Fall den LM4040 auch vergessen kannst.

Alois schrieb:
> Versuche es mal mit einem 'geeigneten' C an VREF.
> Aber ich wiederhole mich ...

[In 
https://www.mikrocontroller.net/attachment/550371/Screenshot_from_2022-03-15.png 
als ADC_VREF, in einem deiner frühen Posts als "angelegte Spannung" 
bezeichnet ...]

Und ich wiederhole mich schon wieder ...

Bemerkung #1 am Rande:
Im Notfall kann man R7 (200R) auch einen Bypass (R oder L) verpassen ...

Bemerkung #2 am Rande:
Hast du schon mal überschlagen, was dein ADC auflösen muss, um 0.1K über 
einen Bereich von 100K (?) erkennen zu können? Vielleicht solltest doch 
auf NTC wechseln ...

Frage am Rande:
Oversampling ist bekannt? Pro 2-fach-Oversampling lässt sich 1/2 bit 
Auflösung 'hinzu zaubern'.

just my 2ct

von Manfred M. (mm_lauf)


Lesenswert?

Alois schrieb:
> Bemerkung #2 am Rande:
> Hast du schon mal überschlagen, was dein ADC auflösen muss, um 0.1K über
> einen Bereich von 100K (?) erkennen zu können? Vielleicht solltest doch
> auf NTC wechseln ...

Falls ich mit "du" gemeint bin:

Ich habe Pt1000 gekauft, weil ich nur diese in Metallhülse mit 3 mm 
Durchmesser und 20 cm Länge gefunden habe. Was ich zusammenstellen will 
(HW & SW) wird ein Einzelstück werden. Darüber hinaus habe ich Bereits 5 
Pt1000.- Einstichsensoren, mittels denen ich einst eine Steuerung für 
einen Herd zusammenbaute (wobei ich keine SW erstellte). Habe nur Teile 
assembliert: Sensoren, Kästchen zur Anzeige und mit Ausgängen, um damit 
Relais zu schalten. Aber damit kann ich keine Daten sammeln, nur 
verhindern dass Nudelwasser oder Milch überkocht oder dafür sorgen, dass 
ein Steack "auf den Punkt" gegart ist oder ein Kuchen nicht zu lange in 
der Röhre ist und beim Räuchern die Temp. genau eingeahlten werden, beim 
NT-garen ... usw usf; u.ä.. Feine Sache so etwas zu haben (wenn man kein 
Koch mit langjähriger Erfahrung ist).

Nun will ich Temps in hohlen Wänden messen und diese Daten sammeln.

von Manfred M. (mm_lauf)


Lesenswert?

Manfred M. schrieb:
> Aaaah.
>
>>>>> print("{:04d}Dateiname.ext".format(42))
>>0042Dateiname.ext
>
> Dank!

von Manfred M. (mm_lauf)


Lesenswert?

Alois schrieb:

> @TO:
> Und lies auch mal das, was Alois geschrieben hat, ...

Wer ist TO?

von kikeriki (Gast)


Lesenswert?

Manfred M. schrieb:
> Wer ist TO?

"@TO" = at the Thread Opener = an den Thread-Oeffner = an Dich.

("Die TE" würde übrigens (meist) "Die Thread-Eröffnung = die 
Eingangsfragestellung" meinen, nur falls es Dir mal unterkäme.

Und ja, ich weiß, man könnte rein theoretisch mit "TE" auch
"Thread-Er-Öffner" abkürzen... aber man käme da durcheinander.)

von Wolfgang (Gast)


Lesenswert?

PC-Freak schrieb:
> Schwanken die Messergebnisse, oder laufen die in eine Richtung davon?

Gucks dir an.

Manfred M. schrieb:
> bei den hier gesendeten Werten war es einer mit  3248 Ohm
>
> 20581
> 20613

von Wolfgang (Gast)


Lesenswert?

Manfred M. schrieb:
> Oder werden Einser reingeschoben?

Guck doch einfach. Da sind 5en reingeschoben. Was auch immer das soll.

Manfred M. schrieb:
> bei den hier gesendeten Werten war es einer mit  3248 Ohm
>
> 20581
> 20613

von Manfred M. (mm_lauf)


Lesenswert?

Wolfgang schrieb:
> Manfred M. schrieb:
>> Oder werden Einser reingeschoben?
>
> Guck doch einfach. Da sind 5en reingeschoben. Was auch immer das soll.
Ich sehe es nicht, andere wahrscheinlich auch nicht und manche doch. 
Lass bitte die Blinden (z.B. mich) nicht dumm sterben.

Wenn man eine Zahl binär nach links shiftet kann man sich einiges 
ausdenken, was man einfüllt. Nur Nullen, nur Einsen, oder abwechselnd 
(zB 0101, 1010) ...

>
> Manfred M. schrieb:
>> bei den hier gesendeten Werten war es einer mit  3248 Ohm
>>
>> 20581
>> 20613

von Wolfgang (Gast)


Lesenswert?

Manfred M. schrieb:
> Wenn man eine Zahl binär nach links shiftet kann man sich einiges
> ausdenken, was man einfüllt. Nur Nullen, nur Einsen, oder abwechselnd
> (zB 0101, 1010) ...

Damit da 0b0101 reingeschoben wird, muss man schon einigen Unfug 
anstellen.

Manfred M. schrieb:
> Ich sehe es nicht, andere wahrscheinlich auch nicht und manche doch.
> Lass bitte die Blinden (z.B. mich) nicht dumm sterben.

Zahlenreihe in Tabellenkalkulation einlesen und die Funktion deztohex(), 
oder wie auch immer sie heißt, drauf los lassen, wahlweise auch einzeln 
mit dem Taschenrechner.

20581  0x5065
20613  0x5085
20741  0x5105
20693  0x50D5
20773  0x5125
20613  0x5085
20565  0x5055
20773  0x5125
20597  0x5075
20677  0x50C5
20789  0x5135
20677  0x50C5
20773  0x5125
20629  0x5095
20757  0x5115
20693  0x50D5
20773  0x5125
20613  0x5085
20789  0x5135
...

von Wolfgang (Gast)


Lesenswert?

Manfred M. schrieb:
> Hier Rohwerte, die eine Schwankung der Temp von 4,3 ° ergeben :
> 58846
> 58990
> 58942
> ...

p.s.
In dieser Datenreihe ist ein 0b1110 reingeschoben.
Da solltest du also erstmal klären, was da von deinem Wandler bist zur 
Ausgabe mit den Daten passiert und welches die gültigen Bits sind.

von Manfred M. (mm_lauf)


Lesenswert?

Wolfgang schrieb:
> Manfred M. schrieb:
>> Wenn man eine Zahl binär nach links shiftet kann man sich einiges
>> ausdenken, was man einfüllt. Nur Nullen, nur Einsen, oder abwechselnd
>> (zB 0101, 1010) ...
>
> Damit da 0b0101 reingeschoben wird, muss man schon einigen Unfug
> anstellen.
>
> Manfred M. schrieb:
>> Ich sehe es nicht, andere wahrscheinlich auch nicht und manche doch.
>> Lass bitte die Blinden (z.B. mich) nicht dumm sterben.
>
> Zahlenreihe in Tabellenkalkulation einlesen und die Funktion deztohex(),
> oder wie auch immer sie heißt, drauf los lassen, wahlweise auch einzeln
> mit dem Taschenrechner.
>
> 20581  0x5065
> 20613  0x5085

> ...

Gute Idee!
Jetzt seh ich es auch. Kaum zu glauben

von Manfred M. (mm_lauf)


Lesenswert?

Wolfgang schrieb:
> Manfred M. schrieb:
>> Hier Rohwerte, die eine Schwankung der Temp von 4,3 ° ergeben :
>> 58846
>> 58990
>> 58942
>> ...
>

Interessant

> p.s.
> In dieser Datenreihe ist ein 0b1110 reingeschoben.
> Da solltest du also erstmal klären, was da von deinem Wandler bist zur
> Ausgabe mit den Daten passiert und welches die gültigen Bits sind.

Gut!

Irgendwann im Lauf des Diskurses wurde klar (s. 16.03.2022 23:41  und 
16.03.2022 23:54), was ich mache: Was immer da reingeschoben wird, ich 
schieb es wieder raus.

von Norbert (Gast)


Lesenswert?

Beitrag um 22:05, 22:25, 22:43
Skalierung! Lesen und verstehen!

Da wird verdammt noch mal nirgendwo irgend etwas x-beliebiges 
›reingeschoben‹

Das mit dem Verstehen meine ich wirklich ernst.

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:
> Beitrag um 22:05, 22:25, 22:43
> Skalierung! Lesen und verstehen!
>
> Da wird verdammt noch mal nirgendwo irgend etwas x-beliebiges
> ›reingeschoben‹

Natürlich wird nirgendwo (also nicht irgendwo) etwas x-beliebiges 
"reingeschoben".Jemand weiß (oder wusste) wo und was. In digitaler 
Hardware und in Software sollte es deterministisch zugehen. Ich meine 
aber, dass aus meiner Sicht irgendwo irgendwas geschieht. Naja, 
letzteres wissen wir nun besser: Es wird 0101 reingeschoben. Ist für 
mich irgendwas, da ich nicht verstehe warum 0101 und nicht z.B 1010. Ist 
mir aber andererseits egal, es muss wieder weg.

>
> Das mit dem Verstehen meine ich wirklich ernst.
Ich habe versucht zu verstehen. Gelang mir vielleicht nicht, doch ich 
hoffe so weit ausreichend, dass ich im Laufe diesen Tages ein gutes 
Stück weiter komme. Zuerst muss ich aber banalares abarbeiten ...

von Was ein Drama hier (Gast)


Lesenswert?

Frag mal Norbert. Der soll dir Mal erklären warum dass das High Nibble 
des ADC in das Low Byte des Ergebnis gehört.

Norbert schrieb:
> SkalierterWert = int(ADC << 4 + ADC >> 8)

von Manfred M. (mm_lauf)


Lesenswert?

"welch ein Drama hier"

Da wird mir doch mitgeteilt:

> Frag mal Norbert. Der soll dir Mal erklären warum ...

welch rüder Art ist das?

ich also Norbert mitteile er soll mir (uns) erklären, ...

Warum kann das nicht der Autor des Vorschlags (welch ein Drama hier?)

von Manfred M. (mm_lauf)


Angehängte Dateien:

Lesenswert?

Anbei ein Foto, das zeigt wie jetzt mein Aufbau aussieht.

Ich habe eine Plätzchendose aus Blech, die ich über die Schaltung 
stülpen konnte, was eine leichte Verbesserung der Streuung zur Folge 
hatte.

Die Verwendung von ADC_ref (Pin 35) statt 3V3 (Pin 36) hat die 
Ergebnisse verschlechtert - erstaunlich.

Ich benutze nun die 12 most significant bits mittel rechtsshift um 4 
bits.

Komisch ist, dass die Werte eines Sensors deutlich (4 °C) über den 
beiden anderen liegen (es ist der, der an den mittleren Klemmen 
befestigt ist). Übersprechen / Induktion bei den Jumpern?

Die Diff zwischen Min und Max meiner 60 Werte ist immer noch über 5 °C. 
Die Mittelwerte sind vermutlich zu hoch. Aber ein langes, also ziemlich 
genaues Quecksilberthermometer hab ich hier nicht, sondern 15 km 
entfernt. Werde ich mir demnächst holen.

Dann hole ich mir auch einige Kondensatore. Ich werde dann auch eine 
eine Platine beschaffen und darauf die Schaltung  kompakter als auf dem 
Steckbrett realisieren. Fädelmaterial hab ich noch.

Will, zwecks Abschirmung ein metallenes Gehäuse beschaffen. Ich weiß 
aber noch nicht wie ich mit dem USB-Anschluss umgehe. Wahrscheinlich 
Stecker und eine Buchse kaufen. Wenn das Teil misst, dann brauche ich 
keinen Rechneranschluss, nur Stromversorgung. Hat jemand nen Tipp?

Norberts Tipp auf dem Pico mehr rechnen zu lassen, werde ich vielleicht 
realisieren wenn ich das Ding in einer Box habe. Letztendlich brauche 
ich Grafik.

Ein Display wollte ich auch verwenden, um aktuelle Werte anzeigen zu 
lassen. Mach ich vielleicht später. Ich drohe doch gleich mal: 
vielleicht brauch ich dann wieder Tipps ;-)

In einer Beschreibung, die ich habe steht, dass der Pico 2 MB externes 
Flash-RAM habe. Wo?

Hier haben mir einige sehr geholfen. Dank dafür!
Und Trolle scheint es ja in jedem Forum auch zu geben. Naja.

Ach ja, das sollte ich noch mitteilen: Mathematiker rechnen nur selten, 
sehr selten (wenn sie nicht Lehrer sind).

VG
Manfred

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Komisch ist, dass die Werte eines Sensors deutlich (4 °C) über den
> beiden anderen liegen (es ist der, der an den mittleren Klemmen
> befestigt ist). Übersprechen / Induktion bei den Jumpern?
Jeder Sensor hat einen eigenen Widerstand. Wenn diese nur marginal 
unterschiedlich sind, kann das schon die Erklärung sein. Selbst wenn's 
0.1% Rs sind.

> Die Diff zwischen Min und Max meiner 60 Werte ist immer noch über 5 °C.
> Die Mittelwerte sind vermutlich zu hoch.
Wenn du weiterhin darauf bestehst mit einzelnen Messungen zu arbeiten, 
dann kann ich dir zu 100% versichern das du das Problem nicht in den 
Griff bekommen wirst. Niemals!
Mit einer simplen Schleife kann der rp2040 ca. 80000 Messungen pro 
Sekunde durchführen. Mit ein wenig Software habe ich hier 13 bis 14 bit 
absolut stabil und reproduzierbar zur Verfügung.

> Aber ein langes, also ziemlich
> genaues Quecksilberthermometer hab ich hier nicht, sondern 15 km
> entfernt. Werde ich mir demnächst holen.
Egal, der Aufbau muss sowieso kalibriert werden. Jetzt ist aber nicht 
die richtige Zeit dazu.

> Dann hole ich mir auch einige Kondensatore. Ich werde dann auch eine
> eine Platine beschaffen und darauf die Schaltung  kompakter als auf dem
> Steckbrett realisieren. Fädelmaterial hab ich noch.
Kannst du, wird am eigentlichen Problem praktisch nichts ändern.

> In einer Beschreibung, die ich habe steht, dass der Pico 2 MB externes
> Flash-RAM habe. Wo?
Ist auf der Platine. U3. Eines der winzigen schwarzen ICs. Vermutlich 
das neben den Pins 7 und 8. Das ist aber ohne Gewähr.

von Stefan (Gast)


Lesenswert?

Manfred M. schrieb:
> In einer Beschreibung, die ich habe steht, dass der Pico 2 MB externes
> Flash-RAM habe. Wo?

2 MByte QSPI Flash-ROM, nicht Flash-RAM.
U3 in Appendix C: Pico Component Locations im Rasperyy Pi Pico 
Dartenblatt:
https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf

Manfred M. schrieb:
> Ich
> suchte nach einer CLK-rate (ohne dass ich versuchen würde das Teil höher
> zu takten), fand 12 MHz. Richtig? Up to 133 MHz; hmm, Faktor 10, nicht
> schlecht.

Der RP2040 wird unter Micropython, wenn nicht per machine.freq() 
geändert, mit 125 MHz getaktet die intern per PLL aus den 12 MHz des 
externen Oszillators erzeugt werden. Für USB und ADC werden über eine 
zweite PLL 48 MHz erzeugt.

von Bauform B. (bauformb)


Lesenswert?

Manfred M. schrieb:
> Wenn das Teil misst, dann brauche ich
> keinen Rechneranschluss, nur Stromversorgung. Hat jemand nen Tipp?

Sehr günstig, nutze die Gelegenheit und nimm Batterien und einen 
Linearregler.

von PC-Freak (Gast)


Lesenswert?

Was hälst Du davon, erstmal ein paar Elkos, Kerkos auf dem Board 
sinnvoll zu plazieren. Ich sehe da keinen einzigen Kondi auf dem Board.

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:

> Mit einer simplen Schleife kann der rp2040 ca. 80000 Messungen pro
> Sekunde durchführen. Mit ein wenig Software habe ich hier 13 bis 14 bit
> absolut stabil und reproduzierbar zur Verfügung.

Mir scheint, dass mir meine alten (veralteten) Kenntnisse im Weg des 
Verstehen stehen. Wenn ich das von mir gelesene richtig verstand kann 
bei Python eine int-Zahl so lang sein wie Bits im memory verfügbar sind.

Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max 
4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die 
bei
80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren 
(lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu 
wandeln?

Das ist Elektronik, die ein Mathematiker vielleicht gar nicht versteht?

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:
>> In einer Beschreibung, die ich habe steht, dass der Pico 2 MB externes
>> Flash-RAM habe. Wo?
> Ist auf der Platine. U3. Eines der winzigen schwarzen ICs. Vermutlich
> das neben den Pins 7 und 8. Das ist aber ohne Gewähr.

Ja, ist so. Hab in der Doku, die Stefan nannte nachgesehen. Sieht für 
mich so aus als wäre dieser Flash-Ram fürs speichern von Werten aus eine 
Programm nicht oder nur schwierig (mittels Tricks) verfügbar (???)

von Manfred M. (mm_lauf)


Lesenswert?

PC-Freak schrieb:
> Was hälst Du davon, erstmal ein paar Elkos, Kerkos auf dem Board
> sinnvoll zu plazieren. Ich sehe da keinen einzigen Kondi auf dem Board.
 Gemäß https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf sind 
auf dem Board einige Kondensatoren warum sollt ich noch welche darauf 
anbringen. Wo?

von PC-Freak (Gast)


Lesenswert?

Manfred M. schrieb:
> warum sollt ich noch welche darauf
> anbringen. Wo?

Bist Du echt der Meinung, dass der eine 47uF am Eingang, nach der 
MBR-Diode der Hit ist, Störungen zu eliminieren?

Du verwendest doch laut Eingangspost 3,3V. Sind dass die, die aus dem Pi 
kommen? Wenn ja, dann gehört mindest da noch ein Lo-ESR-Kondi mit bsws. 
100uF hin. Und parallel ein 100nF.

von Manfred M. (mm_lauf)


Lesenswert?

PC-Freak schrieb:
> Manfred M. schrieb:
>> warum sollt ich noch welche darauf
>> anbringen. Wo?
>
> Bist Du echt der Meinung,

Ich habe dazu keine Meinung, auch nicht echt.

> dass der eine 47uF am Eingang, nach der
> MBR-Diode

= ???

> der Hit ist, Störungen zu eliminieren?

???

>
> Du verwendest doch laut Eingangspost

= ???

>  3,3V. Sind dass die, die aus dem Pi
> kommen? Wenn ja, dann gehört mindest da
= ???
> noch ein Lo-ESR-Kondi
= ???
> mit bsws.
= ???
> 100uF hin. Und parallel ein 100nF.

Ergibt zusammen ...

von Alois (Gast)


Lesenswert?

Manfred M. schrieb:
> Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max
> 4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die
> bei 80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren
> (lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu
> wandeln?

Ich hatte dich gefragt:

Alois schrieb:
> Frage am Rande:
> Oversampling ist bekannt? Pro 2-fach-Oversampling lässt sich 1/2 bit
> Auflösung 'hinzu zaubern'.

Scheinbar ist das nicht der Fall ...

Tipp ganz am Rande:
Man summiert keine 80,000 Werte auf und teilt dann durch die Anzahl.
Mit 65,536 (=2^16) funktioniert es 'einfacher' mit dem Dividieren. 
Wieso? Das findest Du sicher selbst raus.

Noch besser aber, man berechnet solche Mittelwerte in Stufen. Das ist 
etwas tricky, wenn man dabei keine Auflösung verlieren will. Aber ein 
Mathematiker bekommt auch das hin.

So'ne Mittelung über 2^16 Werte wird mit 4 zusätzlichen Bits belohnt. 
Besser also, man verschenkt nicht all zu viel Auflösung beim ADC.

Aber ich langweile sicher mit meinen Wiederholungen ...

- Alois

von Alois (Gast)


Lesenswert?

Norbert schrieb:
> Manfred M. schrieb:
>> Komisch ist, dass die Werte eines Sensors deutlich (4 °C) über den
>> beiden anderen liegen (es ist der, der an den mittleren Klemmen
>> befestigt ist). Übersprechen / Induktion bei den Jumpern?
> Jeder Sensor hat einen eigenen Widerstand. Wenn diese nur marginal
> unterschiedlich sind, kann das schon die Erklärung sein. Selbst wenn's
> 0.1% Rs sind.

Da braucht man nicht raten: Eine triviale Fehlerrechnung brächte es an 
den Tag. Oder auch nicht ...

- Alois

von Manfred M. (mm_lauf)


Lesenswert?

Alois schrieb:
> Manfred M. schrieb:
>> Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max
>> 4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die
>> bei 80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren
>> (lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu
>> wandeln?
>
> Ich hatte dich gefragt:
>
> Alois schrieb:
>> Frage am Rande:
>> Oversampling ist bekannt? Pro 2-fach-Oversampling lässt sich 1/2 bit
>> Auflösung 'hinzu zaubern'.
Ich kenne das Nyquist-Shannon-Abtasttheorem unjd weiß was in diesem 
Kontext Oversampling  bedeutet. Ich der ADC der pico liefert aber ein 
m.E. anderes Problem.

>
> Scheinbar ist das nicht der Fall ...
Ja, scheinbar
>
> Tipp ganz am Rande:
> Man summiert keine 80,000 Werte auf und teilt dann durch die Anzahl.
> Mit 65,536 (=2^16) funktioniert es 'einfacher' mit dem Dividieren.
> Wieso? Das findest Du sicher selbst raus.
Dazu habe ich aber gar kein Lust. Wozu sollt es denn gut sein?
>
> Noch besser aber, man berechnet solche Mittelwerte in Stufen. Das ist
> etwas tricky, wenn man dabei keine Auflösung verlieren will. Aber ein
> Mathematiker bekommt auch das hin.
Mag sein.
>
> So'ne Mittelung über 2^16 Werte wird mit 4 zusätzlichen Bits belohnt.
> Besser also, man verschenkt nicht all zu viel Auflösung beim ADC.
>
> Aber ich langweile sicher mit meinen Wiederholungen ...
Ja, insbesonderes durch trollige Postings

>
> - Alois

von Manfred M. (mm_lauf)


Lesenswert?

Nochmal mit ein paar Korrekturen:

Alois schrieb:
> Manfred M. schrieb:
>> Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max
>> 4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die
>> bei 80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren
>> (lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu
>> wandeln?
>
> Ich hatte dich gefragt:
>
> Alois schrieb:
>> Frage am Rande:
>> Oversampling ist bekannt? Pro 2-fach-Oversampling lässt sich 1/2 bit
>> Auflösung 'hinzu zaubern'.
Ich kenne das Nyquist-Shannon-Abtasttheorem und weiß was in diesem
Kontext Oversampling  bedeutet. Der ADC des pico liefert aber ein
m.E. anderes Problem.

>
> Scheinbar ist das nicht der Fall ...
Ja, scheinbar
>
> Tipp ganz am Rande:
> Man summiert keine 80,000 Werte auf und teilt dann durch die Anzahl.
> Mit 65,536 (=2^16) funktioniert es 'einfacher' mit dem Dividieren.
> Wieso? Das findest Du sicher selbst raus.
Dazu habe ich aber gar kein Lust. Wozu sollt es denn gut sein?

Willst Du mir beibringen, dass Division durch eine Zweirpotenz was mit 
shifts zu tun hat?

>
> Noch besser aber, man berechnet solche Mittelwerte in Stufen. Das ist
> etwas tricky, wenn man dabei keine Auflösung verlieren will. Aber ein
> Mathematiker bekommt auch das hin.
Mag sein.
>
> So'ne Mittelung über 2^16 Werte wird mit 4 zusätzlichen Bits belohnt.
> Besser also, man verschenkt nicht all zu viel Auflösung beim ADC.
>
> Aber ich langweile sicher mit meinen Wiederholungen ...
Ja, insbesonderes durch trollige Postings

>
> - Alois

von Manfred M. (mm_lauf)


Lesenswert?

Ich will mal darstellen, worum es geht:

Ein ADC liefert Messwerte, die um einen unbekannten tatsächlichen Wert 
streuen. Es ist bekannt, dass der tatsächliche Wert sich innerhalb einer 
Zeit t  (der Variablen) so wenig ändert, dass diese Änderung 
vernachlässigt werden kann. Was also tun?

Mathematisch gesehen geht es um eine Approximation, ggf. sogar um ein 
Interpolation. Je nach Vorwissen kann man dafür als Hypothese eine 
Funktion(Fn) annehmen, die als Approximierende verwendet werden könnte. 
Ist das ein Konstante, nimmt man einen Mittelwert, ist es eine lineare 
Fn, nimmt man die Methode der kleinsten Quadrate. Vermutete man, dass 
die zu approximierende Fn komplizierter ist, kann man Splines verwenden 
oder wieder die Methode der kleinsten Quadrate, nun aber in sinnvollen 
Intervallen (was dabei sinnvoll ist muss auf Basis on Vorwissen 
entscheiden werden).

In dem Fall, worüber ich mehr wissen will geht es um eine Konstante 
während ca. 1h (was vielleicht sogar kurz ist), jedoch nicht um 
Änderungen innerhalb 1 Min oder sogar 10 sek (was ich bisher als Distanz 
zwischen Messwertablesungen nutzte).

Ich wundert mich nur über die Ungenauigkeit des ADC bei Wiederholungen 
von Messungen deren Wert sich nicht in dieser Zeit verändert.

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max
> 4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die
> bei
> 80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren
> (lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu
> wandeln?

Man muss es ja nicht gleich übertreiben mit den Messungen. Die 80000 
waren als Referenz gedacht um zu verdeutlichen das sich der Prozessor 
schrecklich langweilt. ;-)

Schreib dir eine Funktion die 128 Werte einliest und summiert:
1
#!/usr/bin/python3
2
def read128():
3
    summe = 0
4
    for _ in range(128):
5
        summe = summe + (ADC_Messwert_lesen()  >> 4) # 0 … 4095
6
    return int((summe + 4) / 8) 
7
    # 0 … 65520 # passt in uint16_t
8
    # für später, wenn die Kinder aus dem Haus sind

Wenn du das nur so simpel machst, wird es schon mal um eine 
Größenordnung besser und ruhiger aussehen.
Wenn du's noch besser willst, schreibe dir auch noch eine SlidingWindow 
Klasse - vielleicht auch mit einem 128 breiten Fenster.

Zurücklehnen, Kaffee trinken, wundern!

Und die Kondensatoren von denen hier immer geschwätzt wird, die legst du 
zurück in die Kiste. Wenn du es aber unbedingt möchtest, ein kleiner 
zwischen Vref und Gnd schadet auch nicht.

von Der Da (Gast)


Lesenswert?

Manfred M. schrieb:
> 33 µF
> Elektrolyt für 400 V (war als Ersatz in einem Netzteil gedacht

Keine gute Idee. Solche Elkos haben einen (für PT1000-Verhältnisse) 
nicht zu vernachlässigen Leckstrom. Ein kleiner Kerko (z.B. 100nF/16V) 
dürfte hier geschickter sein.

Gruß

Robert

von Bauform B. (bauformb)


Lesenswert?

Manfred M. schrieb:
> Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max
> 4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die
> bei
> 80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren
> (lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu
> wandeln?

Streng genommen wird es nicht genauer, aber die Streuung wird kleiner. 
Du brauchst beides. Mal angenommen, die vorhandene Hardware wäre perfekt 
und liefert alle 10 Sekunden exakt den gleichen Wert. Jetzt speise ich 
zusätzlich in den Spannungsteiler ein kleines Sinussignal mit 50Hz ein. 
Falls das 10-Sekunden Intervall exakt ist, wird jeder Messwert ein wenig 
zu klein oder zu groß sein, je nachdem, an welcher Stelle der Sinuskurve 
die Messung passiert. Die 10 Sekunden sind aber nicht so genau/konstant, 
also tastest du den Sinus jedesmal irgendwo ab. Die Messwerte streuen.

Wenn jetzt die Abtastrate deutlich höher als 50Hz wird, wird der 
Mittelwert über 20ms immer konstanter und entspricht immer mehr dem 
richtigen Messwert.

80kHz finde ich allerdings übertrieben, evt. produziert der ADC dann 
schon zusätzliche Fehler. Wichtiger ist, mit der Abtastfrequenz die 
Periode der Störfrequenz genau zu treffen (hier 20ms). Praktischerweise 
mittelt man gerne über 300ms, damit unterdrückt man 60, 50 und die 
16,7Hz vom Bahnstrom. Dann ist 1kHz Abtastrate schon recht ordentlich. 
Und man bekommt augenschonende 3 Messwerte pro Sekunde.

Von diesen Messwerten kannst du natürlich nach wie vor nur alle 10 
Sekunden einen verwerten.

Im wirklichen Leben hat das Störsignal oft einen 50Hz-Anteil, aber auch 
jede Menge andere Frequenzen. Man hofft, dass die einzelnen Messwerte 
zufällig verteilt sind.

von PC-Freak (Gast)


Lesenswert?

@TO Manfred
Wenn Dein Aufbau immer noch so aussieht, wie auf dem Foto von gestern 
Abend 20:01 brauchst Du Dich nicht wundern, dass Deine Werte springen. 
Schließe alle Fühler und Widerstände so nah wie möglich am Pi an. Ohne 
über x-Pins zu 'hopsen'. Und wo hast du den Schirm von den jeweiligen 
Fühlern auf Masse geklemmt.

Und auch die Masse kommt laut Foto nur aus dem einen Pin vom Pi. Erstmal 
Schaltung optimieren. Und nicht mit Mittelwertbildung den Fehler zu 
eliminieren zu versuchen.

von Norbert (Gast)


Angehängte Dateien:

Lesenswert?

Über einen Zeitraum von 50 Sekunden alle 5ms eine Messung.
R1 = 33kΩ Kohle, R2 = 15kΩ Metall.
Bei Vref 3.3V sollte sich ein Messwert von 1031,25mV einstellen.
Diese Widerstände sind nicht 100% perfekt und so stellt sich um die 
1034,5mV ein.
Gnuplot:
1
plot 'log' u ($1):($4) w l t 'ADC input 1'
›plot_zoom0.png‹ und ›plot_zoom1.png‹ habe ich nur zum Spaß angehängt. 
Wenn ihr etwas erkennen wollt dann mit ›plot_zoom2.png‹.
Und wie man sieht pendeln wir etwas um 200µV auf und ab. (Mikrovolt!)
Das ist so empfindlich das man die Änderung des Kohlewiderstands beim 
Anfassen erkennen kann. Und der ist ca. 15mal unempfindlicher als ein 
PT1000.
Bei dem Aufbau! Eine Messung alle 5 Millisekunden.
Logfile ist angehängt, es hat 50000 Zeilen. Warum ist das so klein? Nun, 
es ändert sich kaum etwas, lässt sich also prima komprimieren.

von Alois (Gast)


Lesenswert?

Bauform B. schrieb:
> Manfred M. schrieb:
>> Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max
>> 4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die
>> bei
>> 80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren
>> (lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu
>> wandeln?
>
> Streng genommen wird es nicht genauer, aber die Streuung wird kleiner.

Es wird auch genauer - derweil man durch Oversampling zusätzliche Bits 
'gewinnt'. Extrembeispiel für dieses Verfahren sind Delta-Sigma-Wander.

(Nur am Rande erklärt: Im Grunde sind das 1-bit-Wandler (Komparator), 
die u.A. durch 'noise shaping' mehr als die schon zitierten 0.5 
bit/Dekade gewinnen.)

> Wenn jetzt die Abtastrate deutlich höher als 50Hz wird, wird der
> Mittelwert über 20ms immer konstanter und entspricht immer mehr dem
> richtigen Messwert.
>
> Praktischerweise
> mittelt man gerne über 300ms, damit unterdrückt man 60, 50 und die
> 16,7Hz vom Bahnstrom. Dann ist 1kHz Abtastrate schon recht ordentlich.
> Und man bekommt augenschonende 3 Messwerte pro Sekunde.
>
> Von diesen Messwerten kannst du natürlich nach wie vor nur alle 10
> Sekunden einen verwerten.

Werte, die man nicht verwertet, braucht man nicht messen/berechnen. Will 
man Energie sparen, setzt man die Messung einfach aus. Hat man "Strom 
über", steckt man diesen in die verbesserte Auflösung.

> Im wirklichen Leben hat das Störsignal oft einen 50Hz-Anteil, aber auch
> jede Menge andere Frequenzen. Man hofft, dass die einzelnen Messwerte
> zufällig verteilt sind.

Durch die Mittelwertbildung schränkt man die Messbandbreite ein. 
Mittelwertbildung ist nichts anderes, als eine Tiefpassfilterung (FIR 
mit allen Koeffizienten = 1 -> damit reduziert sich das Multiply/Add auf 
ein Add) mit nachgeschalteter Dezimierung. Das darf man, da man durch 
den TP das Band begrenzt - ohne, dass Nyquist&Shannon laut aufschreien.

Eine "50-Hz-Unterdrückung" - kann man machen, indem man einen 
Dämpfungspol auf die Netzfrequenz setzt. Bei den angestrebten, niedrigen 
Sampleraten (0.1Hz) braucht's das aber nicht. Man fährt aber immer 
besser, wenn man Störungen am Entstehungsort eliminiert.

Was geht, bekommt man ganz schnell raus, indem man Meßsignale auto- oder 
mit Drumrum-Signalen kreuz-correliert. Auch eine FFT kann manchmal ganz 
nützlich sein. (Meine Empfehlung: octave)!

Natürlich kann man das alles analytisch brechnen - so man kann.

PS: Und komme mir jetzt blos keiner mit Dithering. Hierzu brauchts nicht 
mehr als 1 LSB noise...

So - genug "getrollt" - bin damit dann mal raus ...

von Norbert (Gast)


Lesenswert?

Alois schrieb:
Alles gute Punkte, bis auf den hier:
> PS: Und komme mir jetzt blos keiner mit Dithering. Hierzu brauchts nicht
> mehr als 1 LSB noise...

Mit einem ›breiteren‹ Dithering kann man wunderbar kleine 
Linearitätsprobleme beseitigen. Und gerade der rp2040 hat mehrere sehr 
problematische Stellen die mit ›breiterem‹ Dithering schön eingeebnet 
werden können.

von Zeno (Gast)


Lesenswert?

PC-Freak schrieb:
> Bist Du echt der Meinung, dass der eine 47uF am Eingang, nach der
> MBR-Diode der Hit ist, Störungen zu eliminieren?
>
> Du verwendest doch laut Eingangspost 3,3V. Sind dass die, die aus dem Pi
> kommen? Wenn ja, dann gehört mindest da noch ein Lo-ESR-Kondi mit bsws.
> 100uF hin. Und parallel ein 100nF.

Nö das ist Käse! Die Boards funktionieren und solange man da nichts 
außer ein paar Widerständen dran bastelt brauchts auch keine weiteren 
C's, die sind nämlich auch nicht das Allheilmittel gegen alles.
Der TO hat ganz andere Probleme und die kommen nicht vom Board oder ein 
paar, Deiner Meinung nach fehlenden, C's.

Wie ich schon schrieb, ist der TO ganz gewiß nicht der erste der ein 
Thermometer mit Pt1000 und µC baut.

von Zeno (Gast)


Lesenswert?

Manfred M. schrieb:
> Dazu habe ich aber gar kein Lust. Wozu sollt es denn gut sein?
Ja wenn Du keine Lust hast Dir was anzueignen, dann laß es am besten 
ganz sein.

von Zeno (Gast)


Lesenswert?

Norbert schrieb:
> Über einen Zeitraum von 50 Sekunden ......

Womit bewiesen wäre, das es funktioniert, wenn man alles richtig macht. 
Der TO hat ja aber schon ein Problem mit Festwiderständen - es wird wohl 
am Algorithmus hängen.

von Olaf (Gast)


Lesenswert?

> Was hälst Du davon, erstmal ein paar Elkos, Kerkos auf dem Board
> sinnvoll zu plazieren. Ich sehe da keinen einzigen Kondi auf dem Board.

Ueberfluessig. Wegen den hohen Kontakwiderstaenden der Steckklemmen 
bringt das nicht viel. Die muesste man schon direkt an den RP2040 
anloeten. Allerdings hat der RP2040 ja direkt einen (interessanten!) 
DCDC Wandler und die notwendigen Cs auf dem Board.

BTW: Schaut euch mal das Datenblatt des Wandlers an. Ein sehr 
interessanter kleiner Schnuckel von dem man eigenlich immer 10Stk in der 
Bastelkiste haben sollte...

Olaf

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:
> Manfred M. schrieb:
>> Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max
>> 4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die
>> bei
>> 80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren
>> (lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu
>> wandeln?
>
> Man muss es ja nicht gleich übertreiben mit den Messungen. Die 80000
> waren als Referenz gedacht um zu verdeutlichen das sich der Prozessor
> schrecklich langweilt. ;-)

Ach so

>
> Schreib dir eine Funktion die 128 Werte einliest und
> summiert:
1
#!/usr/bin/python3
2
> def read128():
3
>     summe = 0
4
>     for _ in range(128):
5
>         summe = summe + (ADC_Messwert_lesen()  >> 4) # 0 … 4095
6
>     return int((summe + 4) / 8)
7
>     # 0 … 65520 # passt in uint16_t
8
>     # für später, wenn die Kinder aus dem Haus sind
9
>

"passt in uint16_t" bedeutet, dass in Micropython 16 bit lange Integers 
verwendet werden? In den Sprachbeschreibungen, die ich habe, fand ich 
"uint16_t" nicht.

ABER 128*4096 ist 20 bit lang

zu "int((summe + 4) / 8)":
"/8" verstehe ich was es bewirkt(rechtshift um 4 bits), aber nicht warum 
und gar nicht verstehe ich "+ 4"

>
> Wenn du das nur so simpel machst, wird es schon mal um eine
> Größenordnung besser und ruhiger aussehen.
> Wenn du's noch besser willst, schreibe dir auch noch eine SlidingWindow
> Klasse - vielleicht auch mit einem 128 breiten Fenster.
>
> Zurücklehnen, Kaffee trinken, wundern!
>
> Und die Kondensatoren von denen hier immer geschwätzt wird, die legst du
> zurück in die Kiste. Wenn du es aber unbedingt möchtest, ein kleiner
> zwischen Vref und Gnd schadet auch nicht.
 ein Tandalkondensator mit 4n7 zwischen den Eingängen des ADC und GND 
würde m.W. Störungen über 10 kHz ableiten.

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> "passt in uint16_t" bedeutet, dass in Micropython 16 bit lange Integers
> verwendet werden? In den Sprachbeschreibungen, die ich habe, fand ich
> "uint16_t" nicht.
Nee, das ist eine Angewohnheit eines alten Asm/C-Programmierers. ;-)

> ABER 128*4096 ist 20 bit lang
21 bit. Und es ist 128 × 4095 = 524160 <-- Wichtig

> zu "int((summe + 4) / 8)":
> "/8" verstehe ich was es bewirkt(rechtshift um 4 bits), aber nicht warum
> und gar nicht verstehe ich "+ 4"
Die Hälfte des Divisors addieren, dann dividieren.
Das › (x + 4) / 8‹ ermöglicht eine flotte Auf- oder Abrundung.

Ich skaliere das herunter damit es später platzsparend in arrays passt.
1
#!/usr/bin/python3
2
from array import array
3
# 128 * uint16_t (›H‹) also 256 Bytes mit 0 initialisiert.
4
window = array('H', (0 for _ in range(128)))

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> "/8" verstehe ich was es bewirkt(rechtshift um 4 bits),

Sorry, der ist mir untergegangen…
›/8‹ rechtshift um 3 bits.

von Manfred M. (mm_lauf)


Lesenswert?

Bauform B. schrieb:
> Manfred M. schrieb:
>> Das würde bedeuten, dass ich die 80'000 gemessenen Werte (jeder max
>> 4096) aufaddieren kann. Dann kann in einer Sek eine Zahl entstehen, die
>> bei
>> 80'000 * 5000 = 400'000'000 liegt, die ich dann durch 80'0000 dividieren
>> (lassen) kann. (???) Wieso ist das dann genauer als 1x je Sek zu
>> wandeln?
>
> Streng genommen wird es nicht genauer, aber die Streuung wird kleiner.
> Du brauchst beides. Mal angenommen, die vorhandene Hardware wäre perfekt
> und liefert alle 10 Sekunden exakt den gleichen Wert. Jetzt speise ich
> zusätzlich in den Spannungsteiler ein kleines Sinussignal mit 50Hz ein.
> Falls das 10-Sekunden Intervall exakt ist, wird jeder Messwert ein wenig
> zu klein oder zu groß sein, je nachdem, an welcher Stelle der Sinuskurve
> die Messung passiert. Die 10 Sekunden sind aber nicht so genau/konstant,
> also tastest du den Sinus jedesmal irgendwo ab. Die Messwerte streuen.
>
> Wenn jetzt die Abtastrate deutlich höher als 50Hz wird, wird der
> Mittelwert über 20ms immer konstanter und entspricht immer mehr dem
> richtigen Messwert.
So weit verstehe ich deinen Hinweis
>
> 80kHz finde ich allerdings übertrieben, evt. produziert der ADC dann
> schon zusätzliche Fehler.

Norbert hat sich inzwischen dazu geäußert.

> Wichtiger ist, mit der Abtastfrequenz die
> Periode der Störfrequenz genau zu treffen (hier 20ms).

Ups. Ich würde mehr dazu neigen eine Abfrageperiode zu nehmen, die den 
Netz-Sinus an mehreren Stellen auch (mit-) messen. ein Grund ist auch: 
Ich weiß nicht wie genau die Zeitmessung des Pico sind. Wie genau sind 
bei ihm, z.B. 10 msec?

Ich kann auch ganz ander rangehen: Ich nehme als Intervall eine 
Primzahl, zB 17 msec. Dann verschieben sich die Meßzeiten langsam durch 
den  (wahrscheinlich vorhandenen) 50 Hz-sinus. Nach 7 Messungen wären 
diese einmal durch die 50 Hz Schwingung plus 1 msec "gewandert". Erst 
nach 20 (also 340 msec) Messungen wäre ich im Sinus wieder ziemlich 
genau an der gleichen Stelle wie am Anfang (vermute ich). Wahrscheinlich 
etwas darüber hinaus, weil ja das Ablesen der Werte auch Zeit 
verbraucht. Bei einer Mittelung dieser 20 Werte wären dann die 50 
Hz-Störungen wohl wieder ziemlich genau (was auch immer das "genau" sein 
könnte) weggerechnet.

> Praktischerweise
> mittelt man gerne über 300ms,
aha als nahe an meinen 340 msec
> damit unterdrückt man 60, 50 und die
> 16,7Hz vom Bahnstrom. Dann ist 1kHz Abtastrate schon recht ordentlich.
> Und man bekommt augenschonende 3 Messwerte pro Sekunde.
>
> Von diesen Messwerten kannst du natürlich nach wie vor nur alle 10
> Sekunden einen verwerten.
>
> Im wirklichen Leben hat das Störsignal oft einen 50Hz-Anteil, aber auch
> jede Menge andere Frequenzen. Man hofft, dass die einzelnen Messwerte
> zufällig verteilt sind.
Ja, habe vor ein paar Monaten gesehen, was da inzwischen alles empfangen 
wird als ich wieder mal, nach vielen Jahren, ein Oszi mitten in Nbg an 
meinen Finger anlegte. Als ich ca. 1980 an meinen "PC" herummaß gab es 
zusätzlich nur die Schwankungen des 230 V Netzes und Signale aus 
damaligen TV-Geräten.

von Zeno (Gast)


Lesenswert?

Manfred M. schrieb:
> Ich kann auch ganz ander rangehen:
Dann tue es doch einfach, wenn Du alles besser weist.
Es hat doch mittlerweile genug Posts gegeben, die aufgezeigt haben wie 
es geht und das es geht.
Unglaublich wie man sich an einem simplen Thermometerprojekt hochziehen 
kann.

von Der Da (Gast)


Lesenswert?

Manfred M. schrieb:
> Ich kann auch ganz ander rangehen: Ich nehme als Intervall eine
> Primzahl, zB 17 msec. Dann verschieben sich die Meßzeiten langsam durch
> den  (wahrscheinlich vorhandenen) 50 Hz-sinus.

Aber bitte nicht vergessen:
Alle Frequenzen sind Nominalwerte, und nur die 50Hz aus dem Stromnetz 
sind halbwegs überwacht.
Ich kenne jetzt die Toleranzen des Pi Pico nicht, aber viel genauer als 
0,5% wird das nicht sein (wenn überhaupt), d.h. auch wenn Du die Messung 
auf nominal 50Hz einstellen würdest wird die Messung innerhalb des 
50Hz-Sinus immer etwas wandern.
Es ist numal ein Vorgehen "nach best practice" bei einem A/D Wandler 
mehere Werte aufzuaddieren und dann den Mittelwert zu bilden.
Noch besser ist es zudem den Eingang brauchbar zu befiltern.


Gruß

Robert

von Norbert (Gast)


Lesenswert?

Der Da schrieb:
> Ich kenne jetzt die Toleranzen des Pi Pico nicht, aber viel genauer als
> 0,5% wird das nicht sein (wenn überhaupt)

Das ist eine kolossale Fehlannahme und so dermaßen weit von der Realität 
entfernt…
Der ADC Takt leitet sich direkt aus dem 12MHz Quarz ab und der ist um 
mindestens eine Größenordung genauer als alles was ich bisher auf so 
kleinen Platinchen gesehen habe. Ich habe hier welche im niedrigen 
einstelligen ppm Bereich.

von Stefan (Gast)


Lesenswert?

Manfred M. schrieb:
> Ja, habe vor ein paar Monaten gesehen, was da inzwischen alles empfangen
> wird als ich wieder mal, nach vielen Jahren, ein Oszi mitten in Nbg an
> meinen Finger anlegte. Als ich ca. 1980 an meinen "PC" herummaß gab es
> zusätzlich nur die Schwankungen des 230 V Netzes und Signale aus
> damaligen TV-Geräten.

Dann häng das Oszilloskop doch mal an deinen Pico und schau dir die 5V 
Verorgung, die 3,3 V vom Schaltregler auf dem Board, die gefilterte Vref 
und die Eingansspannungen des ADCs mit AC-Kopplung und 10 mV/Div oder 
feiner an.
Bei 5 oder 10 ms/Div und Netz-Trigger, um eine eventuellen Netz-Brumm zu 
sehen, und bei 2 µs/Div um etwa das zu sehen was der ADC sieht.
Eine Wandlung dauert immer nur 2µs egal ob schnellstmöglich gewandelt 
wird oder nur einmal alle 12 Stunden, die Sampling Zeit selbst ist noch 
kürzer. Für die 2 µs/Div Messung kannst du auch den Netz-Trigger nutzen. 
Weniger überlagerte Kurven wären wahrscheinlich besser, du könntest mit 
dem Pico einge Pulse pro Sekunde erzeugen auf darauf triggern.
Mit einem Digitalspeicheroszilloskop im Einzelschussbetrieb ginge es 
komfortabler aber auch mit deinem analogen Hameg müsstest du was sehen 
können.

von Manfred M. (mm_lauf)


Lesenswert?

Zeno schrieb:
> Manfred M. schrieb:
>> Ich kann auch ganz ander rangehen:
> Dann tue es doch einfach, wenn Du alles besser weist.
> Es hat doch mittlerweile genug Posts gegeben, die aufgezeigt haben wie
> es geht und das es geht.
> Unglaublich wie man sich an einem simplen Thermometerprojekt hochziehen
> kann.

Wieso liest Du denn in diesem Thread wenn Dir nicht gefällt was da 
gepostet wird? Dein Lesen entscheidest Du - oder nicht?

von Manfred M. (mm_lauf)


Lesenswert?

@ Norbert
Was gefällt Micropython daran nicht:
    file.write("{:4d}".format(i) + " ")
Das produziert einen "ValueError:" ohne dass nach dem Doppelpunkt noch 
etwas steht.

Wo finde ich eine Liste & Beschreibungen der Exceptions, die Micropython 
kennt? Insbes. "FileNotFoundError" oder gleichwertige Exception.

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Was gefällt Micropython daran nicht:
>     file.write("{:4d}".format(i) + " ")
> Das produziert einen "ValueError:" ohne dass nach dem Doppelpunkt noch
> etwas steht.
Also Python mag es nicht wenn man eine Fließkommazahl in ein integer 
Format (›d‹) schreiben will. Dafür gibt's ›f‹.
Mir gefällt das + " " nicht, "{:4d} ".format(i) macht das Gleiche.

> Wo finde ich eine Liste
Micropython docs - Builtin functions and exceptions.

> Beschreibungen der Exceptions
Standard Python docs

von Wolfgang (Gast)


Lesenswert?

Norbert schrieb:
> Wenn du weiterhin darauf bestehst mit einzelnen Messungen zu arbeiten,
> dann kann ich dir zu 100% versichern das du das Problem nicht in den
> Griff bekommen wirst. Niemals!
> Mit einer simplen Schleife kann der rp2040 ca. 80000 Messungen pro
> Sekunde durchführen.

Die Daten durch brutale Mittellung zu stabilisieren, ist eher eine 
Verzweifelungstat, wenn die Signalaufbereitung versagt. Einem 
12Bit-Wandler bei sorgfältigen Aufbau einen stabilen Wert zu entlocken, 
ist nicht ein so riesiges Hexenwerk. Solange allerdings die Bits die in 
die Mitteilung reingefüttert werden, nichts als Unfug sind, wird das 
Ergebnis nach der Mittelung vielleicht hübscher, aber ob es dem realen 
Wert am Sensor entspricht, steht in den Sternen. Das High-Nibble nochmal 
unten wieder reinzuschieben, wie oben geschehen, ist jedenfalls der 
reinste Unfug.

von Norbert (Gast)


Lesenswert?

Wolfgang schrieb:
> Die Daten durch brutale Mittellung zu stabilisieren, ist eher eine
> Verzweifelungstat, wenn die Signalaufbereitung versagt.
Kolossaler Unsinn. Lies Literatur und lerne.

> Einem 12Bit-Wandler bei sorgfältigen Aufbau einen stabilen Wert zu entlocken,
> ist nicht ein so riesiges Hexenwerk.
Der Aufbau ist durch die Platine und das Layout des Pi Pico vorgegeben.

> Solange allerdings die Bits die in
> die Mitteilung reingefüttert werden, nichts als Unfug sind, wird das
> Ergebnis nach der Mittelung vielleicht hübscher, aber ob es dem realen
> Wert am Sensor entspricht, steht in den Sternen.
Das ist deine Meinung, aber was von Meinungen im Gegensatz zu Fakten zu 
halten ist haben wir die letzten zwei Jahre schmerzlich erleben dürfen.

> Das High-Nibble nochmal
> unten wieder reinzuschieben, wie oben geschehen, ist jedenfalls der
> reinste Unfug.
Wolfgang, du hast noch nicht einmal ansatzweise verstanden wie diese 
Skalierung funktioniert. Insbesondere da es sich bestenfalls um 
Grundschul-Rechnen handelt. Es wäre also schön wenn du dir zumindest ein 
Grundverständnis der Vorgänge aneignest bevor du solch einen Stuss hier 
schreibst.

von Manfred M. (mm_lauf)


Lesenswert?

@Norbert und @ Wolfgang

Bitte beendet Schlagen unter die Gürtellinie. Das hilft niemanden weiter

Sowohl Norbert als auch Wolfgang sind mir(!) hier mit großer 
Nüchternheit aufgefallen.

Norbert schrieb:
> Wolfgang schrieb:
>> Die Daten durch brutale Mittellung zu stabilisieren, ist eher eine
>> Verzweifelungstat, wenn die Signalaufbereitung versagt.
> Kolossaler Unsinn. Lies Literatur und lerne.

Ich will die beiden Bewertungen nicht beurteilen, aber sie helfen nicht 
weiter. ABER auch ich würde gerne lernen und was hilft dabei? Ja: 
Literatur - vielleicht - aber welche?

>
>> Einem 12Bit-Wandler bei sorgfältigen Aufbau einen stabilen Wert zu entlocken,
>> ist nicht ein so riesiges Hexenwerk.
> Der Aufbau ist durch die Platine und das Layout des Pi Pico vorgegeben.
>
>> Solange allerdings die Bits die in
>> die Mitteilung reingefüttert werden, nichts als Unfug sind, wird das
>> Ergebnis nach der Mittelung vielleicht hübscher, aber ob es dem realen
>> Wert am Sensor entspricht, steht in den Sternen.
> Das ist deine Meinung, aber was von Meinungen im Gegensatz zu Fakten zu
> halten ist haben wir die letzten zwei Jahre schmerzlich erleben dürfen.
>
>> Das High-Nibble nochmal
>> unten wieder reinzuschieben, wie oben geschehen, ist jedenfalls der
>> reinste Unfug.
> Wolfgang, du hast noch nicht einmal ansatzweise verstanden wie diese
> Skalierung funktioniert.
Mir scheint, dass auch ich sie nicht verstanden habe, also nur glaubte 
ich hätte sie verstanden.
> Insbesondere da es sich bestenfalls um
> Grundschul-Rechnen handelt.

Im Prinzip richtig, doch man muß schon die Tricks der Informatiker 
kennen, um zu verstehen. Ich erwähne hier mal Einer- und 
Zweier-Komplement. Da muss man den Unterschied und die Wirkungen der 
Unterschiede kennen und für einen konkreten Rechner dann auch noch 
wissen, welches benutzt wird. Beim Pico zB weiß ich es nicht, kenne aber 
eine Methode es herauszufinden.
Oder Neulich wo ich mich über + 4 in "int((summe + 4) / 8)" wunderte. 
Der
Hinweis aufs Runden half.

> Es wäre also schön wenn du dir zumindest ein
> Grundverständnis der Vorgänge aneignest bevor du solch einen Stuss hier
> schreibst.

Bitte nicht so etwas schreiben. Ignorieren oder Erklären ist viel 
sinnvoller.

Dank vorab!

Manfred

von Manfred M. (mm_lauf)


Lesenswert?

Norbert schrieb:
> Manfred M. schrieb:
>> Was gefällt Micropython daran nicht:
>>     file.write("{:4d}".format(i) + " ")
>> Das produziert einen "ValueError:" ohne dass nach dem Doppelpunkt noch
>> etwas steht.
> Also Python mag es nicht wenn man eine Fließkommazahl in ein integer
> Format (›d‹) schreiben will. Dafür gibt's ›f‹.
> Mir gefällt das + " " nicht, "{:4d} ".format(i) macht das Gleiche.
>
>> Wo finde ich eine Liste
> Micropython docs - Builtin functions and exceptions.
>
>> Beschreibungen der Exceptions
> Standard Python docs

bei einem weiteren Problem, das ich lösen wollte, kam ich dank Deines 
Hinweises auf "Builtin functions and exceptions" via
https://docs.micropython.org/en/latest/library/index.html
und
https://docs.python.org/3.5/library/exceptions.html#SystemExit
hierher:
https://docs.python.org/3/library/errno.html
Also kein Name für die Exception, sondern eine Zahl.
Und jetzt?

Wieso kam ich zur Frage nach den Exceptions?
Ich will meine Daten in eine Datei schreiben, aber keine überschreiben.
Also bastele ich Dateinamen zusammen und schaue nach (fürs Lesen 
öffnen), ob es ein file mit diesem Namen bereits gibt. Wenn ja, bastle 
ich einen neuen Namen und probier wieder ein open file mit diesem Namen. 
Würde eine eine "FileNotFoundError" exception auftreten, kann ich den 
neuen Namen benutzen. Schön gedacht, doch die benötigte Exception kennt 
Micropython nicht. Vielleicht wenn man noch irgendein Modul nachläd? Ich 
fand noch eine errno.ENOENT Bedeutung: No such file or directory. Und 
was mach ich damit?

Hier ein experimenteller Code (man kann es sicherlich noch viel besser 
machen):

max_range=1
for file_number in range(max_range) :
    print("{:04d}_Temp.log".format(file_number))
    try:
        print("trying")
        file = open("{:04d}_Temp.log".format(file_number),"r")
        file.close()
        print("File exists")
    except:
        print("except")
        file=open("{:04d}_Temp.log".format(file_number),"w")
        print("File " + "{:04d}_Temp.log".format(file_number) + " opened 
for writing")
        max_range = file_number  # um die for-loop zu verlassen

von Manfred M. (mm_lauf)


Lesenswert?

Stefan schrieb:
> Manfred M. schrieb:
>>...
>
> Dann häng das Oszilloskop doch mal an deinen Pico und schau dir die 5V
> Verorgung, die 3,3 V vom Schaltregler auf dem Board, die gefilterte Vref
> und die Eingansspannungen des ADCs mit AC-Kopplung und 10 mV/Div oder
> feiner an.
> ...

Inzwischen steht ein Oszi auch noch auf meinem Schreibtisch. Es ist 
überraschend was ich darauf sehen kann wenn ich einen Probe auf diverse 
Pins (40, 39, 36, 35)  des Pico halte. Ich habe (naiv?) Konstante 
Signale erwartet. Ist nicht, insbes. an Pin 35. Aber: Schwierig zu 
beschreiben, was ich sehe kann.

von Wolfgang (Gast)


Lesenswert?

Norbert schrieb:
> Kolossaler Unsinn. Lies Literatur und lerne.

Das ist nicht die ersten Datenreihe, die ich auswerte - glaub's mir.
Durch Mittelung kriegst du die Standardabweichung des Mittelwertes 
runtergeprügelt, aber solange gar nicht klar ist, ob das überhaupt 
normalverteiltes Rauschen oder systematische Fehler bei der 
Datenaufbereitung sind, nützt dir das wenig für die Datenqualität.

Norbert schrieb:
> Wolfgang, du hast noch nicht einmal ansatzweise verstanden wie diese
> Skalierung funktioniert.

Immerhin ist mir klar, dass in den beiden gezeigten Messreihen das obere 
Nibble immer identisch mit dem unteren Nibble ist (0x05 bzw. 0xe0). Mit 
Normalverteilung und Statistik hat das nichts zu tun. Das ist ein 
systematischer Fehler beim Zusammenbauen der Zahlen aus den Rohdaten des 
Wandlers.

von Manfred M. (mm_lauf)


Lesenswert?

Wolfgang schrieb:
> Norbert schrieb:
>> Kolossaler Unsinn. Lies Literatur und lerne.
>
> Das ist nicht die ersten Datenreihe, die ich auswerte - glaub's mir.
> Durch Mittelung kriegst du die Standardabweichung des Mittelwertes
> runtergeprügelt, aber solange gar nicht klar ist, ob das überhaupt
> normalverteiltes Rauschen oder systematische Fehler bei der
> Datenaufbereitung sind, nützt dir das wenig für die Datenqualität.
>
> Norbert schrieb:
>> Wolfgang, du hast noch nicht einmal ansatzweise verstanden wie diese
>> Skalierung funktioniert.

Auch ich hab es nicht verstanden.
Frage ist: Wie wird aus einem 12-bit value ein 16-Bit-Value?
Andererseits: Ist es nicht egal? Wenn man den Wert um 4 bits nach rechts 
verschiebt, dann sollte(!) man wieder beim Original sein.
Dass der Wandler des Pico 16-bit-values liefert ist m.E. ein 
Marketing-Gag

Da kenn ich das Gegenteil: Ein Bekannter (sog. Musikliebhaber) kaufte 
sich einen CD-Player mit einer 24-bit-DA-Wandlung, der wesentlich teurer 
als ...  ist. Angeblich super gut; m.E. Marketing pur.

Weiterhin lustig finde ich, dass er sich dann einen Verstärker mit 
Röhren kaufte. Auch besonders teuer. Eine Programm was dasselbe (solange 
die Daten noch digital sind) macht, wäre wesentlich billiger gewesen.

Kauft sich neue Lautsprecherkabel und plötzlich wird das Hörbare 
"wesentlich voller". Meine Vermutung: Er hatte mit den alten Kabeln die 
Polaritäten nicht beachtet (wenn man diese vertauscht, dann fehlen die 
Mitten, "Klangfülle" fehlt, weil die Boxen dann mit einem "akkustischen 
Kurzschluss" arbeiten).

Ich wusste, bis ich den Typ kennenlernte, auch nicht, dass noch 
Mikrowellen in Speisen sind, wenn man sie aus einem Mikrowellengerät 
nimmt.

Seine Frau ist Gymnasiallehrerin für Mathe und Physik, aber er 
unbelehrbar, auch oft nicht berechenbar.

Norbert schrieb:
>> aber was von Meinungen im Gegensatz zu Fakten zu
>> halten ist haben wir die letzten zwei Jahre schmerzlich erleben dürfen
womit er vermutlich auf den coronalen Zirkus anspielt, den wir erleben 
durften und wohl weiterhin erleben müssen, tja, was soll man da noch 
sagen?

> Immerhin ist mir klar, dass in den beiden gezeigten Messreihen das obere
> Nibble immer identisch mit dem unteren Nibble ist (0x05 bzw. 0xe0). Mit
> Normalverteilung und Statistik hat das nichts zu tun. Das ist ein
> systematischer Fehler beim Zusammenbauen der Zahlen aus den Rohdaten des
> Wandlers.
Der Unterschied zwischen zwei Messreihen könnte an dem Bereich, in dem 
die Werte sind, liegen. Da wird evtl ein Shift Around durchgeführt (?). 
Mit so eine Rundherum-shift kann man gut verbergen was passiert und 
einfach zu realisieren ist es noch obendrein.

von Stefan (Gast)


Lesenswert?

Manfred M. schrieb:
> Dass der Wandler des Pico 16-bit-values liefert ist m.E. ein
> Marketing-Gag

Der ADC liefert 12 Bit Werte.
Die Skalierung auf 16 Bit erfolgt in der ADC-Klasse von Micropython.
Siehe hier: 
https://docs.micropython.org/en/latest/library/machine.ADC.html

"ADC.read_u16()¶

Take an analog reading and return an integer in the range 0-65535. The 
return value represents the raw reading taken by the ADC, scaled such 
that the minimum value is 0 and the maximum value is 65535."

So kann man Programme unverändert auf verschiedenen Mikrocontrollern 
ausführen, egal wie viele Bits deren ADCs liefern.

Wie die Skalierung erfolgt kann man im Quellcode sehen.
https://github.com/micropython/micropython/blob/master/ports/rp2/machine_adc.c
1
STATIC uint16_t adc_config_and_read_u16(uint32_t channel) {
2
    adc_select_input(channel);
3
    uint32_t raw = adc_read();
4
    const uint32_t bits = 12;
5
    // Scale raw reading to 16 bit value using a Taylor expansion (for 8 <= bits <= 16)
6
    return raw << (16 - bits) | raw >> (2 * bits - 16);
7
}

Manfred M. schrieb:
> Inzwischen steht ein Oszi auch noch auf meinem Schreibtisch. Es ist
> überraschend was ich darauf sehen kann wenn ich einen Probe auf diverse
> Pins (40, 39, 36, 35)  des Pico halte. Ich habe (naiv?) Konstante
> Signale erwartet. Ist nicht, insbes. an Pin 35. Aber: Schwierig zu
> beschreiben, was ich sehe kann.

Du kannst ja mal gezielt auf die Wandlung triggern.
Direkt vor einer Wandlung einen Ausgang des Pico einschalten und nach 
der Wandlung wieder ausschalten und das Oszilloskop darauf triggern 
lassen. Das ganze in Endlosschleife  mit einigen Dutzend Millisekunden 
Wartezeit zwischen den Wandlungen. ADC_VREF und der genutzte ADC Eingang 
dürften am intressantesten sein.

von PC-Freak (Gast)


Lesenswert?

Manfred M. schrieb:
> Inzwischen steht ein Oszi auch noch auf meinem Schreibtisch.

Dann kannst Du ja endlich mal die Pins begutachten, wo die Pt1000 
dranhängen, und schauen, was da für ein 'sweep' drauf ist. Und dann mal 
zum Testen einen 100 nF drüber legen.

Ich hoffe das ist ein 'anasloges' Oszi. Ein Digi verarscht Dich hier 
nur.

von Manfred M. (mm_lauf)


Lesenswert?

Stefan schrieb:
> return raw << (16 - bits) | raw >> (2 * bits - 16);

Verstehe ich das richtig, wenn ich meine, dass die 12 bits erst mal um 
die fehlenden bits (also 4) nach links geschoben werden sowie  um 2 * 
bits - 16 (also 8),  nach rechts und beide Bitfolgen dann mit "oder" 
verknüpft werden?

Aus
0000 1000 0000 0001 (dx2049)  wird

1000 0000 0001 0000 und
0000 0000 1000 0000 daraus dann
1000 0000 1001 0000 (dx32912)

richtig?

32912/65535*4095 = 2.056,529... gerundet also ..., abgeschnitten ...

Ich muss mir das mal für alle 4095 Werte, die der 12 bit-Wandler liefern 
kann, ansehen. Dann mal für das Intervall, in dem ich Messen will (ca. 
1000 bis 1194 Ohm entsprechend 0 bis 50 °C), annehmen, diese veränderten 
Werte würden bei meiner Messung entstehen und mir ausrechnen lassen 
welche Temp-Änderungen das bewirken würde ...

Wer hat denn das ausgeheckt?
Na gut, jetzt weiß ich warum ich weder die Fields-Metal noch den 
Abel-Prize bekam.

von Stefan (Gast)


Lesenswert?

Manfred M. schrieb:
> Verstehe ich das richtig, wenn ich meine, dass die 12 bits erst mal um
> die fehlenden bits (also 4) nach links geschoben werden sowie  um 2 *
> bits - 16 (also 8),  nach rechts und beide Bitfolgen dann mit "oder"
> verknüpft werden?

Ja, das sieht zwar etwas anders aus als das was Norbert schon am 
16.03.2022 um 15:13 und danach noch mehrfach geschrieben hat, liefert 
aber das gleiche Ergebnis.

Norbert schrieb:
> Ja, das ist nicht ganz korrekt. Der Pico-ADC (die Hardware) hat
> tatsächlich nur 12 bit Auflösung.
> microPython skaliert den Wert hoch:
> resultat = int(ADC<<4 + ADC>>8)
>
> Das bringt die Werte von 0…4095 in den Bereich 0…65535.
> Unnötigerweise wie ich hinzu fügen möchte
Deine Rechnung danach stimmt aber nicht.
Manfred M. schrieb:
> Aus
> 0000 1000 0000 0001 (dx2049)  wird
> 1000 0000 0001 0000 und
> 0000 0000 1000 0000 daraus dann
> 1000 0000 1001 0000 (dx32912)
> richtig?
Es wird der Rohwert 0000 1000 0000 0001 um 8 Bits nach rechts geschoben 
und liefert so im untersten Nibble 1000.
Der Rohwert um 4 Bits nach links geschoben hat rechts immer 4 Nullen, 
der um 8 Bits nach rechts geschobene nur im untersten Nibble Werte, da 
ist es egal ob man die beiden Werte addiert oder bitweise verodert.

von Manfred M. (mm_lauf)


Lesenswert?

@ Norbert aber auch an andere

Ich habe das mal den Pico rechnen lassen:

import machine
import utime
import math
import sys
file = open("ADC.txt","w")
bits=12
raw=0
while raw < 2**12:
     new_raw =raw << (16 - bits) | raw >> (2 * bits - 16)
     # print(raw, new_raw)
     raw= raw+1
     file.write(str(new_raw) +"\n")  # wird geändert: s.u.
     file.flush()

Das dauert mehrere Minuten.

Norbert schrieb 17.03.2022 20:49:
> Mit einer simplen Schleife kann der rp2040 ca. 80000 Messungen pro
> Sekunde durchführen.
Ob ich das noch glauben soll? Dabei muss doch auch "raw << (16 - bits) | 
raw >> (2 * bits - 16)" ausgeführt werden ...  Hmmm

die kommentierte Zeile habe ich geändert in
file.write(str(raw) + " " + str(new_raw) +"\n")
Das Ergebnis (Inhalt des Files) änderte sich nicht.
WAS IST DAS DENN? Das habe ich ja schon lange nicht mehr erlebt, dass 
ein Rechner Code ignoriert ohne ein Meldung auszugeben.

Ich komme mehr und mehr zu der Meinung, dass Python Schrott ist. Ein 
Grund dafür ist, dass es viele Anforderungen, die für das Design von 
Programmiersprachen entstanden, nicht erfüllt. Nur eine: Jede Variable 
muss deklariert werden.
Diese Anforderungen haben z.B. mit der Anfälligkeit oder Unanfälligkeit 
einer Programmiersprache für Fehler der Programmierer zu tun.
Ich weiß, dass ich jetzt einen Shit-storm ausgelöst haben könnte.

von Manfred M. (mm_lauf)


Lesenswert?

Stefan schrieb:
> Es wird der Rohwert 0000 1000 0000 0001 um 8 Bits nach rechts geschoben
> und liefert so im untersten Nibble 1000.

Das ist richtig.

> Der Rohwert um 4 Bits nach links geschoben hat rechts immer 4 Nullen,
> der um 8 Bits nach rechts geschobene nur im untersten Nibble Werte, da
> ist es egal ob man die beiden Werte addiert oder bitweise verodert.

Stimmt auch. Es hängte, wie ich es bereits als Möglichkeit beschrieben 
habe, der niedrigstwertige Nibble im Ergebnis vom Inhalt des 
höchstwertigen im Rohwert ab.

Der Effekt ist, dass aus Änderung des 12-Bit-Wertes um 1 eine Änderung 
um 16 beim 16-Bitwert wird. Damit wäre das Teil gewissermaßen 
entzaubert.

von Manfred M. (mm_lauf)


Lesenswert?

PC-Freak schrieb:
> Manfred M. schrieb:
>> Inzwischen steht ein Oszi auch noch auf meinem Schreibtisch.
>
> Dann kannst Du ja endlich mal die Pins begutachten, wo die Pt1000
> dranhängen, und schauen, was da für ein 'sweep' drauf ist. Und dann mal
> zum Testen einen 100 nF drüber legen.
Habe ich mir aangesehen. Da ist was, wie auf fast allen Signalen, die 
uns im Context zuum Pico-ADC interessierten (die Pins nannte ich 
bereits: (40, 39, 36, 35). Aber nicht ständig. einige Zeit ist das 
Signal immer einigermaßen glatt und dann wird es sehr unruhig. Meine 
Vermutung ist: Ursache sind 2 smartphones, die hier liegen Wenn diese 
mit ihrer Zelle reden ...

>
> Ich hoffe das ist ein 'anasloges' Oszi. Ein Digi verarscht Dich hier
> nur.
Letzteres ist zu vermuten.
Ja es ist ca. 40 Jahre alt, da gab es erst nur wenige Digitale, irre 
teuer und nur mit geringer Bandbreite.

von Stefan (Gast)


Lesenswert?

Manfred M. schrieb:
> Der Effekt ist, dass aus Änderung des 12-Bit-Wertes um 1 eine Änderung
> um 16 beim 16-Bitwert wird.
Nicht bei allen Rohrwerten. Jedesmal wenn sich bei der Änderung um 1 
auch die oberen 4 Bits des Rohrwertes ändern ändert sich das Ergebnis um 
17, von 0 aus hochzählend also das erste Mal beim Schritt von 255 zu 
256. Auch das wurde in diesem Threads schon mehrfach geschrieben.

von Manfred M. (mm_lauf)


Lesenswert?

Stefan schrieb:
> Manfred M. schrieb:
>> Der Effekt ist, dass aus Änderung des 12-Bit-Wertes um 1 eine Änderung
>> um 16 beim 16-Bitwert wird.
> Nicht bei allen Rohrwerten. Jedesmal wenn sich bei der Änderung um 1
> auch die oberen 4 Bits des Rohrwertes ändern ändert sich das Ergebnis um
> 17, von 0 aus hochzählend also das erste Mal beim Schritt von 255 zu
> 256. Auch das wurde in diesem Threads schon mehrfach geschrieben.

Hallo Stefan,

Ich habe das bemerkt, doch es erschien mir unwichtig. Weißt Du woher das 
kommt und was es bewirkt?

VG
MM

von Teo (Gast)


Lesenswert?

Manfred M. schrieb:
> Nun also Foto. Ein Labor habe ich hier leider nicht :-((

Wurde ja schon erwähnt, das man sich da über solche Fehler nicht wundern 
muss.
Die eingesteckte Klemmleiste, hat sicher auch viel zu dicke Pins für das 
Board. Damit beschädigt man die Kontakte des Bords! Den Dupont-Kabeln 
ist auch nicht blind zu vertrauen.... Sind das Buchsen-Kabel(Weiblich), 
mit nem zusätzlichen Pin aufs Board 'adaptiert'?!-O
Bau das mal komplett neu auf. Am besten auf einem Board, in dem noch 
keine zu dicken Pins gewürgt worden sind und möglichst wenige, bzw. 
unnötigen Steckverbindungen.

von Stefan (Gast)


Lesenswert?

Grundsaudaag?

von Stefan (Gast)


Lesenswert?

Stefan schrieb:
> "ADC.read_u16()¶
> Take an analog reading and return an integer in the range 0-65535. The
> return value represents the raw reading taken by the ADC, scaled such
> that the minimum value is 0 and the maximum value is 65535."

Ohne die 17er Schritte kommt man nicht zum gewünschten Endwert 65535.

von Teo D. (teoderix)


Lesenswert?

Stefan schrieb:
> Grundsaudaag?

🤮

von Norbert (Gast)


Lesenswert?

Manfred M. schrieb:
> Ich habe das mal den Pico rechnen lassen:
> import machine
> import utime
> import math
> import sys
> file = open("ADC.txt","w")
> bits=12
> raw=0
> while raw < 2**12:
>      new_raw =raw << (16 - bits) | raw >> (2 * bits - 16)
>      # print(raw, new_raw)
>      raw= raw+1
>      file.write(str(new_raw) +"\n")  # wird geändert: s.u.
>      file.flush()
>
> Das dauert mehrere Minuten.
Ja sicher. Du weißt aber was die  Zeile mit dem flush() bewirkt?
Berichte doch bitte wie oft man das da oben laufen lassen kann, bevor 
der Flash-Speicher getoastet ist und der Pi Pico weggeworfen werden 
kann.

>> Mit einer simplen Schleife kann der rp2040 ca. 80000 Messungen pro
>> Sekunde durchführen.
> Ob ich das noch glauben soll? Dabei muss doch auch "raw << (16 - bits) |
> raw >> (2 * bits - 16)" ausgeführt werden ...  Hmmm
Habe hier gerade eine andere embedded Python Version drauf, die 
Größenordnung ist aber ziemlich gleich:
Messen, adjustieren, summieren: 63248.9 sps
Messen, adjustieren: 67949.6 sps
Messen: 73352.4 sps

Nicht glauben (niemals einfach nur glauben), überprüfen! Das ist das 
Mikrocontroller Forum, nicht eine Kirchengruppe.

> Ich komme mehr und mehr zu der Meinung, dass Python Schrott ist. Ein
> Grund dafür ist, dass es viele Anforderungen, die für das Design von
> Programmiersprachen entstanden, nicht erfüllt. Nur eine: Jede Variable
> muss deklariert werden.
> Diese Anforderungen haben z.B. mit der Anfälligkeit oder Unanfälligkeit
> einer Programmiersprache für Fehler der Programmierer zu tun.
> Ich weiß, dass ich jetzt einen Shit-storm ausgelöst haben könnte.
Nee, aber peinlich - richtig peinlich - sollte dir das schon sein. ;-)
Es ist ziemlich offensichtlich das du gerade die ersten Gehversuche mit 
dieser Programmiersprache machst, da ist es durchaus empfehlenswert 
seine Worte sorgfältig abzuwägen.

von PC-Freak (Gast)


Lesenswert?

Teo schrieb:
> Bau das mal komplett neu auf. Am besten auf einem Board, in dem noch
> keine zu dicken Pins gewürgt worden sind und möglichst wenige, bzw.
> unnötigen Steckverbindungen.

Das hab ich ihm ja auch schon geraten. Aber das hat er anscheinend noch 
nicht vollzogen.
Nun schreibt er selbst , dass da am Oszi 'gehoppel' ist. Na dann wundert 
mich das nicht.

Manfred M. schrieb:
> einige Zeit ist das
> Signal immer einigermaßen glatt und dann wird es sehr unruhig. Meine
> Vermutung ist: Ursache sind 2 smartphones, die hier liegen Wenn diese
> mit ihrer Zelle reden ...

Und versuchen Einstreuungen 'schön zu rechnen' klappt halt nicht immer.

Den Schirm von den Kabel, die hier anscheinen als 'Antenne' wirken, ist 
vieleicht auch noch nicht auf Masse gelegt.

von Klaus S. (kseege)


Lesenswert?

Norbert schrieb:
> Das ist übrigens etwas das ich wirklich dämlich an embedded Python
> finde. Es wird ohne guten Grund der gelesene 12bit Wert auf 16bit
> hochskaliert. 33.3% mehr Platzverbrauch für nichts.

In den "guten, alten Tagen" verband man einen ADC grundsätzlich mit den 
höchstwertigen Bits eines Prozessors. Dann konnte man jederzeit den 
ADC durch einen höher auflösenden Typ ersetzen ohne in die Gefahr zu 
kommen, einen Overflow in der Software zu erzeugen.

Wenn die Jungspunde bei der ESA so etwas gekannt hätten, hätte eine 
Ariane weniger wegen Fehlfunktion gesprengt werden müssen.

Wer das dämlich findet, ist ... (setze einen beliebigen Begriff deiner 
Wahl  ein).

Gruss
Klaus (der soundsovielte)

von Norbert (Gast)


Lesenswert?

Klaus S. schrieb:
> Norbert schrieb:
>> Das ist übrigens etwas das ich wirklich dämlich an embedded Python
>> finde. Es wird ohne guten Grund der gelesene 12bit Wert auf 16bit
>> hochskaliert. 33.3% mehr Platzverbrauch für nichts.
>
> In den "guten, alten Tagen" verband man einen ADC grundsätzlich mit den
> höchstwertigen Bits eines Prozessors. Dann konnte man jederzeit den
> ADC durch einen höher auflösenden Typ ersetzen ohne in die Gefahr zu
> kommen, einen Overflow in der Software zu erzeugen.
>
> Wenn die Jungspunde bei der ESA so etwas gekannt hätten, hätte eine
> Ariane weniger wegen Fehlfunktion gesprengt werden müssen.
>
> Wer das dämlich findet, ist ... (setze einen beliebigen Begriff deiner
> Wahl  ein).

Nun ja Klaus, so etwas wäre natürlich schlau. Aber wenn du dich mal 
richtig einliest wirst du feststellen, das ist nicht was die Jungs bei 
microPython machen. Da gibt's einen kleinen aber feinen Unterschied.
Bei deiner Methode ergäbe ein Maximalwert von 4095 -> 65520
Bei denen jedoch  65535. Und das ist nicht schön. Wie in den vergangenen 
2^16-1 Posts schon durchgekaut.

von ahnungsloser (Gast)


Lesenswert?

Norbert schrieb:
> ›One-Wall-Free‹

Du bist doch ein Blödian, ich hab' das extra gegoogelt.

von Norbert (Gast)


Lesenswert?

ahnungsloser schrieb:
> Norbert schrieb:
>> ›One-Wall-Free‹
>
> Du bist doch ein Blödian, ich hab' das extra gegoogelt.

Danke für den ersten richtigen Lacher des Tages… ;-)

von Klaus S. (kseege)


Lesenswert?

Norbert schrieb:
> Nun ja Klaus, so etwas wäre natürlich schlau. Aber wenn du dich mal
> richtig einliest wirst du feststellen, das ist nicht was die Jungs bei
> microPython machen. Da gibt's einen kleinen aber feinen Unterschied.
> Bei deiner Methode ergäbe ein Maximalwert von 4095 -> 65520
> Bei denen jedoch  65535. Und das ist nicht schön. Wie in den vergangenen
> 2^16-1 Posts schon durchgekaut.

Dann sind wir uns da wohl ziemlich einig.

Bitte um Nachsicht, daß ich nicht alle Postings genau gelesen habe, 
2^16-1 waren zu viele für meine begrenzte Aufnahmefähigkeit. Ich lese 
den Thead hauptsächlich als unterhaltsame Anleitung, wie man maximal 
umständlich versucht, Erkenntnisse indirekt zu gewinnen, weil die 
direkte Art zuwenig Herausforderung bietet.

Außerdem würde ich gern schlauer werden und dazulernen, ob die erwähnten 
Unregelmäßigkeiten nun am ADC oder an micropython liegen, da ich 
ebenfalls einen RP2040 habe (und ihn wegen der PIOs schätze, billiger 
als ein BeagleBone!) und auf micropython gut verzichten kann, auf den 
ADC aber nur ungern.
Aber dazu muß ich wohl in den sauren Apfel beißen und tatsächlich alles 
lesen.

Gruß Klaus (der soundsovielte)

von Norbert (Gast)


Lesenswert?

Klaus S. schrieb:
> Bitte um Nachsicht, daß ich nicht alle Postings genau gelesen habe,
> 2^16-1 waren zu viele für meine begrenzte Aufnahmefähigkeit.
>
> Außerdem würde ich gern schlauer werden und dazulernen, ob die erwähnten
> Unregelmäßigkeiten nun am ADC oder an micropython liegen, da ich
> ebenfalls einen RP2040 habe (und ihn wegen der PIOs schätze, billiger
> als ein BeagleBone!) und auf micropython gut verzichten kann, auf den
> ADC aber nur ungern.
Neee, kann ich dir so sagen. Das liegt an microPython. Und man behebt es 
ganz einfach mit ADC>>4. Fertich.

von Norbert (Gast)


Lesenswert?

…oder, falls du die Ariane starten lassen möchtest - mit ADC & 0xFFF0
;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.