Der Temperaturmesswert des Magnetometers (LIS3MDL) ändert sich mit der Ausrichtung

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

Temperaturmesswerte

Magnetometerwerte "Abbildung 8"

Ist die Platine mit Entkopplungskondensatoren bestückt? Ist die Spannung gefiltert und stabil? Was ist mit der Berechnung der Kreuzkorrelation zwischen zwei Signalen, um sicherzustellen, dass die Temperatur mit dem Winkel korreliert?
Ich bezweifle ernsthaft, dass die Temperatur jede Sekunde um 7 Grad Celsius steigt und fällt ... also liest es entweder falsch oder es ist wahrscheinlicher, dass Sie es irgendwie tun. Bist du sicher, dass du wirklich die Temperatur ablesst?
Nur zur Verdeutlichung, diese Temperaturschwankung tritt aufgrund einer sich ändernden Ausrichtung des IC auf. Es bleibt relativ konstant, wenn es in Ruhe gelassen wird.
@MarkoBuršič Es gibt zwei 4,7-uF- und eine 0,1-uF-Kappe parallel. Ich verwende das Pololu-Board pololu.com/product/2737 . Ich kann die Korrelation zum Winkel überprüfen.
Ja, aber wenn es wirklich ein Magnetismuswert ist, würde das auch so sein. Es zieht auch nicht genug Strom, um sich so stark zu erwärmen.
@Trevor Ich verstehe, was du sagst. Soweit ich das beurteilen kann, lese ich die richtigen Register basierend auf dem Datenblatt und mit der Skalierung/dem Offset kommt es auf den erwarteten Temperaturbereich heraus, aber ich würde nicht sicher wissen, wie ich dies überprüfen soll.
Überprüfen Sie Ihre Adresskonstanten in Ihrem Code doppelt, wäre mein erster Anlaufpunkt. 8 Grad sind viel.. so viel muss man spüren können.
Sie können es auch sitzen lassen und mit einer Heißluftpistole oder einem Fön erwärmen und sehen, ob es sich so stark verändert, wie Sie es erwarten. Wenn dies nicht der Fall ist, lesen Sie die Temperatur nicht ab. Beachten Sie jedoch, dass sich auch die magnetischen Werte etwas ändern.
@abc - Ich schlage vor, zu den Grundlagen zurückzukehren, Ihren Code auf ein Minimum zu reduzieren, Rohdatenbytes vom Sensor (X, Y, Z und Temperatur) zu analysieren, nicht die berechneten Werte, und nach Mustern zu suchen. Wie Trevor erwähnte, frage ich mich, ob Ihr Code tatsächlich die richtigen Bytes vom Sensor verwendet, um den "Temperatur" -Wert zu berechnen. Ein Blick auf berechnete Werte kann Probleme verbergen, die in den zugrunde liegenden Rohdaten sichtbar sind. Bitte führen Sie auch den von Trevor vorgeschlagenen Test "Sanftes Erhitzen des stationären Sensors" durch und sehen Sie, was mit den Rohdaten des Sensors passiert. Ändern sich nur die erwarteten Rohbytes?
Wenn dies das MATLAB-Diagramm ist, verwenden Sie XCORR (Signalverarbeitungs-Toolbox): Temperatur VS. X-Achse, Temperatur vs. Y-Achse, Temperatur vs. Z-Achse. Es wird Ihre Hypothese zeigen und bestätigen//ablehnen. Ich habe dir für die Vorbereitung zugestimmt.
Ein weiteres nützliches Diagramm wäre ein Temperatur-gegen-H-Magnitude-Vektor: R = X 2 + j 2 + z 2 . Es würde die Korrelation zwischen der Referenzspannung des internen ADC zeigen. Folgen beide Kurven, dann wäre eine plausible Erklärung die Versorgungsspannungsschwankung.

Antworten (2)

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.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

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");

Geben Sie hier die Bildbeschreibung ein

Danke für den ganzen Input. Es war schließlich ein dummes Problem mit der seriellen Kommunikation, nichts mit dem Sensor zu tun.

:) Schön, dass du es gefunden hast. Wie ich vermutete. Wenn die Daten zu seltsam erscheinen, um wahr zu sein, dann sind sie es normalerweise.
Happy-End-Geschichte. :)
Dies ist auch die Geschichte, wenn der Sensor über I2C verwendet wird. Das Ändern auf zwei separate Lesevorgänge behebt das Problem.

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?

Ich möchte noch einmal betonen, dass die einzige Ursache, die dies zu verursachen scheint, eine Orientierungsänderung ist. Mein Griff auf dem Board und der Abstand zu Wärmequellen sind konstant.