Настройка акселерометра на датчике BNO055

Я использую датчик BNO055 9DOF Adafruit для измерения ускорения/ориентации. Как изменить конфигурацию акселерометра с 4G (по умолчанию) на 16G?

Что я уже знаю:

Техническое описание: https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf

В пункте 3.5.2 на странице 27 мне нужно изменить xxxxxx01b на xxxxxx11b в файле конфигурации (то есть в библиотеке). Я использую https://github.com/adafruit/Adafruit_BNO055, но не смог найти информацию о том, что и где нужно изменить в h-файле.

Есть идеи?

Спасибо

, 👍1


1 ответ


2

Это частично обсуждалось как проблема на GitHub библиотеки

  • https://github.com/adafruit/Adafruit_BNO055/issues/48

Вот как я это понимаю:

Библиотека не настраивает нужные вам регистры. Я не вижу ссылки на запись в регистр ACC_CONFIG (адрес 8). Это даже не определено в заголовке.

Датчик имеет две страницы регистров (0 и 1) [см. стр. 50]. То есть, если выбрать страницу 0, то регистр по адресу X будет означать одно, а на странице 1 — другое.

Мы хотим записать в ACC_Config по адресу 0x08 на странице 1.

На странице 77 говорится, что относительно записи в регистр: «Запись: может быть изменена только в режиме датчика, см. раздел 3.5.2».

В коде можно что-то взломать:

  • https://github.com/adafruit/Adafruit_BNO055/blob/master/Adafruit_BNO055.cpp#L115

После перехода в режим датчика вы можете записать в регистр как

//значения взяты из раздела 3.5.2, стр. 27
#define BNO055_ACC_CONFIG_2G (0) //0B00
#define BNO055_ACC_CONFIG_4G (1) //0B01
#define BNO055_ACC_CONFIG_8G (2)  //0B10
#define BNO055_ACC_CONFIG_16G (3)  //0B11

//определения пропускной способности
#define BNO055_ACC_BW_7_81_Hz (0)  
#define BNO055_ACC_BW_15_63_Hz (1)  
#define BNO055_ACC_BW_31_25_Hz (2)   
#define BNO055_ACC_BW_62_5_Hz (3)  
#define BNO055_ACC_BW_125_Hz (4)  
#define BNO055_ACC_BW_250_Hz (5)  
#define BNO055_ACC_BW_500_Hz (6)  
#define BNO055_ACC_BW_1000_Hz (7) 

//определения режима мощности
#define BNO055_ACC_PWRMODE_NORMAL (0)  
#define BNO055_ACC_PWRMODE_SUSPEND (1) 
#define BNO055_ACC_PWRMODE_LP1 (2) 
#define BNO055_ACC_PWRMODE_STANDBY (3)  
#define BNO055_ACC_PWRMODE_LP2 (4) 
#define BNO055_ACC_PWRMODE_DEEP_SUSPEND (5) 

#define BNO055_ACC_CONFIG_ADDR 0x08 

//Выберите идентификатор страницы 1 для записи в правый регистр
write8(BNO055_PAGE_ID_ADDR, 1);
//создать значение конфигурации с помощью битовых сдвигов
//см. стр. 77
//использовать все стандартные значения, кроме параметра 16G
uint8_t acc_config = (uint8_t)((BNO055_ACC_PWRMODE_NORMAL << 5) 
                   | (BNO055_ACC_BW_62_5_Hz << 2)  
                   | BNO055_ACC_CONFIG_16G); 
//записать новую конфигурацию акселерометра
write8(BNO055_ACC_CONFIG_ADDR, acc_config);

//возврат к идентификатору страницы 0 (или тому, что было до этого)
//В противном случае мы считываем данные датчика с неправильной страницы, имея совершенно другой смысл.
write8(BNO055_PAGE_ID_ADDR, 0);

Поскольку у меня нет этого датчика, я не могу его проверить. Это лишь базовая идея. Вы также можете читать регистры с помощью read8, чтобы убедиться, что перед записью в регистр он имеет некое стандартное (или ожидаемое) значение. Например, ACC_CONFIG должен читаться как 0B00001101 = 0x0d. И после записи значения вы должны иметь возможность прочитать то же значение обратно, иначе чип не позволил бы вам выполнить запись, и вам придётся разбираться, почему.

Да, большую часть работы придётся выполнять самостоятельно. Переход с 4G на 16G может также повлечь за собой необходимость в других расчётах исходных данных, но я в этом не уверен.

,