Ich habe ein LIS3MDL, das scheinbar vernünftige Magnetfeldstärkewerte ausgibt (siehe zweites Bild). Ich bin jedoch verwirrt, warum die Temperaturanzeige von der Ausrichtung des Magnetometers abhängig zu sein scheint, als ich die Bewegungen der "Figur 8" ausführte. Soweit ich weiß, wird der Temperaturwert, den ich lese, als Eingabe für einen Kompensationsalgorithmus im Magnetometer verwendet, sodass er vom Feld selbst unabhängig sein sollte.
Zur Erfassung des Wertes lese ich den 16-Bit-2er-Komplementwert aus und dividiere dann durch 2^8 und versetze auf 25 °C. Ich glaube, dies wird durch den Anwendungshinweis AN4602 ( http://www.st.com/resource/en/application_note/dm00136626.pdf ) gerechtfertigt:
Serial.print((((int16_t)((buf[8] << 8) | buf[7])) / 256.0) + 25.0); // temp
Ich habe die Daten erneut erfasst und die Temperatur einzeln gegen jede Magnetometerachse aufgetragen. Aus den Diagrammen unten ist ersichtlich, dass die Temperaturdaten tatsächlich die x-Achsendaten waren.
Ich glaube, das liegt daran, dass die automatische Inkrementierung der SPI-Adresse nicht wie erwartet funktioniert. Es scheint sich nur innerhalb der mag x / y / z-Register "umzuwickeln" und geht nicht zu den benachbarten Temperaturregistern. Mein ursprünglicher Code war:
#define OUT_X_L 0x28
#define OUT_X_H 0x29
#define OUT_Y_L 0x2A
#define OUT_Y_H 0x2B
#define OUT_Z_L 0x2C
#define OUT_Z_H 0x2D
#define TEMP_OUT_L 0x2E
#define TEMP_OUT_H 0x2F
#define SPI_READ_BURST_START OUT_X_L
uint8_t buf[8]; // xyz, temp
...
spiReadBurstLIS3MDL(SPI_READ_BURST_START, buf, sizeof(buf));
Serial.print(micros());
Serial.print("\t");
Serial.print((int16_t)((buf[1] << 8) | buf[0])); // x
Serial.print("\t");
Serial.print((int16_t)((buf[3] << 8) | buf[2])); // y
Serial.print("\t");
Serial.print((int16_t)((buf[5] << 8) | buf[4])); // z
Serial.print("\t");
Serial.print((((int16_t)((buf[7] << 8) | buf[6])) / 256.0) + 25.0); // temp
Serial.print("\n");
Aber nach dem Wechsel zu Folgendem ist die Temperaturausgabe wie erwartet:
...
uint8_t buf[6]; // xyz
int16_t temp;
...
spiReadBurstLIS3MDL(SPI_READ_BURST_START, buf, sizeof(buf));
temp = 0xFF & spiReadLIS3MDL(TEMP_OUT_L);
temp |= spiReadLIS3MDL(TEMP_OUT_H) << 8;
Serial.print(micros());
Serial.print("\t");
Serial.print((int16_t)((buf[1] << 8) | buf[0])); // x
Serial.print("\t");
Serial.print((int16_t)((buf[3] << 8) | buf[2])); // y
Serial.print("\t");
Serial.print((int16_t)((buf[5] << 8) | buf[4])); // z
Serial.print("\t");
Serial.print((temp / 256.0) + 25.0); // temp
Serial.print("\n");
Danke für den ganzen Input. Es war schließlich ein dummes Problem mit der seriellen Kommunikation, nichts mit dem Sensor zu tun.
Sie und Ihr Gesicht sind eine Wärmequelle. Ungefähr 1/4 Watt/cm^2. Ihre Hände sind kühler, aber Sie benutzen Ihre Hände, um die Platine zu halten.
Indem Sie einfach in der Nähe sind, indem Sie die Leiterplatte genau untersuchen, injizieren Sie Wärme und verursachen Temperaturgradienten.
PCB-Folie, die standardmäßige 1oz/Fuß^2 CU-Folie, hat einen thermischen Widerstand von 70 Grad Celsius pro Watt.
Ist das ein Problem?
Marko Buršič
Trevor_G
ABC
ABC
Trevor_G
ABC
Trevor_G
Trevor_G
SamGibson
Marko Buršič
Marko Buršič