Потоки на плате stm32 для запроса данных датчика imu - PullRequest
0 голосов
/ 10 февраля 2019

Я запрашиваю несколько датчиков imu с одной платы stm32.Однако чтение этих нескольких датчиков приводит к падению частоты данных на 100 мс на каждый добавленный датчик.Я хочу знать, есть ли способ использовать многопоточность в моем коде, чтобы запросы могли выполняться одновременно, или хотел бы узнать, есть ли другой подход.

while (1)
  {

  /* USER CODE END WHILE */

 MX_X_CUBE_BLE1_Process();
 /* USER CODE BEGIN 3 */
 for(i = 0; i < NUM_MPU_DEVICES; ++i) {
     update_MPU_data(&mpu_devices[i]);
 }
 uint32_t timestamp = HAL_GetTick();
 for(i = 0; i < NUM_MPU_DEVICES; ++i) {
     print_MPU_data(i+1, &mpu_devices[i], timestamp);
 }
}

Ниже приведено обновление данных датчика.

void update_MPU_data(MPU_DEVICE *mpu_dev)
{
MPU_Read_Accel_Data(mpu_dev);
MPU_Read_Gyro_Data(mpu_dev);
MPU_Read_Mag_Data(mpu_dev);
}

Кроме того, эта функция является примером чтения данных датчика.

void MPU_Read_Accel_Data(MPU_DEVICE * pMPU9250)
{

  uint8_t rawData[6];  // x/y/z accel register data stored here
  int16_t tempData[3];
  // Read the six raw data registers into data array
  MPU_SPI_Read(pMPU9250, MPUREG_ACCEL_XOUT_H, 6, rawData);

  // Turn the MSB and LSB into a signed 16-bit value
  tempData[0] = ((int16_t)rawData[0] << 8) | rawData[1] ;
  tempData[1] = ((int16_t)rawData[2] << 8) | rawData[3] ;
  tempData[2] = ((int16_t)rawData[4] << 8) | rawData[5] ;

// Now we'll calculate the accleration value into actual g's
  // This depends on scale being set
pMPU9250->accelX = (float)tempData[0] * pMPU9250->accelRes;
pMPU9250->accelY = (float)tempData[1] * pMPU9250->accelRes;
pMPU9250->accelZ = (float)tempData[2] * pMPU9250->accelRes;
}

Следующий код MPU_SPI_Read

int MPU_SPI_Read(MPU_DEVICE *pMPU9250, unsigned char reg_addr, unsigned char 
length, unsigned char *pData)
{
MPU_Chip_Select(pMPU9250);

// specifying reister address
uint8_t address;
address = reg_addr | 0x80;
uint8_t *pRegAddr = &address;
HAL_SPI_Transmit(pMPU9250->pSPIHandle, pRegAddr, 1, 10);

// reading data from register
HAL_SPI_Receive(pMPU9250->pSPIHandle, pData, length, 10);
MPU_Chip_Deselect(pMPU9250);
HAL_Delay(1);

return 0;
}

Я нашел 10 мс HAL_Delay внутривызов функции MPU_Chip_Select и еще 10 мс в поле «Отменить выбор».Хотя, я думаю, что эта задержка необходима для целостности spi-сигнала, т.е. чтобы не мешать сигналам.

В целом, я ожидал, что плата будет выводить данные для 8 датчиков каждые 100 мсек, где NUM_MPU_DEVICES == 8. Однакодля вывода всех данных 8 датчиков требуется около 800 мс.

Заранее спасибо.

...