Что должно быть причиной отсутствия вывода из библиотеки MOTION GC?

Я работаю над "STEVAL-MKI182V2", установленным на STEVAL-MKI109V3развивающая доска. Первоначально я загрузил стандартные драйверы c по следующей ссылке. https://github.com/STMicroelectronics/STMems_Standard_C_driversгде я нашел .iocфайл с именем _prj_MKI109V3который специально разработан для платы MKI109V3.

Затем, после того как я добавил ISM330DLCфайлы драйвера и пример кода, вызываемый по следующей ссылке https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/master/ism330dlc_STdCпосле добавления я просто звонил ism330dlc_read_data_pollingфункция в основном цикле while.

Мы используем функцию ниже для инициализации библиотеки

      void Gyro_Initialize()
{

/ Gyroscope calibration API initialization function /
MotionGC_Initialize(MGC_MCU_STM32,&sample_freq);

/ Optional: Get version /
MotionGC_GetLibVersion(lib_version);

/ Optional: Get knobs settings /
MotionGC_GetKnobs(&knobs);

/ Optional: Adjust knobs settings /
knobs.AccThr = 0.008f;
knobs.GyroThr = 0.15;
MotionGC_SetKnobs(&knobs);

/ Optional: Set initial gyroscope offset /
start_gyro_bias.GyroBiasX = 0;
start_gyro_bias.GyroBiasY = 0;
start_gyro_bias.GyroBiasZ = 0;
MotionGC_SetCalParams(&start_gyro_bias);

/ Optional: Set sample frequency /
MotionGC_SetFrequency(&sample_freq);

}

После инициализации библиотеки мы отправляем сохраненные необработанные данные (которые мы получили, используя пример кода ism330dlc_read_data_polling.c) в качестве входных данных для функции

Теперь проблема в том, что после сброса кода я могу получить необработанные данные с датчика сразу после вызова функции. Gyro_Process()в котором я пытаюсь получить данные из функции MotionGC_Update(&data_in, &data_out, &bias_update);следующим образом

      void Gyro_Process()
{

 /** Using gyroscope calibration algorithm **/
 MGC_input_t data_in;
 MGC_output_t data_out;
 int bias_update;
 float gyro_cal_x, gyro_cal_y, gyro_cal_z;

 data_in.Acc[0] = acceleration_mg[0];
 data_in.Acc[1] = acceleration_mg[1];
 data_in.Acc[2] = acceleration_mg[2];

 data_in.Gyro[0] = angular_rate_mdps[0];
 data_in.Gyro[1] = angular_rate_mdps[1];
 data_in.Gyro[2] = angular_rate_mdps[2];

 // MotionGC_GetCalParams(&start_gyro_bias);
 // {
 //  data_out.GyroBiasX = (int32_t)(data_out.GyroBiasZ - 
  gyro_bias_to_mdps(start_gyro_bias.GyroBiasX));
 //  data_out.GyroBiasY = (int32_t)(data_out.GyroBiasY - 
  gyro_bias_to_mdps(start_gyro_bias.GyroBiasY));
 //  data_out.GyroBiasZ = (int32_t)(data_out.GyroBiasZ - 
  gyro_bias_to_mdps(start_gyro_bias.GyroBiasZ));
  // }

 / Get acceleration X/Y/Z in g /
 // MEMS_Read_AccValue(data_in.Acc[0], data_in.Acc[1], 
  data_in.Acc[2]);

 / Get angular rate X/Y/Z in dps /
  // MEMS_Read_GyroValue(data_in.Gyro[0], data_in.Gyro[1], 
  data_in.Gyro[2]);

 / Gyroscope calibration algorithm update /
  MotionGC_Update(&data_in, &data_out, &bias_update);

 / Apply correction /
 gyro_cal_x = (data_in.Gyro[0]-data_out.GyroBiasX);
 gyro_cal_y = (data_in.Gyro[1]-data_out.GyroBiasY);
 gyro_cal_z = (data_in.Gyro[2]-data_out.GyroBiasZ);

 sprintf((char *)tx_buffer,
 "Gyroscope [mg]      :%4.2f\t%4.2f\t%4.2f\r\n",gyro_cal_x, 
 gyro_cal_y, gyro_cal_z);
 CDC_Transmit_FS( tx_buffer, strlen( (char const *)tx_buffer ) 
 );

 // HAL_Delay(500);
  }

но здесь одна вещь, которую я заметил, это то, что data_outбуфер всегда равен нулю, что означает, что калибровочный буфер не обновляется калиброванными данными.

Я пытался опубликовать эту проблему на форуме ST, но не получил никакой помощи с вашей стороны. Я был очень разочарован ответом с форума ST. Теперь мне действительно нужна помощь, потому что проект задерживается, и все же мы застряли с этой проблемой уже почти 1,5 месяца.

1 ответ

По сути, проблема заключалась в том, как я отправлял входные необработанные данные в библиотеку Motion GC. Когда я проверил документ, я заметил, что тип данных, ожидаемый библиотечной функцией, отличается. Кроме того, я попробовал несколько настроек ориентации в настройках библиотеки, и, наконец, теперь это работает.

Другие вопросы по тегам