Hallo an alle,
seit einiger Zeit verwenden wir für die berührungslose Messung von Temperaturen zwei Melexis MLX90614 mit einem FOV von 35° und einer Betriebsspannung von 3,3V (Version BCC). Nun haben wir die Sensoren ein halbes Jahr nicht benutzt und jetzt auf einen anderen Roboter gebaut. Dort haben wir etwas ganz seltsames beobachtet:
Ein Sensor funktioniert ganz normal. Die Temperatur wird korrekt ausgelesen. Hier, was ein Logic Analyzer liefert:

Code:
>: Schreibzugriff vom Master auf die Adresse
<: Lesezugriff vom Master auf die Adresse
+: Ack vom Slave
-: Nak vom Slave

Adresse: 50
50> 07+ 50< 4A+ 39+ C4-
50> 07+ 50< 4D+ 39+ AF-
50> 07+ 50< 4A+ 39+ 93-
Dabei kommen Temperaturen um 20°C raus.

Beim zweiten Sensor kommen aber ganz wirre Werte raus, springen vom - in den + Bereich. Hier wieder die Ergebnisse des Logic Analyzers:

Code:
Adresse: 5A
5A> 07+ 5A< 9D+ 28+ D6-
5A> 07+ 5A< 34+ 29+ 74-
5A> 07+ 5A< 45+ 2C+ D8-
5A> 07+ 5A< BF+ 2A+ 5C-
Nach einigen erfolglosen Experimenten im Code haben wir einen weiteren Sensor getestet, der bis jetzt aber noch nie in einer richtigen Anwendung (nur zum Test) in Einsatz war, allerdings im selben Roboter. Dort kommen ähnlich springende Werte raus:

Code:
Adresse: 5B
5B> 07+ 5B< 70+ 23+ 5F-
5B> 07+ 5B< 33+ 27+ 27-
5B> 07+ 5B< 8C+ 21+ B9-
5B> 07+ 5B< 49+ 29+ 2D-
5B> 07+ 5B< A3+ 2C+ F7-
Da der Ersatzsensor, der ja eigentlich sicher funktionieren sollte, da fast nicht gebraucht, nun auch solche Ergebnisse liefert, dachten wir uns, dass es vielleicht mit einer falschen Konfiguration o.Ä. zusammenhängen könnte. Zudem sehen die Hex Werte auch nicht sooo falsch aus. Hat jemand vielleicht schon einmal sowas beobachtet? Oder sind die Sensoren einfach nur defekt?
Zuvor verwendete Sensoren mit einem größeren Öffnungswinkel liefern auch korrekte Werte.

Hier der Codeausschnitt zum Abfragen der Sensorwerte:

Code:
uint16_t tempdata = 0;
uint8_t adr = (0x5A<<1);

i2c_start(adr);
i2c_write(0x07);
i2c_rep_start((adr)+1);

for(uint8_t i = 0; i<2; i++)
{
	i2cbuf[i] = i2c_readAck();
}
i2cbuf[2] = i2c_readNak();
i2c_stop();

tempdata = (((i2cbuf[1] & 0x007F) << 8) + i2cbuf[0]);
tempdata = ((tempdata * 2)-1);
mlx90614 = (tempdata - 27315);
Vielen Dank und
Viele Grüße
Jan
www.teamohnename.de