Скорость передачи данных ADXL345, похоже, больше зависит от скорости передачи данных, чем от фактической скорости передачи данных, которую я установил.
У меня есть Arduino UNO, подключенный к ADXL345. Проблема в том, что мне нужно собирать данные с частотой не менее 50 Гц. ADXL345, согласно его техническому описанию, может работать на частоте до 3200 Гц без каких-либо проблем. Я использую библиотеку Adafruit с интерфейсом I2C, но акселерометр не поднимается выше 10-12 Гц, как сообщает функция getDataRate()
библиотеки Adafruit.
Я пытаюсь установить скорость передачи данных следующим образом:
accel.setDataRate(ADXL345_DATARATE_100_HZ);
Странно, что скорость передачи данных больше зависит от увеличения скорости передачи данных в начале моей функции настройки. Если я устанавливаю ее на 38400, я получаю около 90-92 показаний в секунду. Я настроил свой код таким образом, что каждое измерение с акселерометра записывается с временной меткой до секунд. Это снимок выходных данных последовательного монитора.
Data Rate: 9 Hz
------------------------------------
Sensor: ADXL345
Driver Ver: 1
Unique ID: 12345
Max Value: -156.91 m/s^2
Min Value: 156.91 m/s^2
Resolution: 0.04 m/s^2
------------------------------------
Range: +/- 8 g
84.00,18:40:4,15/7/2018,0.59,9.14,2.82
85.00,18:40:4,15/7/2018,0.59,9.14,2.86
86.00,18:40:4,15/7/2018,0.63,9.10,2.86
87.00,18:40:4,15/7/2018,0.55,9.10,2.82
88.00,18:40:4,15/7/2018,0.55,9.10,2.82
89.00,18:40:4,15/7/2018,0.59,9.10,2.82
90.00,18:40:4,15/7/2018,0.59,9.10,2.82
91.00,18:40:4,15/7/2018,0.55,9.10,2.86
92.00,18:40:4,15/7/2018,0.55,9.10,2.86
93.00,18:40:4,15/7/2018,0.63,9.10,2.90
94.00,18:40:4,15/7/2018,0.63,9.10,2.90
95.00,18:40:4,15/7/2018,0.63,9.06,2.82
96.00,18:40:4,15/7/2018,0.63,9.06,2.82
97.00,18:40:4,15/7/2018,0.59,9.06,2.82
98.00,18:40:4,15/7/2018,0.59,9.06,2.82
99.00,18:40:4,15/7/2018,0.59,9.10,2.82
Это проблема с кодом или adxl345?
@m.umar, 👍0
1 ответ
Лучший ответ:
Вы ведь знаете, что отправка данных через последовательный порт занимает время, не так ли?
Вы отправляете 41 байт за одно чтение. Последовательный порт имеет буфер на 64 байта. Ко второму чтению буфер заполняется, и вся печать блокируется, пока в буфере не появится место.
При 38400 бод это отправка 3840 байт в секунду. При 41 байте на чтение это 93,66 чтения в секунду (не включая время, необходимое для выполнения фактического чтения), которые вы можете втиснуть в последовательный порт.
Либо работайте на более высокой скорости, либо уменьшите объем данных, отправляемых за одно чтение, либо сделайте и то, и другое.
- Можно ли измерить скорость акселерометром? Насколько точно?
- OVF в последовательном мониторе вместо данных
- Снять гравитацию с акселерометра MPU-6050
- Обнаружение движущегося объекта, не являющегося человеком
- Использование MPU-6050 без I2C
- Акселерометр ADXL345 не работает
- Аналоговое преобразование угла из +70° в -70°
- Изменение скорости передачи данных не работает
Конечно, я увеличил скорость передачи данных до 115200, не меняя скорость передачи данных ADXL345. Теперь я получаю около 280-290 показаний на моем последовательном мониторе в секунду, что означает, что это узкое место устранено? Но getDataRate по-прежнему показывает 9 Гц, хотя на самом деле установлено 100 Гц., @m.umar
И почему я получаю 280-290 показаний, когда должно быть около 100 показаний в секунду?, @m.umar
То, как часто вы читаете, не влияет на то, как часто ADXL делает выборки. Вы просто получаете несколько показаний одного и того же., @Majenko
Значение, возвращаемое getDataRate, не является значением Гц — это число, которое равно одному из перечислений ADXL_DATARATE_x_HZ. https://github.com/adafruit/Adafruit_ADXL345/blob/master/Adafruit_ADXL345_U.h#L77, @Majenko
О, я понял, спасибо :) Только один последний вопрос, мне нужно собирать данные на частоте 50 Гц для алгоритма машинного обучения отслеживания активности, что, по моему мнению, означает, что каждую секунду нужно собирать 50 значений по осям x, y, z. Если я настрою скорость передачи данных так, чтобы получать «около» 50 значений каждую секунду в последовательном мониторе, означает ли это, что значения соответствуют фактической скорости передачи данных акселерометра?, @m.umar
Вам следует использовать выход прерывания (или сигнал готовности данных в регистрах ADXL), чтобы получить каждую точку данных, когда она фактически была создана., @Majenko
Хорошо, спасибо, что направили меня на верный путь, я этим займусь., @m.umar