Использование данных акселерометра ADXL345 на I2 C (Beaglebone Black) - PullRequest
0 голосов
/ 19 февраля 2020

Справочная информация

Я пытаюсь убедиться, что смогу запустить два акселерометра ADXL345 на одной шине I2 C.

Насколько я понимаю, шина может передавать до 400 Кбит / с в быстром режиме.

Для отправки 1 байта данных есть 20 дополнительных служебных битов.

Есть 6 байтов на чтение акселерометра (XLow, XHigh, YLow, YHigh, ZLow, ZHigh)

Мне нужно сделать 1000 чтений в секунду с обоими акселерометрами

Таким образом, мой итог объем данных, используемых в секунду, составляет 336 Кбит / с, что в пределах моего предела составляет 400 Кбит / с.

Я не уверен, правильно ли я выполняю эти вычисления.

Вопрос:

Сколько данных я передаю в секунду с двумя акселерометрами, считывающими 1000 раз в секунду на i2 c?

1 Ответ

0 голосов
/ 19 февраля 2020

Ваша математика, кажется, немного не в порядке; для этого акселерометра (из таблицы: https://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345.pdf), чтобы прочитать 6 байтов данных образца XYZ, необходимо выполнить 6-байтовое пакетное считывание регистров. С точки зрения передачи данных это означает запись адреса регистра в акселерометр (0x31), а затем непрерывное считывание 6 байтов. Для каждой из этих двух передач требуется сначала отправить адрес устройства I2 C и бит R / W, а также ACK / NAK на байт, включая байты адреса, а также условия START / REPEAT START / STOP. Итак, в целом, индивидуальный перенос для получения одной выборки (ie, один вектор ускорения XYZ) выглядит следующим образом:

Start (*) | Device Address: 0x1D (7) | Write: 0 (1) | ACK (1) | Register Address: 0x31 (8) | ACK (1) | Repeat Start (*) | Device Address: 0x1D (7) | Read: 1 (1) | ACK (1) | DATA0 (8) | ACK(1) | DATA1 (8) | ACK (1) | ... | DATA5 (8) | NAK (1) | Stop (*)

Если сложить все это, мы получим 81 + 3 бита данных, которые должны быть переданы. Во-первых, обратите внимание, что START, REPEAT START и STOP на самом деле могут не занимать каждый бит времени, но для простоты мы можем предположить, что они это делают. Также обратите внимание, что хотя адрес устройства составляет всего 7 бит, вам всегда нужно добавить бит READ / WRITE, поэтому транзакция I2 C всегда равна 8 битам + ACK / NAK, то есть всего 9 битов. Также обратите внимание, что максимальная скорость передачи I2 C действительно определяет максимальную скорость SCK, которую устройство может обрабатывать, поэтому в быстром режиме SCK составляет не более 400 кГц (т.е. не более 400 Кбит / с, но из-за протокола вы получите меньше в реальных данных). Таким образом, 84 бита на частоте 400 кГц означают, что мы можем передать сэмпл за 0,21 мс или ~ 4700 сэмплов / сек c при условии отсутствия промежутков или перерывов при передаче.

Поскольку необходимо считывать 2 сэмпла каждые 1 мс (2 акселерометры, то есть 84 бит * 2 = 164 бит / сэмпл или 164 кбит / с при частоте дискретизации 1 кГц), это должно быть как минимум возможно в быстром режиме I2 C. Однако вам нужно быть осторожным, чтобы полностью использовать контроллер I2 C. В зависимости от уровня программного обеспечения, с которым вы работаете, может быть достаточно быстро выполнить пакетное чтение I2 C (ie, 2 пакетных чтения в течение 1 мс). Использование FIFO на акселерометре могло бы значительно помочь в требовании к задержке, то есть вместо того, чтобы иметь 1 мс для выдачи двух пакетных чтений, вы можете отложить до 32 мс для выдачи 64 пакетных чтений (поскольку у вас есть 2 акселерометра); но так как вам нужно выдать новое пакетное чтение, чтобы прочитать следующий пример, вы должны быть осторожны с задержкой, вносимой программным обеспечением между вызовами любого API, который вы используете для выполнения транзакций I2 C.

...