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.
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.
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.)
@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
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.
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.
@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?
@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
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.
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.
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
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.
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.
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.
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
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
frommachineimportmem8
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.
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.
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 (?)
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 ...
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.
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
> 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.
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
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.
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.
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_inrange(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.
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)
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.
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.
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.
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?
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) .
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?
> 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.
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.
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
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...
@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
......
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
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
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.
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).
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.
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.
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.
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.
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.
----------------------
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.
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.
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 ;-)
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).
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.
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.
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! ;-)
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)?
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!
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.
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.
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.
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
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.
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.
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.
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"
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.
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? ;-)
…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'
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.
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.
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 ;-)
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?
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.
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.
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 ;-)
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)
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.
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.
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:
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.
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?
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?
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?)?
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)
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.
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
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.
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
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!
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.
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!
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.
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?
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
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
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.
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.)
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
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
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
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
...
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.
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
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.
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.
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 ...
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)
"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?)
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
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.
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.pdfManfred 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.
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.
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?
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 (???)
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?
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.
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 ...
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
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
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
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
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.
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
defread128():
3
summe=0
4
for_inrange(128):
5
summe=summe+(ADC_Messwert_lesen()>>4)# 0 … 4095
6
returnint((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.
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
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.
@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.
Ü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.
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 ...
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.
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.
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.
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.
> 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
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
>defread128():
3
>summe=0
4
>for_inrange(128):
5
>summe=summe+(ADC_Messwert_lesen()>>4)# 0 … 4095
6
>returnint((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.
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
fromarrayimportarray
3
# 128 * uint16_t (›H‹) also 256 Bytes mit 0 initialisiert.
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.
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.
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
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.
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.
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?
@ 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.
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
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.
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.
@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
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
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.
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.
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.
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
// Scale raw reading to 16 bit value using a Taylor expansion (for 8 <= bits <= 16)
6
returnraw<<(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.
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.
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.
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.
@ 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.
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.
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.
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.
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
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.
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.
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.
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.
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)
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.
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… ;-)
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)
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.