Скорость передачи данных акселерометра mpu6050 в Arduino Uno и частота дискретизации mpu6050

mpu6050 имеет частоту дискретизации 1 кГц (указано в таблице данных). Но когда я связываю его с Arduino Uno через связь I2C (скорость шины 400 кГц), я получаю только 50 необработанных данных (каждый из x, y, z). В программе нет задержек. почему это происходит. Почему я не получаю 1000 или хотя бы 800 образцов. Какую концепцию мне здесь не хватает? Пожалуйста, объясните подробно. Я также прикрепил код и вывод за 1 секунду.

#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
//#include <SoftwareSerial.h>
//SoftwareSerial BTserial(10,11);
MPU6050 accelgyro;
char ch;
int incomingbyte = 0;
int16_t ax, ay, az;
int16_t gx, gy, gz;

void setup() {

  Wire.begin();
  Serial.begin(115200);

  accelgyro.initialize();
  accelgyro.setXAccelOffset(542);
  accelgyro.setYAccelOffset(-835);
  accelgyro.setZAccelOffset(1651);
  accelgyro.setXGyroOffset(6);
  accelgyro.setYGyroOffset(-18);
  accelgyro.setZGyroOffset(23);
}
void loop()
{
  accelgyro.getAcceleration(&ax, &ay, &az);
  accelgyro.getRotation(&gx, &gy, &gz);

  Serial.print(ax); Serial.print("\t");
  Serial.print(ay); Serial.print("\t");
  Serial.println(az);
}

, 👍3

Обсуждение

в даташите указано, что частота дискретизации программируется... похоже, задействован регистр 25... в этом документе описаны функции регистра... https://invensense.tdk.com/wp-content/uploads/2015/02/ MPU-6000-Регистр-Карта1.pdf, @jsotola

Привет @jsotola, спасибо за ответ. Я обнаружил, что делитель частоты дискретизации, который находится в регистре 0x25, был установлен 255. Таким образом, частота дискретизации должна составлять либо 31,25 Гц, DLPF отключен, либо 3,9 Гц, когда DLPF включен, в соответствии с таблицей данных (стр. № 12 в предоставленной вами ссылке). Тем не менее я получаю больше этих значений, около 50 образцов. Почему? Кроме того, частота дискретизации отличается от скорости передачи данных от mpu6050 к Arduino Uno, верно? Можете ли вы подробно объяснить, например, сколько байтов будет передано через i2c и все эти расчеты. я этого не понимаю, @Sreeranjani Sekar

Установите для I2C значение 400 кГц с помощью Wire.setClock(), я думаю, что по умолчанию оно установлено на 100 кГц. Это увеличит частоту дискретизации с 50 Гц до 200 Гц. Если этого недостаточно, я думаю, вам придется отключить цифровой фильтр нижних частот., @Quazi Irfan

Ваша проблема в Serial.print, который замедляет цикл. Добавьте счетчик в свой цикл и время от времени выполняйте команду Serial.print., @NickB

я хочу знать, какова единица этого сигнала? например, что такое 5608 ?? в первом ряду, @Masoud Maleki


1 ответ


1

Причина в том, что Serial.print() работает гораздо медленнее, чем считывание образца с датчика.

Если вы прокомментируете print(), затем несколько раз прочитаете данные датчика в течение определенного времени и соответствующим образом рассчитаете скорость выходных данных, вы обнаружите, что частота дискретизации действительно составляет 1000 Гц.

Если вам нужно просто сохранить данные и использовать их впоследствии (вместо обработки в реальном времени), вы можете сохранить показания датчиков на SD- карте, что всегда намного быстрее, чем последовательная печать. Полезный трюк заключается в том, что не записывайте данные на SD-карту каждый раз, когда получаете новый образец, а используйте программный буфер (т. е. массив) для хранения образцов (размер буфера зависит от оперативной памяти микроконтроллера), а затем записывайте все целиком. буфер на SD-карту, когда он заполнен.

Однако, пока вы хотите хранить данные (либо печатать последовательно, либо записывать в файл), вам всегда придется «жертвовать» некоторой скоростью передачи данных и вы не сможете получить 1 кГц, как указано в таблице данных. Надеюсь, это поможет.

,