La lectura de la temperatura del magnetómetro (LIS3MDL) cambia con la orientación

4

Tengo un LIS3MDL que emite lo que parecen ser valores razonables de intensidad de campo magnético (vea la segunda imagen). Sin embargo, estoy confundido de por qué la lectura de la temperatura parece depender de la orientación del magnetómetro cuando realicé los movimientos de la "figura 8". Por lo que entiendo, el valor de la temperatura que estoy leyendo se utiliza como una entrada para un algoritmo de compensación en el magnetómetro, por lo que debería ser independiente del campo en sí.

Con respecto a la adquisición del valor, estoy leyendo el valor de complemento de 2 bits de 16 bits y luego estoy dividiendo por 2 ^ 8 y compensando a 25 grados centígrados. Creo que esto está justificado por la nota de aplicación AN4602 ( enlace ):

Serial.print((((int16_t)((buf[8] << 8) | buf[7])) / 256.0) + 25.0); // temp

Magnetómetrovalores"Figura 8"

    
pregunta abc

2 respuestas

2

Recapturé datos y dibujé la temperatura individualmente contra cada eje del magnetómetro. De los gráficos a continuación, es evidente que los datos de temperatura eran en realidad los datos del eje x.

CreoqueestosedebeaqueelincrementoautomáticodeladirecciónSPInofuncionacomoseesperaba.Parecequese"envuelve" solo dentro de los registros mag x / y / z, y no va a los registros de temperatura adyacentes. Mi código original era:

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

Pero después de cambiar a lo siguiente, la salida de temperatura es la esperada:

...

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

Gracias por toda la entrada. Era un problema tonto con las comunicaciones serie, después de todo, nada que ver con el sensor.

    
respondido por el abc
0

Tú y tu cara son una fuente de calor. Aproximadamente 1/4 vatios / cm ^ 2. Sus manos son más frías, pero las usa para sostener el PCB.

Simplemente al estar cerca, al examinar detenidamente el PCB, está inyectando calor y provocando gradientes de temperatura.

La lámina de PCB, la lámina de 1 CU por defecto 2 pies / pie ^ 2, tiene una resistencia térmica de 70 grados centígrados por vatio.

¿Eso es un problema?

    
respondido por el analogsystemsrf

Lea otras preguntas en las etiquetas