Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9396801
  • 博文数量: 1748
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20070
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1748)

文章存档

2024年(23)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Android平台

2017-08-25 15:55:04

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
  1. #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)

  2. mpu_init();  //调用库内api, (硬件复位, wakeup, 状态机充值)
  3. mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL)  //mpu_set_sensor
  4. mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL) //mpu_configure_fifo  
  5. mpu_set_sample_rate(DEFAULT_MPU_HZ)  
  6. dmp_load_motion_driver_firmware())     //dmp_load_motion_driver_firmvare
  7. dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation)))
  8. 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)) 
     
  9. run_self_test(); //自检
  10. 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) |
给主人留下些什么吧!~~