Arduino-Schnittstelle mit I2C-Drucksensor

Ich habe einen Honeywell ASDXRRX100PD2A5 I2C-Drucksensor, den ich mit einem Arduino lesen möchte.

Wenn ich mir das Datenblatt ansehe, weiß ich, dass die I2C-Adresse 0x28 ist, und ich habe mit Code-Bits gespielt, die ich im Internet gefunden habe, aber keiner davon ergibt einen Sinn. Die Zahlen steigen, wenn ich den Druck erhöhe, aber nicht auf der im Datenblatt angegebenen Skala.

Hier ist ein Link zu diesem Datenblatt: http://www.farnell.com/datasheets/1676926.pdf

Hier ist ein Datenblatt mit Informationen zur Kommunikation mit Honeywell-Sensoren über I2C: http://sensing.honeywell.com/index.php/ci_id/45841/la_id/1/document/1/re_id/0

Ohne in der Vergangenheit viel Erfahrung mit I2C zu haben, fällt es mir schwer, mich damit zurechtzufinden.

Hier noch ein Bild von meinem Setup:

Meine Einstellung

Der Code, den ich im Moment zum Testen verwende, lautet wie folgt:

#include<Wire.h>
#define sensor 0x28 //Unique bus address 

void setup()
{ 
  Wire.begin();//Wakes up I2C bus 
  Serial.begin(9600);
}

void getdata(byte *a, byte *b)
{
  //Move register pointer back to first register
  //Wire.beginTransmission(sensor);
  //Wire.write(1);
  //Wire.endTransmission();
  Wire.requestFrom(sensor,2);//Sends content of first two registers
  *a = Wire.read(); //first byte recieved stored here
  *b = Wire.read(); //second byte recieved stored here
}

void showdata()
{
  byte aa,bb;
  float pressure =0;
  getdata(&aa,&bb);
  Serial.print("byte 1: ");Serial.println(aa,DEC);
  Serial.print("byte 2 ");Serial.println(bb,DEC);
 delay(1000);

}

void loop()
{
  showdata();
}

Ich erhalte die folgenden Ergebnisse bei den folgenden Drücken:

0psi    byte1: 31
        byte2: 246

10psi   byte1: 34
        byte2: 102

20psi   byte1: 32
        byte2: 30

30psi   byte1: 39
        byte2: 167

Jede Hilfe, die mich in die richtige Richtung weist, wäre sehr dankbar.

Der Drucktyp 100PD ist im angegebenen Datenblatt nicht vorhanden. Es könnte anders sein. kannst du nochmal nachschauen
Ich habe das auch bemerkt, aber ich vermute, es ist nur ein Beispiel, da das Modell, das ich habe, 100 psi ist. Hier ist der genaue Sensor, den ich von Element14 gekauft habe: uk.farnell.com/honeywell-sc/asdxrrx100pd2a5/…
Wie ist das I2c-Softwareprotokoll? Ist es nur ein einziger Lesevorgang dieser bestimmten Adresse (0x28)? Haben Sie eine Zuordnungstabelle für i2c-Werte und tatsächlichen Druck?
Auf Seite 4 des Datenblatts zeigt Tabelle 6 die Sensorausgabe bei signifikanten Prozentsätzen. Ich schaue, um in der Lage zu sein, etwas in dieser Richtung zu lesen.
Welcher Skala folgen die Zahlen und ist sie linear? Vielleicht könnten Sie einige Beispiele dafür posten, was Sie bei unterschiedlichem Druck erhalten.
Ich habe den Beitrag bearbeitet, um dies zu zeigen.

Antworten (4)

Was ist falsch?

Der Sensor ist differentiell, bis zu 100 psi.
So P M ich N ist -100 psi, P M A X ist +100 psi.
Insgesamt 14 Bit (von 0 bis 2 14 -1),
P M ich N liegt bei 10%, also Ö U T P U T M ich N ist 1638
P M A X liegt bei 90%, also Ö U T P U T M A X ist 14745

aus dem Datenblatt:

P = ( Ö U T P U T Ö U T P U T M ich N ) ( P M A X P M ich N ) Ö U T P U T M A X Ö U T P U T M ich N + Ö U T P U T M ich N

  • du zuerst Ö U T P U T Wert ist ( 31 256 ) + 246 = 8182
    laut Datenblatt beträgt der Druck:
    ( 8182 1638 ) ( 100 ( 100 ) ) 14745 1638 100 0,14496071
  • Ihr zweiter Wert ist ( 34 256 ) + 102 = 8806
    ( 8806 1638 ) ( 100 ( 100 ) ) 14745 1638 100 9.376669

    Präzision ist nicht so gut, aber noch akzeptabel
  • Dritter Wert: ( 32 256 ) + 30 = 8222
    ( 8222 1638 ) ( 100 ( 100 ) ) 14745 1638 100 0,46540017

    etwas schief geht, es ist nicht wie 20 psi, es ist wie 0 psi.
  • Vierter Wert: ( 39 256 ) + 167 = 10151
    ( 10151 1638 ) ( 100 ( 100 ) ) 14745 1638 100 29.900053
Ich habe in Ihrem Beitrag eine ziemlich umfangreiche Bearbeitung vorgenommen, um die Ausdrücke im LaTeX-Stil (MathJaX) zu formatieren. Würden Sie bitte nach Fehlern suchen? Danke! Auch ist der 2. Bezug wirklich zu Ö U T P U T M ich N oder zu Ö U T P U T M A X ?
Vielen Dank. Das war meine erste Antwort, beim nächsten Mal verwende ich die Formatierung.

Sie müssen wahrscheinlich Pull-up-Widerstände zu den I2C-Takt- und Datenleitungen hinzufügen. Das sagt das Datenblatt 1   k Ω ist das Minimum, also vielleicht versuchen 2.2   k Ω . Die Widerstände sollten von den Pins zur +5V-Versorgung gehen.

Seitdem habe ich diese Widerstände hinzugefügt und habe immer noch Probleme, die Daten zu verstehen.

Ich habe den Differentialsensor ASDXRRX010ND2A5 mit I2C-Schnittstelle. Es gibt Ihnen 2 Bytes Daten, die Sie kombinieren müssen, um die Ausgabe zu erhalten.

Dies ist mein Testcode, der eine Ausgabe von etwa 8190 ergibt, wenn kein Druck ausgeübt wird. Laut Datenblatt ist der Ausgabewert die Differenz zwischen den 2 Ports.

    //Sensor ASDXRRX010ND2A5

#include <Wire.h>

float a, b, Output, Pressure;
const long OutMax = 14745, OutMin = 1638;
const long PressureMax = 10, PressureMin = -10; //Inches of H20

void setup() {
  Wire.begin(0x28);

  Serial.begin(9600);
}

void loop() {
  Wire.requestFrom(0x28, 2);
   a = Wire.read();
   b = Wire.read();
  Output = BitShiftCombine(a , b);

  Pressure = (((Output - OutMin) * (PressureMax - PressureMin)) / (OutMax - OutMin)) + PressureMin;

  Serial.println(Pressure); //Inches of H20
  delay(100);

}

long BitShiftCombine( unsigned char x_high, unsigned char x_low)
{
  long combined;
  combined = x_high;              //send x_high to rightmost 8 bits
  combined = combined << 8;       //shift x_high over to leftmost 8 bits
  combined |= x_low;              //logical OR keeps x_high intact in combined and fills in rightmost 8 bits
  return combined;
}

Ich kann das nicht wirklich verstehen. Besonders der Wert von 20 PSI wirkt verdächtig, da er niedriger ist als der Wert bei 10 PSI. Sicher, dass es nicht 37 ist?

Jede, dies ist eine Differenzmessung, also vermute ich, dass 32, 0 die Hälfte der Skala ist, 63, 255 oben (die maximale Skala ist 63 * 256 + 255 = 16383 (oder 3FFFh)).

Also sollten Sie von jedem gemessenen Wert 32*256 = 8192 subtrahieren.

Der Wert von 0 PSI ist 32,246, der vollständige Wert ist 8438, also wäre der Druck (immer noch dezimal) 8438 - 8192 = 246. Wenn die maximale Skala (jede Seite von 8192) 8192 entspricht, wäre dies 246/8192 = 3,0066 psi. Restdruck? Oder sollte es 31.246 sein?

Der 30-PSI-Wert 39, 167, ist wirklich 10151, dann 10151-8192 = 1959. Dies ist 1959/8182 von 100 PSI, also 23,9 PSI.

Der 10 PSI Wert 34, 102, ist wirklich 8806, dann 8806-8192=614. Dies ergibt 614/8192 von 100 PSI = 7,5 PSI

Wenn die erste Zahl für 20 PSI 37 wäre, wäre die Zahl hypothetisch 9502 oder 9502-8192 = 1320 positiv oder 1320/8192 von 100 PSI = 16 PSI

Könnte das eine gute Erklärung sein?

Hier ist ein Screenshot einer Tabelle:

Geben Sie hier die Bildbeschreibung ein

Mmm. 0 PSI ist weit weg. Vielleicht war der Wert 31.246? Das gibt:

Geben Sie hier die Bildbeschreibung ein

Was mich vermuten lässt, dass Sie vielleicht mehrmals lesen sollten, bis zwei aufeinanderfolgende Werte zusammenfallen? Beachten Sie, dass es unwahrscheinlich ist, dass Sie 31 und 32 wegen eines Pull-up-Widerstands oder so verwechseln. 31 sind 5 aufeinanderfolgende Einsen, während 32 nur eine Eins ist [;-)]. Außerdem liegt der 0PSI-Wert wirklich außerhalb des Kalibrierbereichs des Herstellers, der von 10 bis 90 % reicht.

Bearbeiten : Ich bezweifle, dass Sie Lesefehler haben (obwohl ich die Möglichkeit natürlich nicht ausschließen kann). Um dies zu beurteilen, schlage ich vor, dass Sie versuchen, sagen wir 100 Messungen unter denselben Bedingungen durchzuführen - dh demselben Druck. Am einfachsten wäre es bei 0 PSI. Versuchen Sie, den Test ohne Pause durchzuführen, dann mit 100-ms-Intervallen oder so. Suchen Sie nach Sprüngen größer als 1 in den kombinierten b1 und b2 (dh in der Zahl b1*256 + b2.

Ich habe andere Codeteile mit unterschiedlichen Ergebnissen ausprobiert, könnte es also sein, dass der von mir verwendete Code falsch vom Sensor gelesen wird?
Ich habe dieses Datenblatt gefunden, das sich auf die I2C-Kommunikation mit Honeywell-Sensoren bezieht. Ich werde es der Hauptfrage hinzufügen: sensing.honeywell.com/index.php/ci_id/45841/la_id/1/document/1/…
Ich habe der Antwort einen Vorschlag für einen Zuverlässigkeitstest hinzugefügt.
Auch die Berechnungen aus der Anwendung bestätigen meine Berechnungen, mit dem Unterschied, dass ich den Offset beim Auslesen abgezogen habe, während das Datenblatt vorschlägt, dies beim Druckwert zu tun.
Seitdem habe ich die Anzahl der gelesenen Bytes erhöht. Es scheint, dass Byte 15 4 pro psi ist, also würden 10 psi als 40 angezeigt, 20 psi als 80. Es scheint das einzige Byte zu sein, das ich als konsistenten Messwert erkannt habe. Aber es geht nur bis 255, was 63,75 psi entspricht. Danke übrigens für deine Hilfe bisher
Das ist komisch. Die I2C-Protokollinfo zeigt nur maximal 4 Bytes vom Sensor, wobei Byte 3 und 4 die Temperatur des Drucksensors sind. Ich bezweifle, dass so weit zurückliegende Bytes kalibrierte Informationen senden würden. Vielleicht sind diese Zahlen nicht kalibriert? Verwenden Sie den eigentlichen (Kunststoff-)Sensor oder ist er in ein Modul eingebettet? Auf dem Foto oben habe ich diesen Eindruck.
Laut Datenblatt ist Pin 5 ein digitaler Ausgangspin. Könnte diese PIN für etwas erforderlich sein, von dem ich nichts weiß? Danke.
Es ist der Plastiksensor, der mit einem Steckbrett verbunden ist
Ich habe 100 Messungen durchgeführt und Byte 1 und 2 für 0 psi, 5 psi und 10 psi gemessen. Hier ist eine CSV-Datei der Daten: pastebin.com/XhxhsaHM