Почему float, а не 16-битное целое число? Mpu6050 с ATmega328P
Я пытался следовать этому примеру кода для сопряжения моего ATmega328P с Mpu6050: https://www.instructables.com/Accelerometer-MPU-6050-Communication-With-AVR-MCU/
И мне было интересно кое - что еще. Прежде всего, датчики на MPU6050 являются 16-битными, что означает, что каждое значение датчика, такое как Ax, Ay и т.д., Составляет 2 байта каждый (8-бит + 8-бит = 16-бит = 2 байта).
Сам код читается из следующей строки при получении значений: AcX = Wire.read()<<8 | Wire.read();
где сначала считывается MSB (8-битный), а затем LSB (8-битный); что дает нам 2 байта.
Итак, чего я не понимаю, так это почему он использует значения float для хранения данных датчика, а не 16-битный int? Поскольку float имеют длину 4 байта, разве это не добавит кучу нулей к полученным 2 байтам?
@Robin Svensson, 👍0
Обсуждение2 ответа
Лучший ответ:
В коде instructables он использует float
, потому что хочет масштабировать значение до диапазона ±2g. Значения, которые дает акселерометр, являются не фактическими значениями, а, как и АЦП Arduino, представлением значения с использованием диапазона. Разделив это представление на 16384, вы получите фактическое значение G, которое является десятичным значением.
Это значение может быть более полезным, чем необработанные данные.
Что касается другого фрагмента кода, который вы предоставляете, он не может работать. Он не только использует глобальные переменные, которые не существуют, но и возвращает значение из функции void, которое не может произойти. Я не совсем понимаю, чего он надеется достичь.
Поплавки не так просты. Преобразование в float происходит в момент деления. Побочное объединение выполняется в int. Это не может быть сделано в float, потому что float не представляет значение таким образом. Если затем вы назначите байту значение с плавающей точкой, это будет байт, и любая десятичная часть будет отброшена., @Majenko
Мы не можем знать причины этого автора, но типичная причина, по которой кто-то может использовать floats против ints, заключается в том, что они предпочитают не управлять местоположением двоичной точки и любыми возможными переполнениями во время следующих вычислений. Вместо этого они готовы принять компромисс между временем выполнения и временем программирования, а также повышенные требования к памяти (как оперативной, так и флэш-памяти), позволяющие библиотеке с плавающей запятой делать это за них.
Обновление:
Или, как подразумевается в другом месте, программатор не знает, как вычислять с помощью целочисленной арифметики (что, честно говоря, немного сложнее, чем просто выписывать формулу).
- Можно ли получить значения только во время вибрации/движения с акселерометра (ADXL335/MPU6050)?
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
В вашем втором вопросе, что вы подразумеваете под "потерянными данными"? Передается ли информация с полной точностью?, @JRobert
Код, который вы показываете, кажется, был написан кем-то, кто не знает, что делает. Не обращайте на это слишком много внимания., @Edgar Bonet