Режим 32k и mpu6000

Решил я тут проверить, почему на одних чипах гироскопа есть режим 32k, а на нешумных mpu6000 нет. Сравнивая документации на разные чипы гироскопов и кода betaflight, режим 32k можно включить только на тех гироскопах, в которых в документации в регистре 1B(27) есть параметр FCHOICE_B.

mpu

 

Но так как не всегда в документации описываются все возможности (особенно у invensense), я решил все проверить самостоятельно. Как это сделать? Надо смотреть данные с гироскопа, но в режиме 32/16 blackbox пишет с максимальной скоростью 4k, поэтому такой вариант не пойдет. Самый очевидный способ, соснифать протокол общения микроконтроллера с гироскопом и проверить данные на уровне шины. В качестве подопытного выступает flip32 f4 (он же airbotf4, он же клон REVO). Шину SPI будем смотреть с помощью народного логического анализатора saleae.

Для начала нужно научиться собирать прошивку самому, так как нам предстоит ковыряние в исходном коде. Как скомпилировать BetaFlight я рассказал в отдельной заметке.

После того как вы скачаете исходники можно приступить к ковырянию прошивки. Во первых нужно изменить betaflight, чтобы конфигуратор давал возможность поставить режим 32/16 для mpu6000. Для этого изменим файл src\main\sensors\gyro.c в функции “bool gyroInit(void)” после строки «case GYRO_MPU6500:» добавим “case GYRO_MPU6000:” и сохраним.

Далее собираем прошивку, заливаем в полетник, выставляем в конфигураторе режим  32/16, подпаиваемся к шине spi, снифаем протокол и понимаем что что-то тут не так. На максимальной скорости работы логического анализатора (24МГц) происходит потеря данных. Посмотрим еще раз в документацию на гироскоп.

spi_timing

Максимальная частота шины ограничена — 1МГц.

Смотрим исходный код прошивки, файл “src\main\drivers\accgyro_spi_mpu6000.c” функция “mpu6000SpiGyroInit” вызов “spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_CLOCK_FAST);”.

Найдем значение “SPI_CLOCK_FAST” в файле из той же папки “bus_spi.h” :

#if defined(STM32F4)
    SPI_CLOCK_SLOW          = 128, //00.65625 MHz
    SPI_CLOCK_STANDARD      = 8,   //10.50000 MHz
    SPI_CLOCK_FAST          = 4,   //21.00000 MHz
    SPI_CLOCK_ULTRAFAST     = 2    //42.00000 MHz

Вот вам и не все возможности, описанные в документации. Так как частота шины выставлена в 21МГц, то частота работы логического анализатора должна быть как минимум 42МГц. Но у меня под рукой только один ЛА, поэтому опять поправим исходный код и заменим “SPI_CLOCK_FAST” на “SPI_CLOCK_STANDARD” в файле “src\main\drivers\accgyro_spi_mpu6000.c” (строки 139,251. у вас номера могут слегка отличаться, т.к. файл может быть изменен авторами).

Попробуем еще раз. Собираем прошивку в Cygwin, подключаем полетник в boot режиме и прошиваем нашим hex файлом, который находится в “ C:\dev\betaflight-3.1.6\obj”. В настройках включаем Enable gyro 32khz… выбираем режим 32k/16k и выключаем акселерометр.

32k

Теперь осталось подключиться к шине spi.

spi_mpu

Находим нужные контакты на плате, смотрим трассировку и выбираем те места дорожек к которым проще подпаяться и зачищаем их от маски чем-нибудь острым, например скальпелем.

дорожки - Copy

Припаиваем проводки и подключаем к анализатору.

припаялись

Снифаем протокол при включенном питании полетника одновременно ударяя по нему, что бы гира меняла данные.

logic

К сожалению, mpu6000 и правда не поддерживает выдачу данных в режиме 32k. Конечно данные идут, но одни и те же значения повторяются 4 раза. А значит скорость обновления данных 8k.

sniff

В любом случае, даже если данные идут пачками по 4 одинаковых значений, мы увеличили PID loop frequency в 2 раза. А есть ли в этом смысл или нет, это совсем другая история.

Добавить комментарий