aboutsummaryrefslogtreecommitdiff
path: root/apps/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'apps/drivers')
-rw-r--r--apps/drivers/drv_accel.h7
-rw-r--r--apps/drivers/drv_gyro.h8
-rw-r--r--apps/drivers/drv_mag.h8
-rw-r--r--apps/drivers/mpu6000/mpu6000.cpp78
4 files changed, 87 insertions, 14 deletions
diff --git a/apps/drivers/drv_accel.h b/apps/drivers/drv_accel.h
index 370cc5d87..65ef8420f 100644
--- a/apps/drivers/drv_accel.h
+++ b/apps/drivers/drv_accel.h
@@ -50,10 +50,15 @@
* structure.
*/
struct accel_report {
+ uint64_t timestamp;
float x;
float y;
float z;
- uint64_t timestamp;
+ float range_m_s2;
+ float scaling;
+ uint16_t x_raw;
+ uint16_t y_raw;
+ uint16_t z_raw;
};
/** accel scaling factors; Vout = (Vin * Vscale) + Voffset */
diff --git a/apps/drivers/drv_gyro.h b/apps/drivers/drv_gyro.h
index 82e23f62a..2f1dab6ba 100644
--- a/apps/drivers/drv_gyro.h
+++ b/apps/drivers/drv_gyro.h
@@ -50,10 +50,16 @@
* structure.
*/
struct gyro_report {
+ uint64_t timestamp;
float x;
float y;
float z;
- uint64_t timestamp;
+ float range_rad_s;
+ float scaling;
+
+ int16_t x_raw;
+ int16_t y_raw;
+ int16_t z_raw;
};
/** gyro scaling factors; Vout = (Vin * Vscale) + Voffset */
diff --git a/apps/drivers/drv_mag.h b/apps/drivers/drv_mag.h
index a59291778..f87cb7704 100644
--- a/apps/drivers/drv_mag.h
+++ b/apps/drivers/drv_mag.h
@@ -52,10 +52,16 @@
* Output values are in gauss.
*/
struct mag_report {
+ uint64_t timestamp;
float x;
float y;
float z;
- uint64_t timestamp;
+ float range_ga;
+ float scaling;
+
+ uint16_t x_raw;
+ uint16_t y_raw;
+ uint16_t z_raw;
};
/** mag scaling factors; Vout = (Vin * Vscale) + Voffset */
diff --git a/apps/drivers/mpu6000/mpu6000.cpp b/apps/drivers/mpu6000/mpu6000.cpp
index 999790e8a..b86e2da2f 100644
--- a/apps/drivers/mpu6000/mpu6000.cpp
+++ b/apps/drivers/mpu6000/mpu6000.cpp
@@ -364,12 +364,26 @@ MPU6000::init()
write_reg(MPUREG_SMPLRT_DIV, 0x04); // Sample rate = 200Hz Fsample= 1Khz/(4+1) = 200Hz
usleep(1000);
- // FS & DLPF FS=2000¼/s, DLPF = 98Hz (low pass filter)
+ // FS & DLPF FS=2000 deg/s, DLPF = 98Hz (low pass filter)
write_reg(MPUREG_CONFIG, BITS_DLPF_CFG_98HZ);
usleep(1000);
- write_reg(MPUREG_GYRO_CONFIG, BITS_FS_2000DPS); // Gyro scale 2000¼/s
+ // Gyro scale 2000 deg/s ()
+ write_reg(MPUREG_GYRO_CONFIG, BITS_FS_2000DPS);
usleep(1000);
+ // correct gyro scale factors
+ // scale to rad/s in SI units
+ // 2000 deg/s = (2000/180)*PI = 34.906585 rad/s
+ // scaling factor:
+ // 1/(2^15)*(2000/180)*PI
+ _gyro_scale.x_offset = 0;
+ _gyro_scale.x_scale = 1.0f / (32768.0f * (2000.0f / 180.0f) * M_PI_F);
+ _gyro_scale.y_offset = 0;
+ _gyro_scale.y_scale = 1.0f / (32768.0f * (2000.0f / 180.0f) * M_PI_F);
+ _gyro_scale.z_offset = 0;
+ _gyro_scale.z_scale = 1.0f / (32768.0f * (2000.0f / 180.0f) * M_PI_F);
+ _gyro_range_scale = 1.0f / (32768.0f * (2000.0f / 180.0f) * M_PI_F);
+
// product-specific scaling
switch (_product) {
case MPU6000ES_REV_C4:
@@ -394,6 +408,16 @@ MPU6000::init()
break;
}
+ // Correct accel scale factors of 4096 LSB/g
+ // scale to m/s^2 ( 1g = 9.81 m/s^2)
+ _accel_scale.x_offset = 0;
+ _accel_scale.x_scale = 1.0f / (4096.0f / 9.81f);
+ _accel_scale.y_offset = 0;
+ _accel_scale.y_scale = 1.0f / (4096.0f / 9.81f);
+ _accel_scale.z_offset = 0;
+ _accel_scale.z_scale = 1.0f / (4096.0f / 9.81f);
+ _accel_range_scale = 1.0f / (4096.0f / 9.81f);
+
usleep(1000);
// INT CFG => Interrupt on Data Ready
@@ -472,7 +496,7 @@ MPU6000::read(struct file *filp, char *buffer, size_t buflen)
if (_call_interval == 0)
measure();
- /* copy out the latest report */
+ /* copy out the latest reports */
memcpy(buffer, &_accel_report, sizeof(_accel_report));
ret = sizeof(_accel_report);
@@ -746,10 +770,18 @@ MPU6000::measure()
*/
_gyro_report.timestamp = _accel_report.timestamp = hrt_absolute_time();
+ _accel_report.x_raw = report.accel_x;
+ _accel_report.y_raw = report.accel_x;
+ _accel_report.z_raw = report.accel_x;
+
_accel_report.x = report.accel_x * _accel_range_scale;
_accel_report.y = report.accel_y * _accel_range_scale;
_accel_report.z = report.accel_z * _accel_range_scale;
+ _gyro_report.x_raw = report.gyro_x;
+ _gyro_report.y_raw = report.gyro_y;
+ _gyro_report.z_raw = report.gyro_z;
+
_gyro_report.x = report.gyro_x * _gyro_range_scale;
_gyro_report.y = report.gyro_y * _gyro_range_scale;
_gyro_report.z = report.gyro_z * _gyro_range_scale;
@@ -816,17 +848,26 @@ int
test()
{
int fd = -1;
+ int fd_gyro = -1;
struct accel_report report;
+ struct gyro_report g_report;
ssize_t sz;
const char *reason = "test OK";
do {
-
/* get the driver */
fd = open(ACCEL_DEVICE_PATH, O_RDONLY);
if (fd < 0) {
- reason = "can't open driver, use <mpu6000 start> first";
+ reason = "can't open accel driver, use <mpu6000 start> first";
+ break;
+ }
+
+ /* get the driver */
+ fd_gyro = open(GYRO_DEVICE_PATH, O_RDONLY);
+
+ if (fd_gyro < 0) {
+ reason = "can't open gyro driver, use <mpu6000 start> first";
break;
}
@@ -834,17 +875,32 @@ test()
sz = read(fd, &report, sizeof(report));
if (sz != sizeof(report)) {
- reason = "immediate read failed";
+ reason = "immediate acc read failed";
break;
}
printf("single read\n");
fflush(stdout);
- printf("time: %lld\n", report.timestamp);
- printf("x: %5.2f\n", (double)report.x);
- printf("y: %5.2f\n", (double)report.y);
- printf("z: %5.2f\n", (double)report.z);
- printf("test: %8.4f\n", 1.5);
+ printf("time: %lld\n", report.timestamp);
+ printf("acc x: %5.2f m/s^2\n", (double)report.x);
+ printf("acc y: %5.2f m/s^2\n", (double)report.y);
+ printf("acc z: %5.2f m/s^2\n", (double)report.z);
+ printf("acc range: %4.0f m/s^2 (%3.0f g)\n", (double)report.range_m_s2,
+ (double)(report.range_m_s2 / 9.81f));
+
+ /* do a simple demand read */
+ sz = read(fd, &g_report, sizeof(g_report));
+
+ if (sz != sizeof(g_report)) {
+ reason = "immediate gyro read failed";
+ break;
+ }
+
+ printf("gyro x: %5.2f rad/s\n", (double)g_report.x);
+ printf("gyro y: %5.2f rad/s\n", (double)g_report.y);
+ printf("gyro z: %5.2f rad/s\n", (double)g_report.z);
+ printf("gyro range: %3.0f rad/s (%5.0f deg/s)\n", (double)g_report.range_rad_s,
+ (double)(g_report.range_rad_s / M_PI_F * 180.0f));
} while (0);