Posts by Franky07

    Moinsen

    Was hat denn die CPOL mit der mit dem Pegel einer CS-Leitung zu tun?

    Wenn du mal in die Spezifikation geschaut hättest, was du sicherlich gemacht hast, wäre dir aufgefallen des vier Modi gibt.
    Einmal:
    - im aktiven Mode ist CS Low und die während die Datenpegel bei logisch 1 dem High Pegel entsprechen, und auch das Clock Signal mit einer to HIGH Flanke eingeleitet wird.
    Das ist der Modus welcher sich an am häufigsten genutzter Standard durchgesetzt hat.

    Und damit auch schon Ende der Ansage, den wenn wie Martin28 schrieb der Clock Invertiert verwendet werden soll, dann muss diese Konfigurationsabweichung im BUS-Init beschreiben werden, dass funktioniert aber bei µPython nur dann wenn auch der CS mit invertiert wird, was zu einer vollständigen Signalinkompatibilität mit dem MCP41010 führen würde.

    Man kann zwar diese Funktion umkehren, da aber beide ICs am den gleichen MOSI, MISO und SCLK Leitungen hängen, der Bus aber selber ohne einen SLAVE Reset zu bewirken nicht geändert werden kann frage ich mich, weil man dann zwar Manuell auch den CS Invertieren müsste, wie du diese beiden Chips an einem BUS-HOST-Master parallel betreiben willst ?

    Du kannst zwar den Init des Busses im Programmlauf MAIN wiederholt auch mit unterschiedlichen Konfigurationen ausführen um das SCLK zu invertieren, was aber zur Folge hätte, das dieses DigiPOT ebenfalls einen Reset macht, und seinen Ausgangspegel auf Viper 50% stellt. Es ist natürlich bei dieser Schaltung sehr Sinnvoll erst den Ausgangspegel des OPVs via des DigiPots einzustellen, und dann um den Funktionsgenerator in Betrieb zu nehmen, einen BUS Reset auszuführen, was ggf einen höheren Ausgangspegel zur Folge hätte um dann die Signalausgabe zu starten. Die möglicher Weise angeschlossene Testhardware klatscht dann in die Hände und freut sich natürlich mörderisch, wenn der ankommende Eingangspegel über der Spezifikation liegt. Alles Super !!! ||

    Falls du natürlich eine Lösung anbieten kannst die eine vollständige SPI Implementation ohne die pio Nutzung ermöglicht raus mit der Sprache. Aber du kannst ja gerne mit deinen überlegenen µPython Kenntnissen einen pio Code dem TO zur Verfügung stellen, ohne auf machine.SPI zurückzugreifen damit er beide IC's in technisch vollständiger elektrischen Parallelschaltung auch technisch parallel ohne einen HOST Reset betreiben kann.

    Ich warte auf deine vollständige in pio geschriebene AD9833 und MCP41010 Bibliothek, welche der TO wie gewohnt importieren kann und sein Programm einfach so weiter verwenden kann.

    Dazu müsste man die Datenblätter beider SPI Slaves gelesen und verstanden haben, was du offensichtlich nicht gemacht hast. Also lasse deine Vermutungen einfach außen vor, liefere echte Vorschläge die du auch mit einem funktionierendem Programmcode untermauern kannst, und übe dich nicht weiter in Spekulationen !
    Und falls du dich mal durch die gesamten Handbücher und Begleitwerke der Firma Mirochip zum Thema SPI gewühlt hast, diesen Inhalt auch verstanden hast, und das dann eigenständig auch in Programmcode ( funktionierendem ) darstellen kannst, dann kannst du gerne hier mit deinem Wissen auftrumpfen. Sorry ich arbeite schon einige Jahre mit verschiedensten SPI-Slaves dieser Firma und setze diese auch bewusst und gezielt bei verschiedensten Projekten ein, so das ich die Tücken gerade um SPI, egal ob ADC, DAC, PortExpander, EEPROM wie auch RTC und anderen Anwendungen sehr genau kenne, ohne das ich extra dafür ein Studium der Datenblätter mehr benötige. Und solange wir, bzw der TO von MicroPython spricht, ist das der erste Aufhänger nachdem man sich die Befehlscodierung gemäß Datenblatt angeschaut hat. Bei C/C++ ist das ein ganz andere Sache, hier kann alle supporteten 4 Modi problemlos auch parallel verwenden, wenn man den BUS Init via Zeiger bedient. Das ist aber oder leider mit µPython nicht möglich, auch nicht mit CircuitPython !!!

    Moinsen Bernd666

    mal wieder über den Standard gestolpert ?
    An diesen SPI BUS als Objekt aus

    spi_bus = SPI(0, baudrate=100000, polarity=0, phase=1, sck=Pin(2), mosi=Pin(3))
    Hängen unabhängig des CS zwei Slaves.
    Die Clockgeschwindigkeit wird an dieser Stelle definiert und es wird auch kein RP2 benötigt ( warum auch ? ) !
    Damit kannst du den Clock = Baudrate nur so hoch einstellen, weil diese Grundfunktion für jeden Zugriff unabhängig des CS , für jeden Zugriff auf beide Slaves gleich ist. Und 100 kHz wie vom TO verwendet befindet sich außerhalb der Standardspezifikation des SPI Busses. Man kann es versuchen, es muss nicht mit jedem Bus-Slave funktionieren, deswegen sollte man gerade wenn man ohnehin schon Funktionsprobleme hat sich an die CLOCK Spezifikationen halten.
    Und damit wenn man dieses Konzept oder deine Denkweise anwenden würde , weil der MCP41010 unabhängig des CS auch mit dem gleichen SCLK Signal beauflagt wird, wenn der AD9833 angesprochen wird, dann liegt die von dir vorgeschlagenen 40 Mhz um den Faktor 4 über der Spezifizierung Maximumratings des MCP41010 welche nur mit maximal 10 MHz betrieben werden dürfte.

    Statt hier den Schlaumeyer zu spielen, und mit Unwissen in der SPI Programmierung in µPython zu glänzen, solltest du ggf mal darüber nachdenken, oder auch das Problem als Komplexes Ganzes betrachten.
    Der TO hat den SPI Bus außerhalb der Spezifikation konfiguriert. Und dann kommt noch der Aspekt hinzu, weil der SPI Bus auf MOSI, MISO und SCLK als Parallelschaltung ausgeführt ist ( muss man nicht machen, ist aber durch die Beschaltung auf der Platine vorgegeben ) muss man sich mit der Wahl der CLOCK Frequenz am langsamsten Slave in der Kette orientieren und nicht am schnellsten.

    Zudem auch das PICO mit oder in µPython je nach Lastverteilung auf die beiden Cores mit diesen 40 MHz durchaus Probleme bekommen könnte. Theoretisch sind zwar 80 MHz möglich, aber das ist dann wieder oder auch der Leitungs- und Verbindungsqualität zwischen dem PICO und der User-Slave Platine abhängig.
    Einfach mal versuchen im ersten Schritt eine stabile Grundfunktion nach Spezifikation hinzubekommen, und die Funktion sicherzustellen, und dann kann man immer noch an der Geschwindigkeitsschraube drehen. Alles andere ist Unsinn und führt ggf sogar zu Schäden an der Hardware.
    Daher wenn du noch nie ein PICO mit µPython und mehreren unterschiedlichen SPI oder auch anderen BUS Komponenten eingerichtet und betreiben hast, weniger Vermutungen, weniger Max-Power Denken bitte.

    Moinsen,

    Ich sehe an dem MCP41010 keinen Abblockkondensator, zumindest ist im Schaltbild keiner mittelbar eingezeichnet. Daher waroder ist meine Vermutung, das der Funktionsgenerator IC selber je nach Platinendesign eine Schwankung an der Vcc des DigiPot verursachen könnte.
    Das könnte in Verbindung mit dem nachgeschalteten OPV zu einigen komischen Sachen führen.

    Daher, wenn es dir möglich ist, mal bitte ein paar Detailfotos der besagten Platine hier einstellen.

    Moinsen,

    Wenn ich das Datenblatt MCP41xxxx DigiPOT zur 8 Pin Version noch richtig im Kopf habe, wobei ich mir jetzt nicht 100% sicher bin, weil diese Version glaube auch keinen VIPER EEPROM hat, müsste man nach einem Erinnerungen mit diesen DigitalPotis, nach dem dem PowerON und einem CS to LOW, den Befehl 0x80 senden, damit das Poti auf Mittelstellung geht.
    Versuche doch einfach mal egal mit welcher Ausgabe am Funktionsgenerator die Viper Stellung aktiv zu beeinflussen. Aber auch der OPV spielt nur bis ca. 5 MHz ohne Eigendämpfungsverluste mit. Für einen Funktionsgenerator bis 12,5 MHz eine recht eigenwillige Zusammenstellung der Bauteile und Funktionsgruppen.
    Falls es dir möglich ist würde ich dir mal empfehlen, speziell die Spannung am MCP41010 mittels eine OSZIs zu Monitoren, ob des da nennenswerte Abweichungen gibt. Bekannter Weise ist die Viper Genauigkeit auch mittelbar von der Vcc des MCP41010 abhängig.

    Moinsen,

    Als Erstes musst du das mit dem INIT in Zeile 7 das Output auf High setzen

    Code
    cs_ad9833 = Pin(1, Pin.OUT, value = 1)

    Standardmäßig wird der SPI Bus für den AD9833 mit eine SCLK von 400 kHz betreiben. Daraus ergeben sich dann bei einer langsameren Clock-Takt auch andere größere Verweilzeiten zwischen dem Setzen des CS "to Low" und dem Einsetzen des SCLK mit anschließender Datenermittlung.

    Was nun eine MCP41010 ( Digital Poti) in und mit dieser Sache zu tun hat, keine Ahnung. Auf jeden Fall, wenn dieser parallel am gleichen Bus ( SPI ) mit angeschlossen ist, aber dessen CS nicht auf HIGH gesetzt ist, kann es auch zu Funktions- /m Übertragungsstörungen kommen.

    Hier mal bitte für Aufklärung sorgen in welchem Zusammenhang der MCP41010 mit dem AD9833 steht, und wie die aktuelle Beschaltung ausschaut, ebenso welche elektrischen Verbindungen zwischen beiden Bausteinen besteht.

    Noch dieser Hinweis in der Bibliothek utime findet man auch die Befehle sleep_ms und sleep_us welche für kürzere Verweil- / Wartezeiten besser geeignet sind wie die Verwendung eine sleep ( Sekunden ) in Verbindung mit einer Floatpoint Variable.

    Moinsen,

    Nun suche ich ein Board, welches mir die Ein- und Ausgänge schützt, aber trotzdem direkt die GPIOS des Raspy nutzt, damit ich die Interrupt-Funktion der Eingänge nutzen kann.
    Ganz genial wäre es noch, wenn das Board in einem Hutschinengehäuse (Din-Rail) verbaut wäre.

    Ich hoffe ich konnte mein Problem verständlich schildern, und bin auf eure Antworten gespannt.

    Es kommt darauf an wie viel Geld du ausgeben willst.
    - Du kannst fertige Erweiterungen verwenden, die komplex sind, aber eben auf gewisse Aufgabenbereiche zugeschnitten sind.
    -> Ein Universall Board welche alles denkbaren Anschlussskonfigurationen für deine Home-Automatisierung erfüllen wird gibt es nicht !

    Da du auch keine Angaben machst welche Lasten, in welchen Spannnungsbereichen geschaltet werden sollen, wirst du keine Antwort bekommen. Oder wirst über weitere Erweiterungen entsprechende I/O Kompatibilitäten Herstellen müssen.

    Wenn du wenig Kohle ausgeben willst, dann in erster Linie die I/O Boards auf Basis eines MCP23x17 entweder über I²C oder SPI. und den benötigten Interrupt Rückmeldeleitungen. Nur wenn es dann um Schaltlasten geht, egal welchen Spannungsbereich betreffend, musst du für entsprechende Schaltsignalverstärker /-umsetzer sorgen, egal auf welchem Weg, ob Relais, SSR, oder MOSFET-Treiber für Gleichspannungslösungen.
    Vorteil dieser MCP23x17 Portexpander - diese sind in der Basisausführung ( Adressierbarkeit ) erst einmal 8fach Kaskadierbar was dir 8 x 16 GPIOs zusätzlich bereitstellt. In der SPI Version pro weiteren CS-PIN weitere 8 dieser Expander. Alelrdings gehen dir dann irgendwann die GPIOs für die INT Rückmelde Leitungen aus. Jeder dieser MCP23x17 gibt über INT_A / INT_B für jeweils eine 8 Bit Portgegister eine Signal an den Controller zurück.
    Das bedeutet, diese 16 GPIOs des Expanders sind auf 2 Registerbänke aufgeteilt aber auch zusammengefasst, so das du bei einem INT Interrupt erst einmal dieses betreffende Register auslesen musst, welcher der 8 ,als INPUT konfigurierten, GPIOs einen Flankenwechsel gemeldet hat. Von der Notwenigkeit her muss deine SW innerhalb von 20 ms reagieren und dieses Port-Register anfragen.

    Wenn du hier die Forensuche bemühst es wurde schon viel über die Portexpander MCP23017 / 23S17geschrieben.

    Aber auch hier musst du ja nach Last, noch dafür sorgen, das diese Lasten geschaltet werden können !

    Ein Einfacher Dual Optokoppler als Eingangsschutz der INPUT GPIOs kostet um die 0,70 €, ein solcher MCP23x17 je nach Ausführung zwischen 1,60 und 2,00 € zuzüglich der Lasttreiber je ach Anzahl der benötigten Ausgänge. Also Drumrum um diesen MCP23x17 benötigst du noch eine Kodierbrücke, wenn du mehrere dieser MCP23x17 parallel verwenden willst um die Bus-Adresse einstellen zu können, einen PUllUP Widerstand für einen SW geführten Reset, einen Abblockkondensator 100nF Keramik, und eine Spannungsquelle 3,3 V die in der Summe mind. 275 mA @3,3 V Liefern kann, wenn du alle GPIOs als Ausgang nutzen möchtest. BUS-seitig zum RasPi werden noch 2 ( I²C ) bzw 4 ( SPI ) Pullup Widerstände benötigt.
    Also mit Platine ca. 35 € im Selbstbau, wenn du den Aufbau für 16 GPIOs entsprechend deiner Anforderung statisch gestaltest.

    Moinsen,

    Das kommt auf den Gesamtprozess deines µPython µC Programms drauf an. Es steht auch eindeutig im Datasheet geschrieben, das man während er ADC Meßwerterfassung keine GPIO OUT Schaltvorgänge durchführen soll, weil dieses sofort wieder die interne 3V3 CPU Spannung, und damit den Ripple-Anteil des ADC-URef Signals beeinflusst.

    Grundsätzlich kann man eine Mittelmertbildung nutzen, in dem man eine Meßreihe über einen definierten Zeitabschnitt aufnimmt, und dann den Durchschnittswert ermittelt. Allerdings ist das auch in einem gewissen Umfang schon eine Meßwertverfälschung.


    Wenn das potentiell zu bedenkende Störumfeld dann doch zu groß ist kann man auch noch die Extrema aussortieren.

    Beide Methoden eignen sich aber nicht einen wirkliche Trend zu bestimmen, oder herzuleiten, wenn es um z.B. die Bestimmung einer stetig sinkenden oder steigenden Spannung z.B. bei einem Akku geht, wenn dieser stetig entladen wird, oder durch eines externe Quelle aufgeladen wird.

    Wichtig man sollte das Ganze immer im Zusammenhang mit der Meßßaufgabe, dem Umfeld, und der zu erwarteten Meßgenauigkeit ( Ungenauigkeit ) betrachten.
    Grundsätzlich kann man nur soweit gehen, oder man sollte sich der Tatsache bewusst sein, dass dieser Onboard ADC, eines RB2040 immer gewissen Schwankungen unterworfen ist. Von der Detailabweichung ist ADC2 ( GP28 ) der genauer von allen, weil keine weiteren Funktionen mit Ausnahme eines einfachen GPIO I/O sich darüber realisieren lassen.
    Zudem kommen alle typischen Fehler eines SAR-ADCs hinzu, die als Zero-Offset-, Linearitäts- und Steigungsfehler entsprechend bestimmt und ermittelt werden können oder sollten, um die Eignung dieses ADCs für diese Meßaufgabe beurteilen zu können.
    Ganz grob als Anhalt dieser OnChip ADC wird je nach Umfeldbedingungen nur eine reproduzierbare Meßgenauigkeit zwischen 8 und 11 Bit erreichen, wenn man die VRef Einspeisung nicht größer wählt wie die tatsächliche VCC 3,3 Volt auf der PICO Platine, wenn diese über den Onboard-Spannungsregler bereitgestellt wird.

    Für solche einfachen Aufgaben ein Poti Spannungs-Wert zu bestimmen, wo das POTI selber mit aus / über diese 3V3_OUT versorgt wird, spielt das alles keine Rolle, nur wenn eine externe Spannung mit einer gemeinsamen Masse ausgewertet werden soll, muss man sich über die genannten Dinge entsprechend der Meßaufgabe die notwendigen Gedanken machen.

    Für das On_Read Wonder, mit einem einzelnen Einlesevorgang einen Spannungswert mit einem Meßfehler unter 5 % erhalten zu wollen sind von der technischen Auslegung diese RP2040 Onboard ADCs die falschen Kandidaten, wenn man keinen all zu großen Zusatzaufwand betreiben will. Meßwertschwankungen von einem BIT immer im RAW zu betrachten sind vollkommen legitim und normal, aber stellen auch das technische Limit dar, was mit SAR ADCs ohne Eingangsfilter zu erreichen ist. Grundsätzlich betrachtet man immer den RAW_Value und dessen Schwankungen, und rechnet dieses Integer-Zahl erst dann um, wenn ein Ausgabe in einer menschlich verständlichen physikalischen Größe benötigt wird. Integer Zahlen werden je nach Größe / Wert in µPython bis zu sieben mal schneller verarbeitet wie eine Float-Pojnt Zahlenkolonne. -> Das kann man alles selber mittels utime.ticks_us oder utime.ticks_cpu selber ermitteln und herausfinden, welcher Code für welchen Zweck die kürzere Programmlaufzeit benötigt.

    Moinsen

    Es hat seinen Grund, weshalb ich das ansprach. (Auf den Unterschied ca. 60k interne und den 10k externe Widerstandswerten muss ich ja sicher nicht eingehen.)

    Du hast die Physik nicht verstanden !
    In einem Spannungsteiler den der Schaltkontakt mit dem Pulldown bildet kannst du nicht einfach den Gesamtwiderstand R1 + R2 eines Spannungsteilers erhöhen, ohne dass das Auswirkungen auf die Störanfälligkeit hat !
    Denn im Detail betrachtet R1 = Schaltkontakt + R2 = Pulldown addieren sich beide Widerstandswerte zusammen ! Und nun ist es in einem Gleichstromkreis auch so, dass der Strom bei einer Reihenschaltung von Widerstandswerten an allen Stellen gleicht ist !
    Sorry, wenn du einen internen PullDown mit einem höheren Widerstandswert bewusst verwendest, dann ist der Maximalstrom auch kleiner. Also wird die Schaltung, Ausgehend davon das deine Angaben zum Internen PULLDOWN stimmen, für Störungen empfindlicher weil der fließende Strom Taster + Überbrückung des Pulldowns geringer wird.
    Sorry du kannst gerne auch in deinem so gern zitierten "Elektronik-Kompendium" nachlesen wie sich eine Spannungsteiler verhält

    Moinsen

    Der TO schrieb von der Aktivierung der internen Pulldown Widerstände und Du zeigst externe Widerstände. Das sind zwei paar Schuhe. Du verlangst von den Leuten immer präzise Äußerungen und bringst dann hier so ein pauschales Beispiel, was mit der aktuellen Schaltung des TO nichts zu tun hat.

    Es ist vollkommen egal, ob ein solcher PullUP oder PullDown intern ausgeführt, elektronisch via SW zugeschaltet, verwendet wird, oder ob er extern ausgeführt wird, wenn man die Funktionsweise nicht versteht.
    Es kann sich jeder daraus ableiten, was für seinen Anwendungsfall zutreffend ist. Allerdings und das solltest du wissen, sind Halbleiterwiderstände bezüglich ihrer Fertigungstoleranz ( Subtratausführung ) einer viel größeren Fertigungstoleranz unterlegen, wie man diese als / in diskreter Bauform herstellen kann und könnte.

    Deswegen ist es auch egal, ob der Fehler / die Fehlfunktion mit oder bei einem externen oder internen PullUp oder Pulldown auftritt, die Rahmenbedingungen für die Pegelbereiche bleiben die gleichen.
    Wenn der Widerstandswert sinkt, steigt auch der Strom der durch diesen Widerstand im Zustand geschaltet fließen muss, und damit wird auch die Schaltspannung die das positive Potential darstellt mit beeinflußt.
    Es ist ähnlich wie bei einem Spannungsteiler. Wenn der Gesamtwiderstand sinkt, fließt ein höherer Strom, das positive Potential wird stärker beeinflusst, und der thermische Verlust steigt, allerdings auch bei einer besseren Signalauslöschung gegenüber externen Impulsstörungen. Und dann umgekehrt, wenn sich der WIderstand erhöht, der Gesamtstrom verringer steigt auch die Empfänglichkeit / Empfindlichkeit gegenüber Störeinflüssen.
    Und nun kannst du dir selber überlegen was für den Anwendungsfall besser sein könnte ein interner Halbleiterwiderstand, oder statisch ist und primär sogar von thermischen Schwankungen abhängiger ist, oder ein ext. Widerstand den man ggf noch der Schaltungsaufgabe, bzw an den Einsatzfall abpassen kann ?
    Aber das führt offensichtlich zu weit, ein Problem in dieser Form konsequent bis zum Ende durchzudenken.
    Du kannst ja mal einen NTC als Halbleiterwiderstand daher nehmen und sein Verhalten bei Temperaturänderung wie es in einer CPU auftritt ( Je nach Kühlung der RasPI CPU ) und dann eine Aussage treffen, wie stabil dieser Widerstandswert ist, und welche Folgen eine solche interne Temperaturänderung auf das Schaltverhalten hat ....
    Erschrecke bloß nicht was hier schon ein Delta-T 20 K anrichten kann. Man(n) kann den Prozentsatz sogar relativ genau bestimmen, wie viele Fehlmessungen /-erfassungen in Abhängigkeit des Störumfeldes zwischen einer gut gekühlten / unter gleichmäßigen Temperaturbedingungen arbeitenden CPU und einer die nur passiv oder schlecht gekühlt ist, und man das Betriebstemperaturlimit voll ausreizt. Je nach Szenario kann die Falscherfassungsrate bei internen Eingangsbeschaltungen um bis zu 40% ansteigen, wenn diese Arbeits-/ Umgebungstempertur mit ansteigt.

    Es würde aber zu weit führen, wenn man jemanden versucht zu erklären, welche Art der Beschaltung für einen speziellen Anwendungsfall die geeignetere Variante ist, wenn man nicht einmal die internen Einflußfaktoren einer solchen internen SW schaltbaren Beschaltung verstehen will.

    Aber du scheinst ja die Umgebungsbedingungen um diesen Hühnerstall bis ins Detail zu kennen, um hier eine immer und allgemeingültige Aussage treffen zu können ?

    Moinsen

    Nein, ist es nicht! Denn er schrieb:

    Offensichtlich hast du meine Ausführung nicht wirklich verstanden. Es geht nicht um das ob oder wie, sondern um das !
    Wie erklärt man das am kompliziertesten ? ;)
    Wie mein Vorredner schon richtig sagte, oder feststellte, es geht darum das man 2 Potentiale ( + und - ) so zusammenbringt, das wenn der Schaltkontakt geschlossen wird nur über diesen Pullup oder Pulldown ein "Kurzschluss" bewusst herbeigeführt wird. Welcher Strom dabei fließt wird in diesem Fall nur von diesem Widerstand bestimmt.
    Jetzt haben wir noch 2 Dinge die man beachten sollte.
    Das eine ist die Tatsache, das ein höherer Stromfluß immer einen Spannungsabfall automatisch nach sich zieht. Wie groß dieser resultierende Spannungsabfall ausfallen wird, ist wiederum vom Strom und damit der Widerstandsgröße abhängig. Und jetzt kommen wir zu dem Punkt, welcher Strom bei welchem Widerstandswert und bei welchem Spannungsunterschied fließt.
    Hier kommen wir auf den Punkt, dass auch P = U * I gilt. Damit kann man berechnen für welche Leistungsklasse dieser Widerstand ausgelegt sein muss. Man kennt zwar bei diesem Punkt den Widerstandswert des internen Halbleiterwiderstands, aber nicht dessen tatsächliche Belastbarkeit. ( Nur mal im Hinterkopf behalten bitte ).

    Nun zum zweiten wichtigen Punkt, die sg Pegeltabelle für digitale Signale.

    Wenn ich nun einen Pullup verwende und der Ruhepegel auf High liegt muss mit der Tastterbetätigung der Pegel auf mind. unter 0,8 Volt abfallen, damit dieser auch als LOW Signal erkannt wird. Das heißt, man muss über diesen Widerstand einen Spannungsabfall /-unterschied /-absenkung um mind. 2,5 V herbeiführen ( anliegende Vcc von 3,3 V ).

    Drehen wir nun den Spieß rum und verwenden einen Pulldown mit einem Ruhepegel von 0 V reicht es, das schlußendlich mind. 2,0 V an diesem GPIO Eingang ankommen müssen um sicher als High Pegel erkannt zu werden. Damit beträgt das Spannungsdelta zwischen beiden Schaltzuständen nur noch ;) 2,0 V.
    Wenn wir nun noch das ganze Drumherum betrachten, was ich vereinfacht und zusammenfassend mit Kabel- oder Kontaktwiderstand bezeichnen möchte, ist es einfach eine Sache der tatsächlichen Umgebungsbedingungen.


    Betrachten man den Vorgang unter diesen Gesichtspunkten ist es rein von der Betriebssicherheit einfacher und geschickter das Schaltverhalten "to High" zu verwenden. Hier ist der Toleranzbereich des HIGH-Pegels eindeutig größer. Wenn man das Projekt und die Projektbedingungen kennt, ggf. mit Korrosion an den Übergangsstellen zum Taster / Schaltkontakt über einen gewissen Betriebszeitraum zu rechnen ist ( Erhöhung des Übergangswiderstandes ) dann erreicht man trotz dieser Langzeitveränderung einen längeren, störungsfreien Betrieb.
    Aber ! was auch schon erwähnt wurde ist das Umfeld, und eine mögliche Störeinstrahlung durch elektromagnetische Felder ( Radiowellen ). Deswegen, ohne eine Umfeldbetrachtung zu machen, pauschalisiert zu sagen dieser oder Jener Aufbau ist der bessere, wäre eine Anmaßung.

    Ist der Energieeintag durch ein solches Störfeld sehr groß, was wieder vom Widerstandswert RPullDown mitbestimmt wird, kann die Beschaltung mit einem Pulldown-Widerstand empfindlicher sein, und vermehrt Falschimpulse herbeiführen, weil das zu überwindende Spannunsgdelta geringer ist.

    Deswegen existieren beide Varianten nach wie vor gleichberechtigt parallel.

    -> wenn der TO in seinem Hühnerstall keine "Hochleistungsradiosender" ;) betreiben will, die Außenkontakte des Schaltelements nicht durch eine massive Nickel- oder Goldschicht dauerkorrosionsgeschützt sind, also mit einer frühzeitig beginnenden Oberflächenkorrosion ( Aggressivität von Vogelkot ) zu rechnen ist, dann ist die Beschaltung des Tasters mittels PullDown grundsätzlich der Beschaltung mit einem PullUp vorzuziehen.

    Keiner von uns kennt die genauen Gegebenheiten vor Ort beim TO, deswegen muss in erster Linie der TO entscheiden, für welche Version der Tasterbeschaltung er sich entscheidet.

    Moinsen,

    Was ich nicht weiß ist, wie ich die Sensoren messen kann, ob sie wirklich geöffnet oder geschlossen sind, da ich beim Anschluß des Multimeters ja keinen Strom durchfließen lassen kann. Was misst man denn da? Den Widerstand und in welchem Bereich bewegt der sich? Ich kann am Multimeter ja verschiedene Widerstandsgrößen einstellen, z.B. 20 Ohm, 200 Ohm, etc. Muss ein Widerstand da sein, wenn der Sensor offen oder geschlossen ist?

    Grundsätzlich ist es wie du sagst besser einen definierten Zustand am GPIO herbeizuführen, ob das durch einen PullUp oder einen PullDown geschieht ist von der Sache her egal. Man muss nur entsprechend bei der Abfrage der GPIOs aufpassen, bzw die Logik umkehren.

    Wenn du nun deinen, wahrscheinlich Reed-Kontakte so beschaltest kannst du mit einem Multimeter am hier dargestellten GPIO-Ausgang eine Spannung gegen Masse am RasPI messen. Wenn der Taster / Reed-Kontakt oder Hallsensor keinen Stromfluß ermöglicht offen ist, kann man am GPIO keine Spannung ermitteln. Wird dieser Kontakt nur geschlossen, liegt wegen des geringeren Widerstands im "Button" = Kontakt ein Spannung von Nahezu der Vcc an. Wie bekannt ist nimmt der Strom primär immer den Weg des geringsten Widerstands fließt als zum GPIO. Der Leckstrom über den PullDown Widerstand kannst du ganz einfach vernachlässigen.

    Moinsen,

    Du kannst mit den C parallel zur VRef Einspeisung etwas herumspielen. Um den Signalmix aus interner 3V3 und der eingespeisten Spannung etwas zu beruhigen. Es wird dir aber nicht zu 100% Prozent gelingen, weil hier zwei Faktoren aufeinander treffen. Zu einem:
    - wenn die interne 3V3 Spannung immer noch größer / höher ist wie die eingespeiste VRef kannst du gegen das verbleibende Ripple welches mit dem RT6150B zwangsläufig entsteht nicht viel machen. Du kannst GPIO23 auf HIGH setzen, verlierst aber dabei auch die Strombelastbarkeit der GPIOs, Das Ripple wird damit zwar geringer ist aber nicht weg.
    - Und dann darfst du mit dem C13 im Verbund keine RC Schwingkreis aufbauen.

    Nochmals :nur wenn die VREF an Pin35 meßbar 0,05 V größer ist wie die interne Vcc V3V3 hast du eine Chance das Ripple aus der in den RP2040 gehende ADC-AVDD nahezu durch weitere C an Pin 36 und Pin 35 soweit zu reduzieren, dass dieser Rest in der allgemeinen Meßungenauigkeit untergeht.
    Oder du verzichtest ganz auf ein Board-Einspeisung via der Pin 39/40 + Vref Pin35, und speist eine ausreichend geglättet Versorgungsspannung 3,3 V direkt in den Vcc 3V3 Strang ein, so dass deine VREF schon über R7 Ripplefrei zum RP2040 gelangt.

    Moinsen,

    Somit ist dein MAX nicht mehr 3,24V (65535) sondern 2,998V (60430).
    Was die raw Werte Anzeigen ist richtig, für den Pico ist 3,24V das MAX, du musst halt dann nur mit dem MAX Wert von 60430 intern umrechnen.

    Was hat die Referenzspannung gemessen und eingetragen mit der Auflösung des ADCs zu tun ?
    Wenn ich einen ADC dahernehme egal ob SAR oder Delta-Sigma, dann änderst sich doch nichts an der Auflösung, wenn ich die Referenzspannung ändere.
    Es gilt immer: Auflösungsschrittweite = Referenzspannung / Auflösung in Bit -1
    Im Ergebnis muss man ohne interne baulich bedingte Meßfehler zu betrachten mit
    Gemessene Spannung( berechnet ) = Referenzspannung / ( Auflösung in Bit - 1 ) * Meßrohwert ( Value)
    zu seinem Meßergebnis in Volt kommen.

    Moinsen,

    Eigentlich sollten folgende Schaltplanausschnitte aus dem Datasheet PICO ausreichend Informationen vermitteln, die ich auch schon oben genannt hatte um zu einer folgerichtigen Erklärung zu kommen !

    Erstens: diese 3V3 Voltage welches über den Pin 37 eingespeist werden kann umgeht das Problem des Ripple des RT6150B in gewissen Umfang, auch im Kombination mit dem Setzen des GPIO23 auf High um den Arbeitsmode von PFM auf PWM zu ändern.

    Wie man sehen kann entsteht immer ein Signalmix, wenn der Spannungswandler auf dem Board aktiv ist, also auch eine Einmischung des Ripple in das VREF Signal wenn dieses via Pin35 aus einer ext. Spannungsquelle eingespeist wird. Nur, aber nur dann, wenn die eingespeiste Spannung an Pin35 ( ext. VREF Quelle ) größer ist wie die resultierende und nachzumessende Spannung an Pin36 (3V3_OUT) kann man mit einem 180nF Kerko an Pin35 das Ripple des Mixed Signals aus 3V3( Onboard meist um die 3,25 V ) mit einer VREF Spannung von 3,3 V soweit reduzieren, das die Auswirkungen des Ripple innerhalb des Meßfehlers des ADCs liegt. Geht man unter die Spannung des RT6150B ( Ausgangsspannung ) addiert man nach wie vor das Ripple dieser Spannung auf die kleinere eingespeiste VREF auf.
    Man verringert damit zwar die Maximale Eingangsspannung am ADC, erreicht eine feinere Detailauflösung , hat aber das Problem, das je nach Temperatur und anderen Lasten ( GPIO Stromentnahme ) die Schwankungen der anliegenden Referenzspannung am RP2040 Eingang größer werden wie die beabsichtigte Auflösungsverbesserung.

    Wenn man sich zudem die Kennlinien dieses ADCs anschaut, mehr als 2% Punktuelle Meßgenauigkeit und mit dem Zero-Offset-Fehler und dem Anstiegsfehler / Linearitätsfehler 5-7% auf den gesamten Meßbbereich 0 V bis VRef sind nicht machbar, wenn die VREF ( eingespeist via Pin35 ) nicht größer ist wie die Spannung ( Boardspannung )3,3 V nachzumessen an Pin36 ).
    Mit der Einspeisung einer ext. Ref.Spannung mind. 0,05V größer der Onboard Spannung 3,3V Nenn- , einem Kondensator an Pin35 kommt man auf den gesamten Wertebereich auf etwas 3,5% Genauigkeit. Das bedeutet nichts anderes, alle PICO Platinen deren 3V3_OUT Spannung (Pin36) größer ist wie 3,25V (Leerlauf ) kann man beiseite legen.

    Bezüglich der Meßtoleranz, wenn man erst einen 12 Bit Wert auf 16 Bit interpoliert, um ihn dann wieder kleinzurechnen kommen auch noch die ganzen Nachkommastellenfehler in der Berechnung hinzu.

    Wenn man wirklich beabsichtigt, und einem 12 Bit ausreichen, auch mit der Referenzspannung flexibel sein will, würde ich zu einem I²C ADC MCP3221 raten, bei diesem ist Vcc = VRef, und einer entsprechend genauen ext Referenzspannungsquelle zB MCP1501 Serie, oder MCP1525/1541 diesen direkt zu betreiben, dazu benötigt man zwar noch für SDA und SCl einen Levelshifter aber man bekommt sehr sehr stabile und konstante Meßwerte. Selbst mit µPython erreicht man dieser abgesetzten Lösung via I²C ein konstante Samplingrate von um die 16,8 ksps.

    Man sollte bei der ADC PICO Onboard-Lösung niemals vergessen, das jede parallel GPIO Nutzung ob als Bus-Master HOST , oder als PWM Ausgang, oder als nur reiner Schaltausgang immer und unmittelbar eine Folge / Reaktion auf den RT6150B mit sich bringt, und damit aktiv zur Schwankung der Onboard-Referenzspannung beiträgt.

    Moinsen

    Wie wäre es mit einer Pumpe, einem Durchflussmesser und dann zwei Ventile, um den Wasser/Düngerbehälter zu wählen.
    (Alternativ zwei Pumpen, ein oder zwei Durchflussmesser und, falls nicht schon die Pumpen den Rückfluss verhindern, noch zwei Rückschlagventile.)
    Dazu vier Ventile für die Auswahl der Pflanzen.

    Rein von der Einsparung der Bauteile magst du durchaus recht haben. Nichts gegen deine Idee einzuwenden.
    Wenn ich das richtig verstanden habe, sagt dein Vorschlag aus, eine Saugleitung geht in jeden Tank, wird über ein solches Ventil freigeben, und nach den beiden Ventilen ( Parallel ) befindet sich ein Y Stück was dann zur Pumpe und anschließend zur Durchflusssensor führt und dann geht das wieder auf eine Verteilerleiste wo vier weitere dieser Ventile den Ausfluss zu den einzelnen Pflanzen bestimmen.

    Ich gehe soweit mit, aus Strömungstechnischer Sicht, dass das Ganze dann funktioniert, wenn beide Flüssigkeiten die annähernd gleiche Viskosität haben. Aber wie willst du in dem Trakt ab dem Y Abzweig nach den beiden Ventilen in der Ansauggruppe sicherstellen, dass falls der Bedarf bestehen sollte, das auch nur klares Wasser oder Flüssigkeit 1 zu den Pflanzen geleitet werden soll, das sich in der Pumpe, dem Sensor und dann wieder der Vierfachverteilung keine Rückstände der beigemischten Flüssigkeit ( Dünger ) absetzen ?

    Ich frage nur mal so, weil ich konnte aus den bisherigen Angaben nicht entnehmen, das alle Pflanzen immer und ständig die gleiche Mischung aus Wasser und Düngemittelzusatz bekommen. Mein Hintergedanke zu dieser Frage, nicht jeder Pflanzenart bekommt eine Überdüngung besonders mit Universaldüngern.
    Diese Frage oder der Gedanke ist nicht nur an dich gerichtet, sondern auch an den TO, weil ich erkenne jetzt keinen wirklichen Sinn, ständig und bei jeder Flüssigkeitsgabe auch Düngemittelzusätze zu verwenden. Ausnahme es handelt sich um Nährstofflosungen die nur nachgefüllt werden müssen. Aber in diesem Fall das die Pflanzen in Nährstofflösungen gehalten werden und keine echte Erde ( Boden ) sehen und haben, fehlt mir für diese Art der Pflanzenzucht die entsprechende Sensorik.

    Moinsen,

    Ein Pico , dazu eine Treiberplatine MOSFET für jeweils 2 Pumpen und die Rückmelder auf 2 Kanäle aus den Durchflussmenngenmesser beschränken . Damit spart man PINs.
    Dann oder dazu je Kreis 4 Ventile , die jeweils zu einem gemeinsamen Ausfluss führen.
    Damit kann man trotzdem über 2 Pumpen Gleichzeitig jeweils 2 Pflanzen bewässern / Düngen und dann nur die Ventile Umschalten.
    Auf Relais würde ich komplett verzichten denn diese altern bei Gleichspannungslasten immer, mehr oder minder schnell.

    Moinsen

    Das ist eigentlich der Falsche Steuerungsansatz. Sorry das ich das so sage, das ist eine Aufgabe für einen µC.

    Du musst erst einmal dafür sorgen, dass die Zählimpulse vom den Durchflussmengenmessern in 3,3 Volt Kompatibler Spannung, jedoch bei einer Vcc von 5 Volt auch bei der Auswerteeinheit ankommen.

    Moinsen

    nichts für ungut, aber du hast das Thema trotzdem verfehlt.

    Wenn du die Ursache dieses Fehleintrags in deiner Meßreihe nicht ermitteln kannst, um diesen ggf abzustellen, was willst du dann hier mit einer "Checksummenlösung" erreichen ?
    Begründe doch einmal welchen Sinn es machen soll, wenn du in die Übertragung eine Checksumme einbauen wiilst, der Fehlergrund aber ein ganz anderer ist ?

    Man betrachtet immer die gesamte Signalkette, vom Sensor, über die Auswerteeinheit, über die Übertragungseinheit, über die Empfangseinheit bis hin zu Datenbereitstellung für diese "Aufzeichungssystem".

    Du muss es nicht machen, du kannst machen was du willst, aber dann frage in Zukunft einfach nicht mehr nach was man gegen solche "Fehlerfassungen" machen kann.

    Sorry, ich mache das schon zu lange und beschäftige mich vornehmlich mit solchen Signalketten sowohl für analoge wie auch digitale Sensorik, und kenne die Fallstricke. Das was du machen ist ist eine Symptombekämpfung, nicht eine Ursachenabstellung !

    Daher sage ich einfach mach was du willst, du scheinst auf dem Gebiet ein überlegenes Fachwissen vorzugeben, stolperst aber schon über die einfachsten Grundsätze wie man ein Sensorwert-Fernübertragung in der Ereignis- und Signalkette richtig projektiert. Also mach einfach, wenn du eine Gesamtanalyse des Erfassungs- und Übertragungs- sowie Erfassungsprozesses scheust.