Что должно быть причиной отсутствия вывода из библиотеки 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. Когда я проверил документ, я заметил, что тип данных, ожидаемый библиотечной функцией, отличается. Кроме того, я попробовал несколько настроек ориентации в настройках библиотеки, и, наконец, теперь это работает.