単一の stm32 ボードから複数の imu センサーを照会しています。ただし、これらの複数のセンサーを読み取ると、追加されたセンサーごとにデータ周波数が 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;
}
関数呼び出し MPU_Chip_Select 内で 10 ミリ秒の HAL_Delay を見つけ、Deselect でさらに 10 ミリ秒を見つけました。ただし、この遅延は spi 信号の完全性、つまり信号に干渉しないために必要だと思います。
合計すると、ボードが 100 ミリ秒ごとに 8 つのセンサーのデータを出力すると予想していました。ここで、NUM_MPU_DEVICES == 8 です。ただし、8 つのセンサーすべてに相当するデータを出力するには、約 800 ミリ秒かかります。
前もって感謝します。