Forum: Mikrocontroller und Digitale Elektronik Drucksensor MS5803 mit I2C


von Dieter Z. (viete)


Lesenswert?

Hallo,
wir möchten den Sensor MS5803 mit I2C einsetzen. Wir kommen allerdings 
nur bis zum RESET-Command.
Nachdem wir das Kommando PROMREAD /0xA6) absetzen, antwortet der Sensor 
nicht mehr.
Hat jemand schon Erfahrung mit diesem Sensor und I2C? Es muss I2C sein, 
da die HW schon fertig ist.

Danke, Viete

von Timmo H. (masterfx)


Lesenswert?

Wartet ihr nach dem Reset auch mindestens 2.8ms?
Device-Adresse auch richtig (achtung CSB ist negiert)

von Dieter Z. (viete)


Lesenswert?

Hallo Timo,
die Device-Adresse ist richtig (CSB negiert), nach dem RESET Befehl 
bekommen wir auch ein ACK.
Dann warten wir 3ms und setzen das PROMREAD- Kommando ab. Danach 
bekommen wir kein ACK mehr. Sollten wir nur 2.8ms warten? Erwartet der 
Baustein noch ein anderes Kommando vor dem PROMREAD?
Gruß Viete

von Timmo H. (masterfx)


Lesenswert?

Dieter Zumkehr schrieb:
> Hallo Timo,
> die Device-Adresse ist richtig (CSB negiert), nach dem RESET Befehl
> bekommen wir auch ein ACK.
> Dann warten wir 3ms und setzen das PROMREAD- Kommando ab. Danach
> bekommen wir kein ACK mehr. Sollten wir nur 2.8ms warten? Erwartet der
> Baustein noch ein anderes Kommando vor dem PROMREAD?
> Gruß Viete

Nein du kannst natürlich auch etwas länger warten.
Die Application Note kennst du? (ab S.6 ist I²C): 
http://www.servoflo.com/pressure-sensors/suppliers/measurement-specialties/227-measurement-specialties-a-intersema/781-an520.html

von Dieter Z. (viete)


Lesenswert?

Vielen Dank für den Link, werden wir gleich ausprobieren!
Gruß Viete

von Dieter Z. (viete)


Lesenswert?

@ Timmo!
Hat geklappt, herzlichen Dank!
Gruß Viete

von Timmo H. (masterfx)


Lesenswert?

Biddö

von David S. (Gast)


Lesenswert?

Hallo, ich habe ebendfalls das Problem dass ich an dieser Stelle nicht 
weiter komme. Ich nutze den Code aus der oben genannten Application 
Note(http://www.servoflo.com/pressure-sensors/suppliers/measurement-specialties/227-measurement-specialties-a-intersema/781-an520.html), 
aber der Sensor gibt keine Antwort. Wo lag denn bei euch der Fehler?

vG. David

von Dieter Z. (viete)


Lesenswert?

@David

Tut mir leid, das ist schon ein wenig her, wir müssen das Projekt erst 
wieder hervorkramen.
Bitte beachte den Fehler im Schaltplan der Applikation, natürlich müssen 
beide Leitungen einen pull-up haben. Das war aber nicht unser Fehler.
VG Viete

von David S. (icey)


Lesenswert?

Hi Viete,

na ebend, das ist mir noch garnicht aufgefallen dass es dort falsch 
gezeichnet ist. Der Fehler ist es bei mir aber auch nicht. Ich habe 
keine Ahnung wo der fehler liegt, ich vermute dass ich bei den 
Definitionen etwas übersehen habe.
In der Note steht es ja wie folgt:
#define TRUE 1
#define FALSE 0
#define F_CPU 4000000UL // 4 MHz external XTAL
#define SCL_CLOCK 100000L // I2C clock in Hz
#define ADDR_W 0xEF // Module address write mode
#define ADDR_R 0xEF // Module address read mode
#define CMD_RESET 0x1E // ADC reset command
#define CMD_ADC_READ 0x00 // ADC read command
#define CMD_ADC_CONV 0x40 // ADC conversion command
#define CMD_ADC_D1 0x00 // ADC D1 conversion
#define CMD_ADC_D2 0x10 // ADC D2 conversion
#define CMD_ADC_256 0x00 // ADC OSR=256
#define CMD_ADC_512 0x02 // ADC OSR=512
#define CMD_ADC_1024 0x04 // ADC OSR=1024
#define CMD_ADC_2048 0x06 // ADC OSR=2048
#define CMD_ADC_4096 0x08 // ADC OSR=4096
#define CMD_PROM_RD 0xA0 // Prom read command

und an sich sollte ja nur die Adresse geändert werden müssen zu:
#define ADDR_W 0b1110111 // Module address write mode
#define ADDR_R 0b1110111 // Module address read mode

Das CSB kann ich über Jumper umstellen.

Wie gesagt wäre super wenn du dir die Mühe machen würdest und es nochmal 
hervor kramst.
Schoneinmal vielen Dank.

David

von Dieter Z. (viete)


Lesenswert?

Hallo David,
tut mir leid, dass ich dich auf die nächste Woche vertrösten muss, ich 
komme jetzt nicht mehr an das Projekt.
Ich hoffe, das geht noch.
Bis Dann Viete

von Dieter Z. (viete)


Lesenswert?

Hallo David, wie versprochen hier die Lösung:

Schau Dir bitte die Adressen an, sie sind falsch!
Es muss heissen
#define ADDR_W 0xEC // Module address write mode
#define ADDR_R 0xED // Module address read mode
dann gehts!
Das CSB ist bei uns High!
Viel Vergnügen Viete!

von David S. (icey)


Lesenswert?

Wow, Viete wahnsinn, das war echt die Lösung. Du bist der Beste,vielen 
vielen Dank.

von Dieter Z. (viete)


Lesenswert?

Hallo David,
dahinter stecken Timmo, Artur & Viete!

von David S. (icey)


Lesenswert?

Ah ok, dann danke ich euch Dreien natürlich unheimlich und dann seid ihr 
die Besten.

von David S. (icey)


Lesenswert?

Hallo ihr Drei, ich muss euch noch einmal belästigen, hattet ihr auch 
den Fehler dass euer Sensor ca. 200mBar zu wenig angezeigt hat? 
natürlich kann man die ja einfach im Programm aufaddieren, aber so 
richtig schön ist das ebend auch nicht. Wobei man ja fast davon ausgehen 
kann dass die einfach nur im Datenblatt wieder einen Fehler gemacht 
haben.^^
Im Voraus schon vielen Dank.

vG. David

von Timmo H. (masterfx)


Lesenswert?

Hast du auf Normalnull umgerechnet? Die Wetterstationen beziehen den 
Luftdruck immer auf Normalnull soweit ich weiß. Temperaturkompensation 
durchgeführt?

von David S. (icey)


Lesenswert?

Hallo Timmo, den Luftdruck habe ich auf meine Höhe (rund 250m) 
umgerechnet und zusätzlich dazu habe auch noch ein Barometer als 
Referenz verwendet. Naja um ehrlich zu sein habe ich die Kompensation 
noch nicht gemacht, ich dachte das könnte ich mir am Anfang noch 
ersparen. Da es ja momentan meist grob um die 20°C ist und in dem Fall 
ja T2=OFF2=SENS2=0, das heißt eigentlich muss bei den Bedingungen nichts 
kompensiert werden. Ich schau da aber auf jeden Fall nochmal genauer 
hin. Wobei ja 200 mBar schon eine extreme abweichung wären. Also bei 
euch hat er keine so Fehlerhafte Werte übergeben, trotz dass Ihr die 
Formeln aus dem originalen Datenblatt verwendet habt?

von Wetterfrosch (Gast)


Lesenswert?

Timmo H. schrieb:
> Hast du auf Normalnull umgerechnet? Die Wetterstationen beziehen den
> Luftdruck immer auf Normalnull soweit ich weiß.

Um damit einen Fehler von 200 mbar zu erklären, müßte sich der 
Drucksensor schon auf 1800m Höhe befinden ;-)

von Timmo H. (masterfx)


Lesenswert?

Wetterfrosch schrieb:
> Timmo H. schrieb:
>> Hast du auf Normalnull umgerechnet? Die Wetterstationen beziehen den
>> Luftdruck immer auf Normalnull soweit ich weiß.
>
> Um damit einen Fehler von 200 mbar zu erklären, müßte sich der
> Drucksensor schon auf 1800m Höhe befinden ;-)
Ich habe ja auch NN UND Temperaturkompensation gesagt.
Ich habe mir die Temperaturkompensation des MS5803 jetzt nicht im Detail 
angeschaut, aber bei Freescale MPL115A2 ist die Abweichung ohne die 
Temperaturkompensation schon recht groß: Pcomp = a0 +( b1 + c12 * Tadc) 
* Padc + b2 * Tadc

wobei a0, b1, c12 und b2 die 16bit Kompensationskoeffizienten des 
MPL115A2 sind welche bei der Herstellung individuell im ROM abgelegt 
werden.

Hatte nicht gesehen, dass man beim MS5803 < 20°C angeblich nichts 
kompensieren muss.

von David S. (icey)


Lesenswert?

Also der MS muss schon auch kompensiert werden, außer die Temperatur ist 
über 20°C und unter 45°C, denn dann sind die Koeffizienten für die 
Kompensation wie folgt T2=0, OFF2=0 und Sens2=0.
Und die Komepnsation sieht wie folgt aus:
TEMP = TEMP - T2;
OFF = OFF - OFF2;
SENS = SENS - SENS2;

Die Berechnung für den Druck sieht laut Datenblatt wie folgt aus:
P  = (D1 * SENS / 2^21 - OFF) / 2^15;
mit
SENS = C1 * 2^15 + (C3 * dT ) / 2^8;
OFF  = C2 * 2^16 + (C4 * dT ) / 2^7;
TEMP =  2000 + dT * C6 / 2^23;

Und bei diesen Formeln vermute ich einen Fehler.
Aber wenn ihr die gleichen Formeln verwendet habt und bei euch keiner 
Fehler aufgetreten ist kann ich mich natürlich auch irren.

von David S. (icey)


Lesenswert?

Ach ja und das habe ich vergessen:
dT = D2 - TREF = D2 - C5 * 2^8;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.