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:
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.
Was ist falsch?
Der Sensor ist differentiell, bis zu 100 psi.
So
ist -100 psi,
ist +100 psi.
Insgesamt 14 Bit (von 0 bis 2 14 -1),
liegt bei 10%, also
ist 1638
liegt bei 90%, also
ist 14745
aus dem Datenblatt:
Sie müssen wahrscheinlich Pull-up-Widerstände zu den I2C-Takt- und Datenleitungen hinzufügen. Das sagt das Datenblatt ist das Minimum, also vielleicht versuchen . Die Widerstände sollten von den Pins zur +5V-Versorgung gehen.
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:
Mmm. 0 PSI ist weit weg. Vielleicht war der Wert 31.246? Das gibt:
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.
Benutzer323693
JosephFTaylor
Benutzer323693
JosephFTaylor
CharlieHanson
JosephFTaylor