Frage zu Spannungsteiler, MCP3008 und Spannungmessung ... Divisor rechnerisch ermitteln

  • Hi,

    ich haben mir einen Spannungsmesser nach dieser Vorlage aufgebaut:
    https://www.raspiprojekt.de/machen/basics/…erarbeiten.html

    Python Script läuft und liefert mir nun korrekte Spannungswerte, ich muß den zurückgegeben Wert "Value" durch 50.92 teilen, damit der ermittelte Spannungswert stimmt (Analogwert ist 386 bei anliegenden 7.6 zum Beispiel).

    Ich würde gerne wissen, wie ich diesen Faktor ( besser: Divisor) von etwa 50.92 rechnerisch ermitteln kann, das sollte ja auch gehen, oder?
    Mit: Spannungsteiler-Verhältnis, 1023 Schritte (Auflösung mcp3008), 3.3V Spannung, .... ??

    Mein Spannungsteiler sieht so aus:
    Masse - 10k - Mittelabgriff um CH0 Eingang- 47k - Plus

    Somit sollten Spannungen bis ca. 19V messbar sein.

    Der MCP3008 wird vom Raspi mit 3.3V versorgt.

  • Frage zu Spannungsteiler, MCP3008 und Spannungmessung ... Divisor rechnerisch ermitteln? Schau mal ob du hier fündig wirst!

  • Ich würde gerne wissen, wie ich diesen Faktor [...]rechnerisch ermitteln kann,

    210 = 1024

    Maximale Spannung 3,3 V

    0 = 0V

    1023 = 3,3V

    Durch den Spannungsteiler erhöht sich deine Eingangsspannung auf 3,3V * (10kΩ + 47kΩ)/10kΩ = 18,81V

    Daraus folgt:

    0 = 0V

    1023 = 18,81V       (beide Seiten /1023)

    1 = 18,81V/1023 = 0,018387097V ~ 18,4mV

    Eine digitale "1" entspricht 18,4mV

    Wobei hier keine Toleranzen der Widerstände, Schwankungen der Versorgungsspannung sowie Temperaturdrift berücksichtigt wurden.

    Mir ist leider nicht klar wie du auf 50,92 kommst.

    Glaube ersetzt kein Wissen

  • ???

    3-Satz

    du hast einen Teiler 47k / 10k

    am Mittelabgriff liegt also 10/57stel an

    weil

    Spannungsteiler Regel

    U1/U2 = R1/R2

    Wenn Uges die Gesamtspannung am Teiler ist Uges = U1 + U2 dann gilt Rges = R1 + R2, daraus ermittelt sich der Strom Iges und der ist angenähert gleich I2 weil der ADC nicht viel schlucken sollte, bzw. dieser Strom beim belasteten Spannungsteiler kaum ins Gewicht fällt wenn R2 << R adc ist.

    @topsurfer deinen Nick bitte noch mal überdenken

    https://www.elektronik-kompendium.de/sites/slt/0201111.htm

    wir haben also eine unbekannte Spannung sagen wir 19V, dein Teiler ist /5,7 = 3,33V, die darf ja nicht höher werden als die Referenz kann klappen, ich würde trotzdem wegen Toleranzen leicht drunter bleiben.

    Also Grenze ist 19V = 1023 (am ADC) dann hast du bei ADC = 386 eben 386/1023 = x/19V auflösen nach x

    warum hast du 47k auf 10k gewählt?

    OK passt für 19V auf 3,33V -> 19V/5,7 = 3,33V

    ich würde gerne wissen, wie ich diesen Faktor ( besser: Divisor) von etwa 50.92 rechnerisch ermitteln kann,

    wie kommst du auf 50.92?

    Nirgends kommt dieser Teiler vor, ausser du hast am Poti gedreht, dann ist der untere R aber nicht mehr 47k

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (11. November 2019 um 22:30)

  • Mir ist leider nicht klar wie du auf 50,92 kommst.

    Nirgends kommt dieser Teiler vor, ausser du hast am Poti gedreht, dann ist der untere R aber nicht mehr 47k

    :lol:

    https://www.raspiprojekt.de/machen/downloa…stor-am-mcp3008

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • bombom u.a.;

    Thx für die Erklärung, jetzt ist es logisch ...

    Der "Fehler" kommt daher, das ich noch einen (durch den Spannungsteiler jetzt unnötigen) Pulldown Widerstand (100k) drin habe, somit hat der effektive Widerstand keine 10k, sondern 9.0909 kohm (100k und 10k Parallel).

    Rechnet man mit dem Wert, passt es !

  • Ok, ich hab's jetzt nicht nachgerechnet - aber offensichtlich konntest Du nun mit Hilfe Deine Frage selbst beantworten, oder?

    Falls ja, würdest Du bitte das Thema als erledigt markieren...

    PS: Bitte das nächste mal gleich alle notwendigen Angaben mitliefern, damit sich die Helfenden nicht unnötig schwer tun. Ich kenne mich nämlich noch immer nicht aus was Du da mit dem Poti gemeint hast - ist aber auch nicht mehr relevant...

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Ich hatte nie was von einem Poti erwähnt ... ?

    Notwendige Angaben hatte ich imho auch mitgeliefert, sogar die Werte vom Spannungsteiler, Versorgungsspannung 3.3V etc.

    Muss schauen wo ich das Thema auf "erledigt" setzen kann ....

  • Ich hatte nie was von einem Poti erwähnt ... ?

    ach

    ich haben mir einen Spannungsmesser nach dieser Vorlage aufgebaut:
    https://www.raspiprojekt.de/machen/basics/…erarbeiten.html

    und wohin führt mich?

    https://www.raspiprojekt.de/machen/basics/…erarbeiten.html

    https://www.raspiprojekt.de/machen/downloa…stor-am-mcp3008

    das erste was man dort doch sieht ist das Poti!

    Wolltest du was anderes zeigen, warum zeigst du dann nicht deinen Aufbau im Bild.

    Jede Hilfe kann nur fehlschlagen bei zu dünnen Infos deinerseits!

    ich haben mir einen Spannungsmesser nach dieser Vorlage aufgebaut:

    welcher denn? das genau zeigst DU nicht!

    Notwendige Angaben hatte ich imho auch mitgeliefert

    imho auch nicht:

    Der "Fehler" kommt daher, das ich noch einen (durch den Spannungsteiler jetzt unnötigen) Pulldown Widerstand (100k) drin habe, somit hat der effektive Widerstand keine 10k, sondern 9.0909 kohm (100k und 10k Parallel).

    also halten wir fest,

    1. In #1 Beitrag nicht alles gezeigt und genannt!

    2. falsche Werte, bzw. keine Werte im Aufbau genannt!

    3. Echte Werte kamen erst in #5, aber immer noch kein Bild vom Aufbau

    und dann verwundert sein?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    3 Mal editiert, zuletzt von jar (12. November 2019 um 10:57)

  • Ich hatte zu dem MCP3008 auch das Datenblatt gelesen. Leider ist es nicht fehlerfrei, denn auf Seite 14 wird erklärt wie sich die digitalen Werte zu den analogen Messgrössen verhält. Richtig wäre:

    LSB Size = VREF / (210 -1) = VREF /1023

    Prüfen kann man das leicht, wenn die Komplexität reduziert wird, in diesem Fall von 10bit runter auf 2bit. Bei Vmax = 3V ergibt sich folgende Einteilung

    0b00 = 0V

    0b01 = 1V

    0b10 = 2V

    0b11 = 3V

    Das entspricht 3V/(22-1) = 3V/3 = 1V pro Schritt. Nach der falschen Formel aus dem Datenblatt käme man hier auf 0,75V pro Schritt.

    Das war nur eine kleine Bemerkung am Rande, die zeigen sollte, dass auch in Datenblättern Fehler auftreten.

    Vielen Dank fürs Lesen und Verstehen.

    Glaube ersetzt kein Wissen

  • ergänzend möchte ich hinzufügen,

    ich ermittele immer nach der Geradengleichung

    y = m * x + b

    2 Wertepaare im mich interessierenden Bereich, sagen wir max U = 7V, aber mich interessiert nur um 5V

    also stelle ich am Labornetzteil oder Poti

    1. 5,1V ein y1 und nehme den ADC Wert x1

    2. 4,9V ein y2 und nehme den ADC Wert x2

    wie lernten wir x unabhängige Variable (hier ADC), y abhängige Variable (hier VOLT)

    mit dy/dx bekomme ich m die Steigung

    mit einsetzen von m und y1, x1 und m und y2, x2 bekomme ich zwei b und die sollten gleich sein oder ich bilde den Mittelwert

    dann später bekomme ich zu jeden ADC Wert im interessierten Bereich den optimalen V Wert, was jucken mich da die Fehler am Ende ADC 1023 oder ADC 0

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ich hatte nie was von einem Poti erwähnt ... ?

    Sorry, mein Fehler habe das Wort "Mittelabgriff" mit einem Poti in Verbindung gebracht. Deshalb habe ich mich auch nicht (mehr) ausgekannt...

    Notwendige Angaben hatte ich imho auch mitgeliefert, sogar die Werte vom Spannungsteiler, Versorgungsspannung 3.3V etc.

    Das PS war nicht böse gemeint - ich wollte damit nur sagen, dass man sich bemühen soll alle relevanten angaben zu erwähne, um es den helfenden nicht unnötig schwer zu machen. Ich meinte damit Deine Aussage

    Der "Fehler" kommt daher, das ich noch einen (durch den Spannungsteiler jetzt unnötigen) Pulldown Widerstand (100k) drin habe, somit hat der effektive Widerstand keine 10k, sondern 9.0909 kohm (100k und 10k Parallel).

    Muss schauen wo ich das Thema auf "erledigt" setzen kann ....

    Hier hat hyle das mal einem anderen User erklärt - und damit hat es offensichtlich geklappt :thumbup:;)

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Alles klar, k.P.!
    Ich hatte versucht wirklich viele bzw. alle notwendigen Infos mitzuliefern ...

    Das Python-Script habe ich auf drei Eingänge erweitert, alle drei Eingänge funktionieren soweit (und sind mittels Pulldown Widerstände auf Masse gezogen).
    Darüber hinaus verwerfe ich alle Messungen (Zählungen) unter 40 Impulsen (<0,7V)

    Jetzt habe ich das Script mal 2h laufen lassen, und sehe auf zwei der drei Eingängen (mal auf Ch1, mal auf Ch2) alle etwa 30 Minuten (mal 15, mal 45 Minuten) unsinnige Werte:
    1952 Impulse, 1856 Impulse, ...
    Die anderen Messwerte dazwischen sind exakt und haben keine "sprünge".

    Woher können diese Fehler kommen, der MCP3008 sollte doch höchstens 1023 zurückliefern können?
    Timing-Probleme? Starke Störimpulse? Prinzipiell (meistens) stimmen ja die Werte und Funktion !?

    In der Funktion GetAnalogData habe ich einen Sleep von 0.1s (wird bei 3 Channels ja 4x aufgerufen) eingebaut, zusätzlich in der while/endlos -Schleife 0.7s. Somit ermittle ich (ca.) jede Sekunde einen Messwert.
    Ich habe die sleeps jetzt mal erhöht und beobachte mal ....

  • 1952 Impulse, 1856 Impulse,

    Welche "Impulse"? Du meinst sicherlich digitale Werte.

    Wie hast du den MCP3008 an den RPi angebunden? Ist das eine kleine Platine oder verwendest du ein Steckbrett?

    Verwendest du Widerstände?

    Und welches Signal misst du? Gleichspannung die etwas schwankt oder könnten da auch höherer Frequenzen vorkommt? (Ja ich habe deine Aussage übe die sleep() gelesen)

    Kannst du externe Störungen durch Induktion (z.B. Aufzug) ausschliessen?

    Protokollier Vcc mit, eventuell über eine Spannungsteiler.

    Glaube ersetzt kein Wissen

  • Stimmt, ich meine den digitalen Wert, den der MCP ermiitel hat und an den Raspi liefert.

    Die Bauteile sind auf einer Platine verlötet, verwende Widerstande (kein Poti).
    Die Spannung die ich testweise messe ist eine teilentleerte 9V Blockbatterie, das ganze liegt auf dem Schreibtisch und sollte keinerlei Störungen unterliegen.

    Hab weder am Code, am Aufbau oder der Position auf dem Schreibtisch was geändert und die ganze Nacht keine einzige Fehlmessung protokolliert, merkwürdig!

    So sah es gestern aus (ich schreibe die Werte nur in die Datei wenn sich mindestens ein (Spannungs-)Wert geändert hat!):

    Spoiler anzeigen

    ...
    12.11.2019 17:43:00 0.00 7.64 0.00

    12.11.2019 17:43:01 0.00 7.62 0.00

    12.11.2019 17:44:53 0.00 7.62 10.13

    12.11.2019 17:44:54 0.00 7.62 0.00

    12.11.2019 17:45:00 0.00 7.64 0.00

    ...

    12.11.2019 17:48:54 0.00 7.64 0.00

    12.11.2019 17:48:55 0.00 7.62 0.00

    12.11.2019 17:50:03 0.00 36.94 0.00

    12.11.2019 17:50:04 0.00 7.62 0.00

    12.11.2019 17:50:10 0.00 7.64 0.00

    ...

    12.11.2019 18:21:43 0.00 7.62 0.00

    12.11.2019 18:23:31 0.00 7.62 36.94

    12.11.2019 18:23:32 0.00 7.62 0.00

    ...

    12.11.2019 18:27:29 0.00 7.62 0.00

    12.11.2019 18:36:47 0.00 7.62 38.85

    12.11.2019 18:36:48 0.00 7.62 0.00

    ...

    12.11.2019 19:02:50 0.00 7.62 0.00

    12.11.2019 19:05:29 0.00 25.48 0.00

    12.11.2019 19:05:30 0.00 7.62 0.00

    ...

    12.11.2019 19:06:31 0.00 7.62 0.00

    12.11.2019 19:08:42 0.00 7.62 38.85

    12.11.2019 19:08:43 0.00 7.62 0.00

    ...

    12.11.2019 19:08:42 0.00 7.62 38.85

    12.11.2019 19:08:43 0.00 7.62 0.00


    Oder sind diese "Störungen" doch verursacht durch Störungen auf dem 230V Netz, der Raspi und somit auch der MCP wird ja darüber versorgt (Raspi hängt an USB Buchse vom PC, dieser an 230V)

    Update:
    Eben doch wieder paar Fehlmessungen:
    13.11.2019 12:37:38 0.00 7.60 20.14

    ...

    13.11.2019 13:11:37 25.48 7.60 0.00


    Kann es daran liegen das die nicht genutzten Channels (3 bis 7) "offen" sind und kein Pulldown gegen Masse haben? Das da was "reinfunkt" ?

    2 Mal editiert, zuletzt von topsurfer (13. November 2019 um 13:20)

  • Wie sind die Kanäle 0 und 2 beschaltet? An Kanal 1 hängt deine 9V-Baterie

    die nicht genutzten Channels (3 bis 7) "offen" sind und kein Pulldown gegen Masse haben

    Du kannst da ruhig einen Widerstand nach Masse oder Vcc anschliessen. Falls die Kanäle 0 und 2 ebenfalls offen sind, lege diese auch mit einem Widerstand fest auf ein Potential.

    Glaube ersetzt kein Wissen

  • Ja, die Batterie hängt an CH1,
    Ch0 bis 2 haben einen Pulldown zu Masse hin.

    Dann werde ich die ungenützten Channels auch mal (sicherheitshalber) über Pulldowns an Masse legen ...

    Was aber merkwürdig ist, am CH1 hängt ja über ein Spannungsteiler die (schwache) 9V Batterie, wie kann so eine Fehlmessung zu stande kommen?
    Digitalwert (exact) 2000 <=> 39.81 V !!??

    Oder muss man damit leben? Irgendwelche Störungen an Vcc, am 230V, Spannungsspitze, Funkstörung vom DECT Telefon, ... ?

    - Date - - Time - - Ch0 - - Ch1- - Ch2 -

    13.11.2019 14:36:14 0.00 7.60 0.00

    13.11.2019 14:36:23 0.00 39.81 0.00

    13.11.2019 14:36:23 0.00 7.60 0.00

    Auch merkwürdig, 0V / 0 digits , obwohl ja eine Batterie dranhängt:

    13.11.2019 14:55:13 0.00 7.60 0.00

    13.11.2019 15:00:55 0.00 0.00 0.00

    13.11.2019 15:00:56 0.00 7.60 0.00

    Einmal editiert, zuletzt von topsurfer (13. November 2019 um 15:11)

  • Das wird jetzt schwierig.

    Die Platine wird mit 3,3V vom RPi versorgt.

    Deiner Beschreibung entnehme ich , dass die Teile keine langen Leitungen haben, somit sollte auch der SPI funktionieren.

    Stromversorgung vom PC ist etwas grenzwertig. Bekommst du "Undervoltagge"-Warunungen (gelber Blitz)?

    Du kannst die Übertragungsgeschwindigkeit des SPI einstellen. Mach den Takt langsamer. Mit welchem Takt arbeitest du? Unter 10kHz solltest du laut Datenblatt nicht gehen.

    Hast du den SPI-Mode richtig eingestellt? Nicht das die Werte erst am Ende der Gültigkeit übernommen werden, anstatt in der Mitte vom Takt.

    So langsam wie du misst, wirst du die maximale Samplingrate von 75ksp/s leicht einhalten.

    Ohhh, ich sehe gerade auf Seite 18 des Datenblatts, die höherwertigen bits sind Tristate. Erst ab bit10 werden diese auf einen bestimmten Pegel gelegt. Du solltest die bit10 bis bit15 löschen bzw. ignorieren.

    Wenn möglich protokolliere die digitalen Werte, da sehe ich mehr.


    edit:

    Code
    daten = daten & 0x03ff
    
    0x03ff -> 0000 0011 1111 1111 
    Daten  -> 0101 0111 0101 0101 (bit-weise UND)
    Ergebniss 0000 0011 0101 0101

    Glaube ersetzt kein Wissen

    Einmal editiert, zuletzt von bombom (13. November 2019 um 16:07)

  • 1952 Impulse, 1856 Impulse, ...

    Woher können diese Fehler kommen, der MCP3008 sollte doch höchstens 1023 zurückliefern können?

    Sehr eigenartig: Wenn Du das Programm das im ersten Beitrag verlinkt ist verwendest, dann sollte tatsächlich keine Zahl über 1023 möglich sein, oder?
    Basierend aus: Analoge Signale mit dem MCP3008 verarbeiten

    Und siehe da: Da kommt tatsächlich 2047 raus - das bedeutet das Programm liest 11 bit ein und kann somit Werte über 1023 erreichen. Es müsste also in Zeile 8 range 10 heißen. Somit könnte auch kein Wert über 1023 raus kommen.

    Ich bin nicht sicher, ob man ganz ohne Wartezeit zwischen den GPIO Kommandos arbeiten darf. Das ein oder andere Signal könnte schon mal zu schnell für dem MCP3008 sein, oder?

    Ändere doch bitte mal den Code des Verlinkten Programmes in der Schleife wie folgt ab:

    Python
            GPIO.output(CLKPin, HIGH)
            time.sleep(0.01)
            GPIO.output(CLKPin, LOW)
            adchvalue <<= 1 # 1 Postition nach links schieben
            time.sleep(0.01)
            if(GPIO.input(DOUTPin)):
                adchvalue |= 0x01

    Edit: Habe gerade im Datenblatts auf Seite 18 gelesen, dass immer ein 0 Bit am Anfang gesendet wird - Es MÜSSEN also tatsächlich 11 Bit abgefragt werden

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Basierend aus

    Das Pytho-Programm sieht eher so aus, wie wenn jemand so lange am Code herum gestrickt hat bis es läuft, ohne zu verstehen, was im Datenblatt steht.

    Ich kann das Datenblatt auch falsch interpretieren, es steht dort MCU latches data from A/D converter on rising edges of SCLK zu deutsch "die Daten werden mit der steigenden Flanke in das Ausgaberegister geschrieben". Weiter Data is clocked out of A/D converter on falling edge zu deutsch "Mit der fallenden Flanke werden die Daten ungültig". Was sich auch einigermassen mit dem Diagramm deckt.

    Weiter im Programm, Variablen Definition irgendwo im Programmablauf ist extrem schlecht.

    Ich bin der Meinung, dass ein Unterprogramm keine unnötigen Wartezeiten beinhalten sollte: time.sleep(0.5) vor dem return adchvalue. Die Wartezeit ist im Hauptprogramm besser aufgehoben.

    Die Bedeutung von /CS ging spurlos am Programmautor vorbei. Der Chip wird ständig selektiert, nur kurz am Anfang der Unterfunktion wird an der Leitung gezupft. Ich habe keine Ahnung ob die Zeit ausreicht, um vom Chip erkannt zu werden.

    Glaube ersetzt kein Wissen

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!