Скорость передачи данных акселерометра 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);
}
1 ответ
Причина в том, что Serial.print() работает гораздо медленнее, чем считывание образца с датчика.
Если вы прокомментируете print(), затем несколько раз прочитаете данные датчика в течение определенного времени и соответствующим образом рассчитаете скорость выходных данных, вы обнаружите, что частота дискретизации действительно составляет 1000 Гц.
Если вам нужно просто сохранить данные и использовать их впоследствии (вместо обработки в реальном времени), вы можете сохранить показания датчиков на SD- карте, что всегда намного быстрее, чем последовательная печать. Полезный трюк заключается в том, что не записывайте данные на SD-карту каждый раз, когда получаете новый образец, а используйте программный буфер (т. е. массив) для хранения образцов (размер буфера зависит от оперативной памяти микроконтроллера), а затем записывайте все целиком. буфер на SD-карту, когда он заполнен.
Однако, пока вы хотите хранить данные (либо печатать последовательно, либо записывать в файл), вам всегда придется «жертвовать» некоторой скоростью передачи данных и вы не сможете получить 1 кГц, как указано в таблице данных. Надеюсь, это поможет.
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Объяснение кода MPU6050
- Изменение адреса I2C MPU-6050
- Снять гравитацию с акселерометра MPU-6050
- Как соединить L293D и MPU6050 для совместной работы?
- Как откалибровать Mpu6050 с помощью библиотеки?
в даташите указано, что частота дискретизации программируется... похоже, задействован регистр 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