Hallo Gemeinde Bin gerade dabei eine Strommesung mit dem INA219 aufzubauen. Das Modul für mein System ist fertig und möchte in Betrieb gehen. Das Datenblatt aheb ich schon "studiert". Leider gibt es zahlreche Probleme damit. So z.B. das einstellen der Register, welches Register für was, auslesen der 16 Bit Werte, Kalibrierung usw. Kennt jemand ein gutes Tut dazu oder Anleitung. Vielleicht auch ein kleines Beispiel in C (nicht Arduino) zum testen und lernen. Bin für jede Hilfe dankbar. achim
Hmm... bisher hat Dir keiner helfen können - ich selbst kenne den IC nicht. Was hat Dich denn bewogen, Dich mit genau diesem zu beschäftigen? Von null(!) anfangend wären meine(!) ersten Schritte: Kommunikation via I²C - antwortet der IC mit einem ACK auf seine Adresse? Auslesen des Configuration Registers (Adresse 0x00). Sollte nach dem PowerUp 0x399F sein Mode auf Bus Voltage Continous setzen Bus Voltage Register (wiederholt) lesen (Ergebnis ausgeben lassen) Welche Erfolge konntest Du denn bereits erzielen? Anmerkungen: der IC besitzt 6 (16bit-)Register (Configuration, Ushunt, Ubus, Pshunt, Ishunt, Calibration) der Schreib-/Lesepointer inkrementiert nicht - einmal gesetzt sollte(!!) sich auf dasselbe Register also wiederholt zugreifen lassen. (welchen Wert dieser Pointer nach dem PowerUp besitzt, ist mir(!) nicht klar (habs nicht gefunden) - im Zweifelsfall also immer erstmal schreiben. Beschreiben kannst Du eines (der beiden beschreibbaren) Register in einem Rutsch (also SLA+W, Register-Adresse, DataMSB, DataLSB) - beim Lesen kann nur das, durch den Pointer referenzierte Register gelesen werden (mit SLA+R, DataMSB, DataLSB) nach dem Schreiben eines Registers benötigt der IC 4µs, um die Werte zu übernehmen. Wenn bis hier die generelle Kommunikation klar ist, kann man sich mit den Einstellungen im Configurations- und Calibrationsregister auseinandersetzen...
Hmmm.. Es gibt fuer den arduino libs, die den ina219 behandeln. Reinschauen lohnt sich, allein wegen den Registern und die reihenfolge. Die i2c Kommunikation kann man dann selbst bewerkstelligen. http://henrysbench.capnfatz.com/hen...urrent-sensor-voltmeter-tutorial-quick-start/ 73 addi
Hallo Danke für eure Antworten. In Arduino Kreisen soll dieser IC sehr weit verbreitet sein. Vom Hersteller gibt es auch ein Demo dazu. Im gesamten Netz beziehen sich alle darauf. Es gibt aber so gut wie keine Erklärung oder so was dazu. Du hast das Datenblatt gut zitiert. Am meisten gefällt mir an diesem IC das er einen so weiten Bereich (relativ) hat. Vom Aufbau und Anwendung passt er sehr gut in mein System. Damit kann ich dann endlich messen warum manche Module an der Grenze arbeiten. Ist mir schon klar das 256 LEDs einiges an Strom brauchen. Aber wieviel zieht ein 3,2 Zoll TFT Farb Display? Das weiteren sind die Register. Möchte lernen damit zu arbeiten und die 16 Bit Wörter zu lesen und zu verarbeiten. Ist allerdings ein recht grosser Umfang. Der eigentliche Aufbau des ICs ist für Baster schwer zu händeln, da kam mir der Aufbau des Hersteller ganz recht. - Die Hardware ist komplett aufgebaut und läuft korrekt - Der IC kann mit einem Bus Scanner die Adresse ausgelesen werden - der I2C läuft also ohne Probleme. Benutze die Dateien von Peter die sich seht bewährt haben Leider funktioniert das setzen der Register nicht und es kommen keine Werte zurück. Habe einen Artikel aus dem englischen gefunden, der die komplette Berechnung erläutert. Ist sehr gut beschrieben. Kenne keinen anderen IC (in dieser Art) der eine Kalibrierung zulässt. Habe mir die Dateien von Henry runter geladen und werde sie auseinander nehmen. das Problem liegt auch in diesen Dateien. Sind in C++ geschrieben und der Rückbau auf nur C fällt mir halt schwer. Wieder bin ich bei der Kalibrierung. Habe nichts in den Dateien dazu gefunden (übersehen?) Daher bin ich sehr dankbar für jede Hilfe dazu achim
hmmm...glaube nicht, das es schwierig werden könnte. schau dir einfach die werte an, die diese lib in die Register reinschiebt. integer etc bleiben gleich, da solltest du drauf abheben. wo werden die variabeln mit welchen werten versehen und wo werden diese hingeschoben? 73 de addi
Damit bist Du Dir bezüglich der Hardware und der Adresse sicher. Wäre also zu klären, warum Du mit der Bibliothek nicht hinkommst. Wie gesagt - mein(!) nächster Schritt wäre, erstmal das Konfigurationsregister lesen zu lassen, und zwar mit der final zu verwendenden Leseroutine. Wenn möglich unter Verwendung eines Logicanalyzers. Zum auslesen mußtest Du übertragen lassen: Startcondition SLA+W 0x00 Stopcondition Um den Pointer auf das Konfigurationsregister zu setzen, dann mindestens 4µs warten, und dann übertragen lassen: Start SLA+R 8 Clock-Strobes 8 Clock-Strobes Stop Also die Strobes als ein Byte lesen. Für Euch C-ler mag es natürlich sinniger sein, 'ne vorhandene, funktionierende(!) Bibliothek "auseinanderzunehmen" - ich könnte mich nur bemühen(!), das mithilfe des Datenblattes komplett selbst zu erarbeiten... In C oder Arduinesisch arbeite ich mich nicht ein...
Seite 16, Figure 15 & 16. Es muß immer zuerst geschrieben werden. (Welchen Bezug das jetzt zu Figure 19 hat ist mit nicht klar) Die Register 1 bis 4 können nur gelesen werden, also muß man wohl nach schreiben der Adresse und des Registerpointers einen Repeated-Start ausführen um dann das jeweilige Register zu lesen. Das ist wohl nur bei höheren Übertragungsraten relevant, bei 100 kHz dauert ein Bit ja schon 10µs. (Edit: Steht ja auch im Datenblatt: when using SCL frequencies in excess of 1 MHz) Es empfiehlt sich, nach der Initialisierung zuerst das Bus Voltage Register (02) zu lesen, weil es das Conversion Ready Bit enthält.
Und nochmal genauer: Beim Schreiben (SLA+W) ist das erste gesendete Byte (nach SLA+W) immer der (neue) Pointer; ein eventuell folgendes Word wird in das damit referenzierte Register geschrieben. Beim Lesen hingegen wird sofort nach dem SLA+R gelesen, und zwar das Register, wo der Pointer grad hinzeigt. Soll ein anderes Register gelesen werden, muß vorher der Pointer umgeschrieben werden, sonst kannst Du aber das Register beliebig oft lesen (ohne den jedesmal Pointer neu zu schreiben). Der Pointer besitzt wie gesagt kein Autoinkrement/-dekrement. Streng nach dem Datenblatt muß also der Pointer vor dem ersten Lesen beschrieben werden - aber irgendwohin sollte der Pointer ja nach dem Powerup zeigen. Möglicherweise auf irgendwas zufälliges, möglicherweise 0x00. Mich würde übrigens nicht wundern, wenn da sogar nur die minderwertigsten drei Bit relevant sind. Ich denke, daß damit gemeint ist... Jedes Register kannst Du lesen, indem Du erst den Pointer auf die Adresse setzt (Start, SLA+W, Adresse, Stop) und danach das Register liest (Start, SLA+R, Readbyte, Readbyte, Stop). Zum repeatet Start gibt es keine Figure, aber auf Seite 14/15 findet sich: Den Start nach dem Pointer schreiben könnte man auch als repeated start verstehen - Stops werden ja leider nicht weiter erwähnt. Möglicherweise muß aber vor dem Start wirklich'n Stop kommen, also zwei Telegramme... Zu den 4µs: achim hat nicht geschrieben wie schnell er unterwegs ist. Die Länge der Pause soll mindestens 4µs betragen. Wenn die bereits durch das Protokoll gesichert sind, klar. Aber grundsätzlich stört 'ne längere Pause nicht, und achim will erstmal überhaupt was lesen... (wobei das eh nur die Übernahme der gesendeten Werte in die beschreibbaren Register betrifft.) Wenn das Konfigurationsregister erfolgreich ausgelesen werden konnte, würde ich als nächstes das Kalibrationsregister lesen (0x00 wäre zu erwarten), anschließend mit irgend'nem anderen Wert beschreiben, und diesen dann zurücklesen lassen...
Spielt im Prinzip keine Rolle. Um irgendwas sinnvolles mit dem Teil anzufangen (es interessieren üblicherweise wenigstens der Strom und oft auch noch die Leistung), müssen eh zuerst das Calibrationregister und meistens auch noch das Configurationregister beschrieben werden. Das mit Figure 19 ist wohl ein Druckfehler. Auf Seite 14 steht schon: In Figure 18 wird nach dem Registerpointer ein Stop gesendet. Wird wohl beides gehen. Wenn kein Stop gesendet wird, wird Start als Repeated Start angesehen und anschließend wird sowieso die Adresse mit R-Bit (R/W = high) gesendet und dann werden die beiden zu lesenden Bytes empfangen. Nein, aber vermutlich nicht mit mehr als 1MHz. Denn dazu müßte er erstmal in den High-Speed-Mode umgeschaltet haben.