Page 1 of 1

ESP32/MPU-9250 losing accuracy

Posted: Tue Oct 23, 2018 8:15 am
by derasd
Hi, I'm using an ESP32 in connection with an MPU-9250 to measure acceleration over SPI. Interrupts are used to measure 10'000 samples. Those are sent over WIFI and the process is started again. After around 100+ measurements the sensor suddenly loses accuracy (and also gets a small offset compared to the normal measurement).

This is how it normally looks
meas1.png
meas1.png (7.54 KiB) Viewed 6332 times
This is how it looks after
meas2.png
meas2.png (6.98 KiB) Viewed 6332 times
The hex values, depending on the sensors position, look something like this:

Code: Select all

00DF 00DF 00DF 00DF 00E0 00DF 00DF 00DF 00DF 00E0 00E0 00DF 00E0 00DF 00DF 00DF 00E0 00E0 00E0 00DF 00DF 00E0 00DF 00DF 
But when I inspect the data coming from the MPU-9250 with an oscilloscope it looks like valid data.

This only happens around 50% of the time, the other 50% the ESP core dumps first. I'm not sure if this is related but I need to fix it as well. This core dump happend after 386 measurements.

Code: Select all

Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC      : 0x40083f0c  PS      : 0x00060031  A0      : 0x4008206d  A1      : 0x3ffb05d0
0x40083f0c: spi_intr at C:/msys32/esp-idf/components/driver/spi_master.c:433

0x4008206d: _xt_lowint1 at C:/msys32/esp-idf/components/freertos/xtensa_vectors.S:1105

A2      : 0x3ffc43a4  A3      : 0x3ffc43b8  A4      : 0x3ffb0570  A5      : 0x3ffc441c
A6      : 0x3ffb8570  A7      : 0x3ffb3684  A8      : 0x80083f05  A9      : 0x9fffcffc
A10     : 0x4001f140  A11     : 0x00000000  A12     : 0xc8746060  A13     : 0x00000001
A14     : 0x00060021  A15     : 0x00060021  SAR     : 0x0000001a  EXCCAUSE: 0x0000001c
EXCVADDR: 0x9fffd104  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0xffffffff
Core 0 was running in ISR context:
EPC1    : 0x40083f0c  EPC2    : 0x00000000  EPC3    : 0x00000000  EPC4    : 0x00000000
0x40083f0c: spi_intr at C:/msys32/esp-idf/components/driver/spi_master.c:433


Backtrace: 0x40083f0c:0x3ffb05d0 0x4008206a:0x3ffb0600 0x4008cf52:0x00000000
0x40083f0c: spi_intr at C:/msys32/esp-idf/components/driver/spi_master.c:433

0x4008206a: _xt_lowint1 at C:/msys32/esp-idf/components/freertos/xtensa_vectors.S:1105

0x4008cf52: xQueueGenericReceive at C:/msys32/esp-idf/components/freertos/queue.c:2037


CPU halted.

Has anyone seen this before?
Please let me know what more information I can provide.

*Edit*: It was different yesterday but today the core dump is much more of an issue than losing the accuracy.

Re: ESP32/MPU-9250 losing accuracy

Posted: Tue Oct 23, 2018 11:55 am
by luisonoff
Post code of your SPI driver (if any apart from IDF) and the functions using this SPI driver.

Re: ESP32/MPU-9250 losing accuracy

Posted: Wed Oct 24, 2018 2:28 am
by ESP_Sprite
Agreed. Smells like a SPI transaction struct somehow got corrupted.

Re: ESP32/MPU-9250 losing accuracy

Posted: Wed Oct 24, 2018 7:05 am
by derasd
Hi, thanks for your help. Here is the SPI code.

*Edit* Made some changes to the code, performance and readability should be better now. Problem still persists, especially the one from the post below.

Code: Select all


//This function is called with every interrupt
static void IRAM_ATTR mpu_isr(void *discard)
{
  spi_transaction_t t = {};
  uint8_t tx_buffer[2] = {0x00, 0x00};
  t.length = 2 * 8;
  t.flags = SPI_TRANS_USE_RXDATA; 
  t.tx_buffer = tx_buffer;
  t.cmd = MPUREG_ACCEL_XOUT_H | READ_FLAG;                                      
  spi_device_queue_trans(mpu9250_spi_handle, &t, 0);
}

void task_mpu9250(void *pvParameters)
{
  // Create a queue capable of containing 20 int16 values.
  data_queue = xQueueCreate(20, sizeof(int16_t));

  mpu9250_init_spi();
  // Check if connection to Sensor is ok
  if (mpu9250_whoami())
  {
    mpu9250_init();
    gpio_set_intr_type(PIN_MPU_INT, GPIO_INTR_NEGEDGE); 
    gpio_install_isr_service(0);
    gpio_isr_handler_add(PIN_MPU_INT, mpu_isr, (void *)PIN_MPU_INT);
  }
  vTaskDelete(NULL);
}

// This is called as a post SPI transaction 
static void IRAM_ATTR mpu9250_post_spi_trans(spi_transaction_t *t)
{
  BaseType_t xHigherPriorityTaskWoken;

  if (t->cmd == (MPUREG_ACCEL_XOUT_H | READ_FLAG))
  {
    //Writes x-values into data_buffer and sends them to the queue
    data_buffer = ((int16_t)t->rx_data[0] << 8) | t->rx_data[1];
    xQueueSendToBackFromISR(data_queue, &data_buffer, &xHigherPriorityTaskWoken);
  }
}

void mpu9250_init_spi()
{
  esp_err_t ret;
  spi_bus_config_t buscfg = {.miso_io_num = PIN_SPI_SDI,
                             .mosi_io_num = PIN_SPI_SDO,
                             .sclk_io_num = PIN_SPI_SCK,
                             .quadwp_io_num = -1,
                             .quadhd_io_num = -1};
  spi_device_interface_config_t devcfg = {
      .command_bits = 8,                
      .dummy_bits = 0,                  
      .mode = 3,                        
      .clock_speed_hz = 1000000,       
      .spics_io_num = PIN_MPU_CS,     
      .queue_size = 7,                 
      .post_cb = mpu9250_post_spi_trans 
                                       
                                        
  };
  ret = spi_bus_initialize(HSPI_HOST, &buscfg, 1); 
  assert(ret == ESP_OK);
  ESP_LOGI(TAG, "... Initializing bus.");
  ret = spi_bus_add_device(HSPI_HOST, &devcfg, &mpu9250_spi_handle);
  assert(ret == ESP_OK);
  ESP_LOGI(TAG, "... Adding device bus.");
}

Re: ESP32/MPU-9250 losing accuracy

Posted: Thu Nov 01, 2018 3:28 pm
by derasd
Anyone sees a problem with the code?

Something else I've got is that from time to time the sensor returns a value of exactly 0

Code: Select all

t->rx_data[0] = 0
which is not correct. When I analyze the data on the SPI bus with an oscilloscope there is always a value returned.


Edit: Problem has been solved by using spi_device_polling_transmit() instead of spi_device_queue_trans()