@mihayk а скинь проект плз посмотреть. Проблемы сейчас такие же как в начале темы описаны?
Проблемы немного улучшились, монитор перестал выделываться! Данные с MPU9250 сначала идут корректно, затем начинается каша мала. На удивление, бывали дни когда работа была бесперебойная.
Проблемы немного улучшились, монитор перестал выделываться! Данные с MPU9250 сначала идут корректно, затем начинается каша мала. На удивление, бывали дни когда работа была бесперебойная.
То есть на дисплее выводятся данные с датчика, которые не соответствуют действительности? А WHO_AM_I при этом верный?
То есть на дисплее выводятся данные с датчика, которые не соответствуют действительности? А WHO_AM_I при этом верный?
WHO_AM_I = 0x70 для MPU9250. Для магнетометра 0х00. Данные с датчика идут сначала нормальные, потом каша-мала. Время работы в "нормальном режиме" может быть разное. Может даже целый день работать нормально. Жду такой же датчик для проверки. Проверю - отпишусь!
Пришел 2-ой MPU9250. Выводы, которые я сделал по порядку:
1. ak8963 (магнетометр) не работает на двух устройствах - регистр WhoAmI 0х00, а судя по описанию должен быть 0х48. Либо неправльная инициалиция, либо он вообще не определяется на интерфейсе SPI. Буду пробовать на интерфейсе I2C. WhoAmI для MPU9250 - 0x70 и 0х74 (2 устройства)
2. Была задача посадить два устройства на один канал SPI (монитор и MPU9250). Получается нестабильная работа двух устройств. Заставить не начинать работать одному устройству, пока другое устройство не завершило работу не получилось.
3. Если использовать 2 канала SPI1 и SPI2, подсоеденив к каждому по устройству, проблем нет.
Если у кого есть проект MPU9250 с I2C интерфейсом, скиньте сюда пожалкйста!
@mihayk у меня там как раз I2C, в том варианте библиотеки что скидывал, сто процентов работает, сам использовал.
@mihayk у меня там как раз I2C, в том варианте библиотеки что скидывал, сто процентов работает, сам использовал.
В этой библиотеке не хватает flash.h И некоторые объявления перемнных типа MPU9250_Sensor. Можете скинуть весь проект целиком? так я разберусь быстрее...
@mihayk Да проект коммерческий был, не могу скинуть в первозданном виде... Там надо выкинуть работу с flash-памятью, калибровочные данные сохранялись. MPU9250_Sensor:
typedef enum { MPU9250_MAG_SENSOR = 0, MPU9250_ACC_SENSOR = 1, MPU9250_GYRO_SENSOR = 2, MPU9250_SENSOR_NUM = 3, } MPU9250_Sensor;
Руки дошли до программирования.
В коде используется переменная uSec в функции MPU9250_Process():
extern int uSec; Now = uSec; deltat = (float)((Now - lastUpdate) / 1000000.0f) ; lastUpdate = Now; sum += deltat; sumCount++; delt_t = HAL_GetTick() - count;
Не совсем понятно что за зафиксированное время, наверное из главного модуля main.c? Подскажите плиз!
@mihayk Да, нашел, объявлена в stm32f1xx_it.c:
int uSec = 0;
Инкрементируется в прерывании по TIM6:
void TIM6_IRQHandler(void) { HAL_TIM_IRQHandler(&htim6); uSec += 50; }
Судя по логике таймер должен переполняться каждые 50 мкс )