Прорыв LSM9DS1 - Как увеличить скорость

Что касается прорыва Adafruit LSM9DS1: введите здесь описание ссылки

И с помощью библиотеки: введите здесь описание ссылки

Я пытаюсь увеличить частоту дискретизации или скорость этого чипа. Я использую Sparkfun Pro Micro 5V

С библиотекой adafruit вам нужно одновременно запросить акселерометр, гироскоп, магнитометр и температуру, и все, что мне нужно, это значения акселерометра. Я надеюсь, выяснив, как запрашивать только значения ускорения, это ускорит цикл. Но кроме того, должен быть какой-то другой параметр, который мог бы увеличить частоту дискретизации?

Буду признателен за любую помощь!

мой код сейчас:

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_LSM9DS1.h>
#include <Adafruit_Sensor.h>  // в этой демонстрации не используется, но необходим!
Adafruit_LSM9DS1 lsm = Adafruit_LSM9DS1();
#define LSM9DS1_SCK A5
#define LSM9DS1_MISO 12
#define LSM9DS1_MOSI A4
#define LSM9DS1_XGCS 6
#define LSM9DS1_MCS 5

void setupSensor()
{
  // 1.) Установить диапазон акселерометра
  lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_2G);
  //lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_4G);
  //lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_8G);
  //lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_16G);

  // 2.) Установить чувствительность магнитометра
  lsm.setupMag(lsm.LSM9DS1_MAGGAIN_4GAUSS);
  //lsm.setupMag(lsm.LSM9DS1_MAGGAIN_8GAUSS);
  //lsm.setupMag(lsm.LSM9DS1_MAGGAIN_12GAUSS);
  //lsm.setupMag(lsm.LSM9DS1_MAGGAIN_16GAUSS);

  // 3.) Настраиваем гироскоп
  lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_245DPS);
  //lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_500DPS);
  //lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_2000DPS);
}

double accelX = 0;
double accelY = 0;
double accelZ = 0;
double rms = 0;

void setup() 
{
  Serial.begin(115200);
  // Попытаться инициализировать и предупредить, если мы не смогли обнаружить чип
  if (!lsm.begin())
  {
    Serial.println("Oops ... unable to initialize the LSM9DS1. Check your 
wiring!");
    while (1);
  }
  Serial.println("Found LSM9DS1 9DOF");
  setupSensor();
  delay(5000);//стабилизация программы
}

void loop() 
{
  lsm.read();
  sensors_event_t a, m, g, temp;
  lsm.getEvent(&a, &m, &g, &temp); 
  accelX = a.acceleration.x;
  accelY = a.acceleration.y;
  accelZ = a.acceleration.z;
  rms = (accelX*accelX)+(accelY*accelY)+(accelZ*accelZ);
  Serial.println(rms);
}

, 👍0


2 ответа


Лучший ответ:

1

Проверьте заголовок библиотеки,

вы найдете readAccel readMag readGyro и readTemp в отдельных общедоступных функциях и посмотрите на реализация read, он просто вызывает эти 4 последовательно. readAccel обновит поле члена accelData.

Таким образом, вы можете просто вызвать lsm.readAccel() в цикле, а затем напрямую получить lsm.accelData и игнорировать все остальное.

void loop() 
{
  lsm.readAccel();
  accelX = lsm.accelData.x;
  accelY = lsm.accelData.y;
  accelZ = lsm.accelData.z;
  rms = (accelX*accelX)+(accelY*accelY)+(accelZ*accelZ);
  Serial.println(rms);
}
,

Спасибо! Я попробую это, надеюсь, это немного ускорит выборку., @MattG

Это сработало, теперь частота дискретизации значительно выше, когда я реализовал приведенный выше код от @ratchet freak., @MattG

@MattG, изучив код более подробно, понял, что getEvent также сделал read(). Таким образом, ваш исходный код выполнял полное чтение дважды и использовал данные только для половины фактически считанных образцов., @ratchet freak

это имеет смысл, теперь, когда я реализовал ваши предложения, это значительно быстрее. Еще раз спасибо., @MattG


1

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

,

Я вижу, вы можете перевести устройство только в режим ускорения, но, к сожалению, я не понимаю, как на самом деле реализовать инструкции. Это то, что будет изменено в файлах библиотеки?, @MattG

В Adafruit_LSM9DS1.h библиотеки Adafruit в строке 243 находится несколько функций для чтения отдельных датчиков (например, Sensor& getAccel (void) { return _accelSensor; }). Чтобы получить преимущество во времени, вам может потребоваться перевести устройство в режим только ускорения, что, да, потребует некоторого изучения файла .cpp библиотеки, чтобы выяснить, как это сделать или где добавить возможность. Я также вижу, что есть несколько доступных вариантов скорости передачи данных. Но это все, что я знаю об этом устройстве. Больше нужно будет посмотреть код библиотеки и таблицу данных., @JRobert

хорошо, спасибо за вклад и помощь @jrobert!, @MattG