1. 环境
STM32F4 + GPU9250.
2. GPU9250介绍
使用I2C + INT中断脚, 使用MPL6.12库
硬件
传感器周边不要有震动原件(按键,马达等), 周围 6MM最好留空. PCB的角度在实际应用中会有偏差,即不可能完全水平或者垂直.
3轴 MEMS 陀螺仪. 陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps)
3轴 MEMS 加速计. 加速度计可测范围为±2,±4 ,±8,±16g
可扩展的DMP(DigitalMotionProcessor)
内嵌了一个温度传感器和在工作环境下仅有±1%变动的振荡器
可编程的低通滤波器。
片上 1024 字节的 FIFO
通信采用 400kHz 的 I2C 接口 (对于 CMSIS的标准定义为 ARM_I2C_BUS_SPEED_FAST ), 只能作为从设备.
AD0引脚: I2C Slave 地址 LSB, 不接或接地时从地址为 0x68, 接高电平V3.3时为 0x69.
通过 XCL/XDA可以扩展第三方数字传感器, 如磁力计,压力计等. 1. 工作在 Master Mode 2. Pass-Through Mode(仅作为连接,允许MPU和扩展第三方数字传感器同时与 HOST 通信)
INT引脚 : 中断数字输出(推挽或开漏)
数据
以数字输出 6 轴旋转矩阵、四元数(quaternion)、欧拉角格式(EulerAngle forma)的融合演算数据
传感器数据寄存器包含了最新的陀螺仪、加速度计、外接传感器以及温度数据,是只读的. (可用中断函数来设置何时新的数据是可用的)
FIFO 配置寄存器可以决定让什么数据进入,可选陀螺仪、加速度计、温度、外部传感器,以及 FSYNC 输入。一个 FIFO计数器可以跟踪存入 FIFO 的字节数。
中断配置寄存器: 可配置的项目包括 INT 引脚设置,中断关闭和清除方法,以及中断触发。
中断状态可以从中断状态寄存器读出
可以触发中断的事件有:
(1)切换时钟源;
(2)DMP 完成;
(3)有新的数据可供读取(从 FIFO 和数据寄存器);
(4)加速度计中断;
(5)MPU-60X0 未收到外接传感器的回应(辅助 I2C 总线)。
温度传感器通过一个 ADC 来产生数字温度测量信号,其值可从 FIFO 或者传感器数据寄存器读出
数据处理
DMP: DMP 从陀螺仪、加速度计以及外接的传感器接收并处理数据,处理结果可以从 DMP寄存器读出,或通过 FIFO 缓冲
自检: 自检可用来测试传感器的机械和电气结构。对每个测量轴的自检可通过设置控制寄存器GYRO_CONFIG 和 ACCEL_CONFIG 的相关位来进行。自检启动后,电路会使传感器工作并且产生输出信号
中断处理: INT 脚上产生中断信号.
自由落体中断(Free Fall Interrupt)
通过检测 3 个轴上的加速度测量值是否在规定的阈值内来判断自由落体运动。对每一次的采样值,如果没达到阈值将会被忽略。一旦达到阈值,即触发自由落体中断,并产生标志位。
直到计数器降到 0,标志才被清楚。计数器的取值范围在 0 和规定的阈值之间。
可用 FF_THR 寄存器设置阈值,精确到 1mg。用 FF_DUR 寄存器设置持续时间,精确到 1ms。
使用 MOT_DETECT_CTRL 寄存器,可以设置是否用一个无效的采样值使计数器清零 ,或者以 1、2 或 4 的量衰减
产生落体中断的坐标轴及其方向可以在寄存器 FF_DETECT_STATUS 中读出, 读出后中断标志位被清零
运动中断(Motion Interrupt)
(为了排除重力所产生的误差), 加速度计的测量值都要通过一个可配置的数字高通滤波器(DHPF)。通过高通滤波器后的值如果大于事先规定的阈值,则被认为是有效的。
对每个有效的采样值,计数器加 1,而对无效值则计数器减 1。一旦计数器值达到用户设定的计数阈值,则触发运动中断。
产生运动中断的坐标轴及其方向可以在寄存器 MOT_DETECT_STATUS 中读出,
读出后中断标志位被清零
加速阈值寄存器 MOT_THR,精确到 1mg. 计数阈值寄存器 MOT_DUR,精确到 1ms。
寄存器
MOT_DETECT_CTRL来设置耍贱率.
静止中断(Zero Motion Interrupt)
也采用数字高通滤波器(DHPF)以及同样的阈值、计数机制. 每根轴上的测量值通过 DHFT 后必须小于事先规定的阈值 (ZRMOT_THR). 计数值 ZRMOT_DUR 达到时, 产生静止中断
当第一次检测到静止以及不再检测到时,静止中断都会被触发
//========================================================================================================================
程序设计部分
初始化 采用 DMP_ON
-
#define DEFAULT_MPU_HZ (100)
#define INV_X_GYRO (0x40)
#define INV_Y_GYRO (0x20)
#define INV_Z_GYRO (0x10)
#define INV_XYZ_GYRO (INV_X_GYRO | INV_Y_GYRO | INV_Z_GYRO)
#define INV_XYZ_ACCEL (0x08)
#define INV_XYZ_COMPASS (0x01)
-
mpu_init(); //调用库内api, (硬件复位, wakeup, 状态机充值)
-
mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL) //mpu_set_sensor
-
mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL) //mpu_configure_fifo
-
mpu_set_sample_rate(DEFAULT_MPU_HZ)
-
dmp_load_motion_driver_firmware()) //dmp_load_motion_driver_firmvare
-
dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation)))
-
dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP | DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO | DMP_FEATURE_GYRO_CAL))
dmp_set_fifo_rate(DEFAULT_MPU_HZ))
-
run_self_test(); //自检
-
mpu_set_dmp_state(1))
运行时发现有数据,或者while (1)轮询
#define q30 1073741824.0f
float Pitch,Roll,Yaw;
dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);
/* Gyro and accel data are written to the FIFO by the DMP in chip frame and hardware units.
* This behavior is convenient because it keeps the gyro and accel outputs of dmp_read_fifo and mpu_read_fifo consistent.
**/
if (sensors & INV_XYZ_GYRO )
send_packet(PACKET_TYPE_GYRO, gyro);
if (sensors & INV_XYZ_ACCEL)
send_packet(PACKET_TYPE_ACCEL, accel);
/* Unlike gyro and accel, quaternions are written to the FIFO in the body frame, q30.
* The orientation is set by the scalar passed to dmp_set_orientation during initialization.
**/
if(sensors & INV_WXYZ_QUAT )
{
q0 = quat[0] / q30;
q1 = quat[1] / q30;
q2 = quat[2] / q30;
q3 = quat[3] / q30;
Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; //yaw
}
阅读(4190) | 评论(0) | 转发(0) |