FXOS8700CQ 6轴传感器的介绍与调试

简介

FXOS8700CQ 6轴传感器是NXP推出的一款在小型 3 x 3 x 1.2 mm QFN 塑料封装中结合了先进的 3 轴加速度传感器(±2g/±4g/±8g) 和 3 轴磁力计传感器。
这款产品将14位加速度传感器和16位磁力计与高性能ASIC结合在一起构建电子罗盘解决方案,典型的方向分辨率为0.1°,罗盘方位精度误差小于5°,可满足很多应用。

特性

  • 完整的6轴电子罗盘硬件解决方案,高度集成
  • 1.95 V至3.6 V VDD电源电压,1.62 V至3.6 V VDDIO电压
  • ±2g /±4g /±8g动态可选的加速度满量程范围
  • ±1200μT磁传感器满量程范围
  • 每个传感器的输出数据速率(ODR)为1.563 Hz至800 Hz,在两个传感器均处于激活状态的混合模式下时最高为400Hz
  • 低噪声:在200-Hz时加速度噪声密度<126μg/√Hz Hz带宽,<100 nT /√Hz(100 Hz带宽时)电磁噪声密度
  • 14位ADC分辨率用于加速度测量
  • 16位ADC分辨率用于磁性测量
  • 低功耗:100 Hz时电流消耗240μA,在25Hz且两个传感器均处于激活状态消耗80μA
  • 嵌入式可编程加速度事件功能
  • 跌落和运动检测
  • 瞬态检测
  • 矢量幅度变化检测
  • 脉冲和拍击检测(单次和双次)ient方向检测(纵向/横向)
  • 嵌入式可编程磁事件功能
  • 阈值检测
  • 矢量幅度变化检测
  • Aut最小/最大不定磁检测
  • 自动硬铁校准
    具体特性详见 FXOS8700CQ-Datasheet

传感器代码的调试

  1. FXOS8700CQ的数字接口
  • 传感器支持I2C和SPI接口通信,本次测试使用I2C来与传感器通信.
  • I2C的从机地址可以通过外部引脚进行配置,具体如下
SA1SA0Slave Address
000x1E
010x1D
100x1C
110x1F
  1. FXOS8700CQ的寄存器定义
/**********************************************************
 * Variables definition
 *********************************************************/
 /*
 * 7-bit I2C slave address determined by SA1 and SA0 logic level
 * inputs represented in the following table:
 *      SA1  |  SA0  |  Slave Address
 *      0    |  0    |  0x1E
 *      0    |  1    |  0x1D
 *      1    |  0    |  0x1C
 *      1    |  1    |  0x1F
 */
// Accel address
#define FXOS8700CQ_I2C_ADDR	              (0x1E << 1) //传感器的实际i2c地址还需要加上读写位
// WHO_AM_I register value
#define FXOS8700_WHOAMI_VALUE 		      0xC7
// Internal register definitions
#define FXOS8700CQ_STATUS			      0x00
#define FXOS8700CQ_OUT_X_MSB		      0x01
#define FXOS8700CQ_OUT_X_LSB		      0x02
#define FXOS8700CQ_OUT_Y_MSB		      0x03
#define FXOS8700CQ_OUT_Y_LSB		      0x04
#define FXOS8700CQ_OUT_Z_MSB		      0x05
#define FXOS8700CQ_OUT_Z_LSB		      0x06
#define FXOS8700CQ_F_SETUP			      0x09
#define FXOS8700CQ_TRIG_CFG			      0x0A
#define FXOS8700CQ_SYSMOD			      0x0B
#define FXOS8700CQ_INT_SOURCE		      0x0C
#define FXOS8700CQ_WHO_AM_I			      0x0D
#define FXOS8700CQ_XYZ_DATA_CFG		      0x0E
#define FXOS8700CQ_HP_FILTER_CUTOFF	      0x0F
#define FXOS8700CQ_PL_STATUS		      0x10
#define FXOS8700CQ_PL_CFG			      0x11
#define FXOS8700CQ_PL_COUNT			      0x12
#define FXOS8700CQ_PL_BF_ZCOMP		      0x13
#define FXOS8700CQ_PL_THS_REG		      0x14
#define FXOS8700CQ_A_FFMT_CFG		      0x15
#define FXOS8700CQ_A_FFMT_SRC		      0x16
#define FXOS8700CQ_A_FFMT_THS		      0x17
#define FXOS8700CQ_A_FFMT_COUNT		      0x18
#define FXOS8700CQ_TRANSIENT_CFG	      0x1D
#define FXOS8700CQ_TRANSIENT_SRC	      0x1E
#define FXOS8700CQ_TRANSIENT_THS	      0x1F
#define FXOS8700CQ_TRANSIENT_COUNT	      0x20
#define FXOS8700CQ_PULSE_CFG		      0x21
#define FXOS8700CQ_PULSE_SRC		      0x22
#define FXOS8700CQ_PULSE_THSX		      0x23
#define FXOS8700CQ_PULSE_THSY		      0x24
#define FXOS8700CQ_PULSE_THSZ		      0x25
#define FXOS8700CQ_PULSE_TMLT		      0x26
#define FXOS8700CQ_PULSE_LTCY		      0x27
#define FXOS8700CQ_PULSE_WIND		      0x28
#define FXOS8700CQ_ASLP_COUNT		      0x29
#define FXOS8700CQ_CTRL_REG1		      0x2A
#define FXOS8700CQ_CTRL_REG2		      0x2B
#define FXOS8700CQ_CTRL_REG3		      0x2C
#define FXOS8700CQ_CTRL_REG4		      0x2D
#define FXOS8700CQ_CTRL_REG5		      0x2E
#define FXOS8700CQ_OFF_X			      0x2F
#define FXOS8700CQ_OFF_Y			      0x30
#define FXOS8700CQ_OFF_Z			      0x31
#define FXOS8700CQ_M_DR_STATUS		      0x32
#define FXOS8700CQ_M_OUT_X_MSB		      0x33
#define FXOS8700CQ_M_OUT_X_LSB		      0x34
#define FXOS8700CQ_M_OUT_Y_MSB		      0x35
#define FXOS8700CQ_M_OUT_Y_LSB		      0x36
#define FXOS8700CQ_M_OUT_Z_MSB		      0x37
#define FXOS8700CQ_M_OUT_Z_LSB		      0x38
#define FXOS8700CQ_CMP_X_MSB		      0x39
#define FXOS8700CQ_CMP_X_LSB		      0x3A
#define FXOS8700CQ_CMP_Y_MSB		      0x3B
#define FXOS8700CQ_CMP_Y_LSB		      0x3C
#define FXOS8700CQ_CMP_Z_MSB		      0x3D
#define FXOS8700CQ_CMP_Z_LSB		      0x3E
#define FXOS8700CQ_M_OFF_X_MSB		      0x3F
#define FXOS8700CQ_M_OFF_X_LSB		      0x40
#define FXOS8700CQ_M_OFF_Y_MSB		      0x41
#define FXOS8700CQ_M_OFF_Y_LSB		      0x42
#define FXOS8700CQ_M_OFF_Z_MSB		      0x43
#define FXOS8700CQ_M_OFF_Z_LSB		      0x44
#define FXOS8700CQ_MAX_X_MSB		      0x45
#define FXOS8700CQ_MAX_X_LSB		      0x46
#define FXOS8700CQ_MAX_Y_MSB		      0x47
#define FXOS8700CQ_MAX_Y_LSB		      0x48
#define FXOS8700CQ_MAX_Z_MSB		      0x49
#define FXOS8700CQ_MAX_Z_LSB		      0x4A
#define FXOS8700CQ_MIN_X_MSB		      0x4B
#define FXOS8700CQ_MIN_X_LSB		      0x4C
#define FXOS8700CQ_MIN_Y_MSB		      0x4D
#define FXOS8700CQ_MIN_Y_LSB		      0x4E
#define FXOS8700CQ_MIN_Z_MSB		      0x4F
#define FXOS8700CQ_MIN_Z_LSB		      0x50
#define FXOS8700CQ_TEMP				      0x51
#define FXOS8700CQ_M_THS_CFG		      0x52
#define FXOS8700CQ_M_THS_SRC		      0x53
#define FXOS8700CQ_M_THS_X_MSB		      0x54
#define FXOS8700CQ_M_THS_X_LSB		      0x55
#define FXOS8700CQ_M_THS_Y_MSB		      0x56
#define FXOS8700CQ_M_THS_Y_LSB		      0x57
#define FXOS8700CQ_M_THS_Z_MSB		      0x58
#define FXOS8700CQ_M_THS_Z_LSB		      0x59
#define FXOS8700CQ_M_THS_COUNT		      0x5A
#define FXOS8700CQ_M_CTRL_REG1		      0x5B
#define FXOS8700CQ_M_CTRL_REG2		      0x5C
#define FXOS8700CQ_M_CTRL_REG3		      0x5D
#define FXOS8700CQ_M_INT_SRC		      0x5E
#define FXOS8700CQ_A_VECM_CFG		      0x5F
#define FXOS8700CQ_A_VECM_THS_MSB	      0x60
#define FXOS8700CQ_A_VECM_THS_LSB	      0x61
#define FXOS8700CQ_A_VECM_CNT		      0x62
#define FXOS8700CQ_A_VECM_INITX_MSB	      0x63
#define FXOS8700CQ_A_VECM_INITX_LSB	      0x64
#define FXOS8700CQ_A_VECM_INITY_MSB	      0x65
#define FXOS8700CQ_A_VECM_INITY_LSB	      0x66
#define FXOS8700CQ_A_VECM_INITZ_MSB	      0x67
#define FXOS8700CQ_A_VECM_INITZ_LSB	      0x68
#define FXOS8700CQ_M_VECM_CFG		      0x69
#define FXOS8700CQ_M_VECM_THS_MSB	      0x6A
#define FXOS8700CQ_M_VECM_THS_LSB	      0x6B
#define FXOS8700CQ_M_VECM_CNT		      0x6C
#define FXOS8700CQ_M_VECM_INITX_MSB	      0x6D
#define FXOS8700CQ_M_VECM_INITX_LSB	      0x6E
#define FXOS8700CQ_M_VECM_INITY_MSB	      0x6F
#define FXOS8700CQ_M_VECM_INITY_LSB	      0x70
#define FXOS8700CQ_M_VECM_INITZ_MSB	      0x71
#define FXOS8700CQ_M_VECM_INITZ_LSB	      0x72
#define FXOS8700CQ_A_FFMT_THS_X_MSB	      0x73
#define FXOS8700CQ_A_FFMT_THS_X_LSB	      0x74
#define FXOS8700CQ_A_FFMT_THS_Y_MSB	      0x75
#define FXOS8700CQ_A_FFMT_THS_Y_LSB	      0x76
#define FXOS8700CQ_A_FFMT_THS_Z_MSB	      0x77
#define FXOS8700CQ_A_FFMT_THS_Z_LSB	      0x78
  1. FXOS8700CQ的初始化
    初始化中配置了传感器的量程,采样速率,并配置了瞬态加速度中断,将产生的中断信道映射到INT2的引脚上。
/*******************************************************************************
* 名    称: Bsp_Fxos8700cqInit
* 功    能: Fxos8700cq传感器初始化
* 入口参数: 无
* 出口参数: 无
* 作  者: Roger-WY
* 创建日期: 2020-04-08
* 修    改:
* 修改日期:
* 备    注:
*******************************************************************************/
int8_t Bsp_Fxos8700cqInit(void)
{
    static uint8_t whoAmI = 0;
    int8_t ret = 0;
    OS_ERR err;

    Fxos8700cq_GpioInit();

    /* 配置 FXOS8700CQ 传感器 */
    Bsp_Fxos8700cqRdRegData(FXOS8700CQ_WHO_AM_I,&whoAmI,1);
    if(FXOS8700_WHOAMI_VALUE == whoAmI)
    {
        //ACC
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG1,0x00) != 1)   // CTRL_REG1, STANDBY
        {
            ret = -2;
        }
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_XYZ_DATA_CFG,0x02) != 1) //XYZ_DATA_CFG, +-8g 0.488 mg/LSB 未打开高通滤波
        {
            ret = -2;
        } else {
            GetAccSensitivity(ACCEL_RANGE_8G);                          //根据设置的量程修改加速度分辨率
        }
        //--------------- 配置瞬时加速度中断相关寄存器--------------------//

        //1 000 0101 瞬态加速度检测阈值设置(63mg/LSB)
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_TRANSIENT_THS,0x82) != 1)
        {
            ret = -2;
        }
        //see Table68
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_TRANSIENT_COUNT,0x02) != 1)
        {
            ret = -2;
        }

        /*000 1 1 1 1 0   使能Z,Y,X轴的瞬态加速度检测 关闭高通滤波
        # TRANSIENT_CFG:
        # tran_qs_ele  = 1 => event latching enabled 锁存中断寄存器状态
        # tran_qs_zefe = 1 => z-axis event detection enabled
        # tran_qs_yefe = 1 => y-axis event detection enabled
        # tran_qs_xefe = 1 => x-axis event detection enabled
        # tran_qs_hpf_byp = 0 => high-pass filter is NOT bypassed 关闭高通滤波
        */
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_TRANSIENT_CFG,0x1E) != 1)
        {
            ret = -2;
        }
        //--------------- 配置中断相关寄存器--------------------//
        //0 0 1 0 0 0 0 0 只使能了瞬态中断 //see page 47
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG4,0x20) != 1)
        {
            ret = -2;
        }
        //0 0 0 0 0 0 0 0   所有中断映射到INT2引脚上  //see page48
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG5,0x00) != 1)
        {
            ret = -2;
        }
        //0 1(睡眠模式下瞬态中断) 0 0 0 0(睡眠模式下加速度向量中断) 0(中断低电平有效) 1(开漏) //see page 47
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG3,0x41) != 1)
        {
            ret = -2;
        }
        //if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG2,0x07) != 1)   // 0 0 0 00 1 11  使能自动休眠  低功耗过采样模式
        //0 0 0 01(lownoise lowpower) 1(autosleep)  01
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG2,0x0D) != 1)
        {
            ret = -2;
        }
        //MAG  Setup device for hybrid mode, enable hybrid mode auto-increment
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_M_CTRL_REG1,0x1F) != 1) //  M_CTRL_REG1, Oversampling 16 100Hz hybrind, acc mag active
        {
            ret = -2;
        }
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_M_CTRL_REG2,0x20) != 1) //  M_CTRL_REG2, Jump to reg 0x33 after reading 0x06
        {
            ret = -2;
        }
        //if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG1,0x1D) != 1)   //  CTRL_REG1, Hybrid 100Hz, Low Noise, Active
        // 00 011 0 0 1 设置休眠模式下采样率(00:50HZ)  输出数据的速率(011:100HZ) 正常模式(0) 开启工作(1)
        //if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG1,0x19) != 1)
         // 00 000 0 0 1 设置休眠模式下采样率(00:50HZ)  输出数据的速率(000:800HZ/400HZ) 正常模式(0) 开启工作(1)
        if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG1,0x01) != 1)
        {
            ret = -2;
        }


        #ifdef  USE_FXOS_INT1
        Bsp_Fxos8700cqIntInit();    //中断初始化
        OSSemCreate ((OS_SEM      *)&SemFxos8700cqIntOne,
                     (CPU_CHAR    *)"fxos8700cqint_Sem",
                     (OS_SEM_CTR   )0,
                     (OS_ERR      *)&err);
        #endif

        Bsp_Fxos8700cqClearIntFlag();

    }
    else
    {
        ret = -1; //无法识别芯片
    }

    return(ret);

}
  1. FXOS8700CQ读取传感器的值
  • 读取温度值
    读取温度值,需要开启磁力计的功能才能使用
/*******************************************************************************
* 名    称: Bsp_ReadFxos8700cqTemp
* 功    能: 读取Fxos8700cq传感器温度
* 入口参数: pTemp :温度值 -40~125℃
* 出口参数: 0:读取成功 1:读取失败
* 作  者: Roger-WY
* 创建日期: 2020-04-08
* 修    改:
* 修改日期:
* 备    注: 读取温度,需要先打开磁力计
*******************************************************************************/
int8_t Bsp_ReadFxos8700cqTemp(int8_t *pTemp)
{
    uint8_t ctemp = 0;
    if(Bsp_Fxos8700cqRdRegData(FXOS8700CQ_TEMP,&ctemp,1))
    {
        *pTemp = (int8_t)((int8_t)ctemp * 0.96);
        return 0;
    }
    return -1;
}
```c

- 读取加速度值

```c
/*******************************************************************************
* 名    称: Bsp_ReadFxos8700cqAcc
* 功    能: 读取Fxos8700cq传感器加速度
* 入口参数: pAcc :加速度值
* 出口参数: 0:读取成功 1:读取失败
* 作  者: Roger-WY
* 创建日期: 2020-04-08
* 修    改:
* 修改日期:
* 备    注:
*******************************************************************************/
int8_t Bsp_ReadFxos8700cqAcc(fxos8700RawData_t *pAcc)
{
    uint8_t acc_buf[6] = {0};

    if(Bsp_Fxos8700cqRdRegData(FXOS8700CQ_OUT_X_MSB,acc_buf,6))
    {
        pAcc->x = (int16_t)(((acc_buf[0] << 8) | acc_buf[1])) >> 2;
        pAcc->y = (int16_t)(((acc_buf[2] << 8) | acc_buf[3])) >> 2;
        pAcc->z = (int16_t)(((acc_buf[4] << 8) | acc_buf[5])) >> 2;

        pAcc->x *= accSensitivity;
        pAcc->y *= accSensitivity;
        pAcc->z *= accSensitivity;

        return 0;
    }
    return -1;
}
  • 读取磁力计的值
/*******************************************************************************
* 名    称: Bsp_ReadFxos8700cqMagn
* 功    能: 读取Fxos8700cq传感器磁力计
* 入口参数: pMagnData :磁力计的值
* 出口参数: 0:读取成功 1:读取失败
* 作  者: Roger-WY
* 创建日期: 2020-04-08
* 修    改:
* 修改日期:
* 备    注: 磁力计的分辨率为 0.1uT/LSB
*******************************************************************************/
int8_t Bsp_ReadFxos8700cqMagn(fxos8700RawData_t *pMagnData)
{
    uint8_t magn_buf[6] = {0};

    if(Bsp_Fxos8700cqRdRegData(FXOS8700CQ_M_OUT_X_MSB,magn_buf,6))
    {
        pMagnData->x = ((magn_buf[0] << 8) | magn_buf[1]);
        pMagnData->y = ((magn_buf[2] << 8) | magn_buf[3]);
        pMagnData->z = ((magn_buf[4] << 8) | magn_buf[5]);

        pMagnData->x *= 0.1; //0.1uT/LSB
        pMagnData->y *= 0.1;
        pMagnData->z *= 0.1;

        return 0;
    }
    return -1;
}
  • 连续读取加速度和磁力计的值
    如果要连续读取,需要先配置磁力计M_CTRL_REG2寄存器在读取0x06寄存器后跳转到0x33寄存器
/*******************************************************************************
* 名    称: Bsp_ReadAccelMagnData
* 功    能: 连续读取Fxos8700cq传感器加速度和磁力计的值
* 入口参数: pAccelData: 加速度的值  pMagnData :磁力计的值
* 出口参数: 0:读取成功 1:读取失败
* 作  者: Roger-WY
* 创建日期: 2020-04-08
* 修    改:
* 修改日期:
* 备    注: 需要配置磁力计M_CTRL_REG2寄存器在读取0x06寄存器后跳转到0x33寄存器
*******************************************************************************/
int16_t Bsp_ReadAccelMagnData(fxos8700RawData_t *pAccelData, fxos8700RawData_t *pMagnData)
{
    uint8_t buf[13] = {0};

    if(Bsp_Fxos8700cqRdRegData(FXOS8700CQ_STATUS,buf,13))
    {
        pAccelData->x = (int16_t)(((buf[1] << 8) | buf[2])) >> 2;
        pAccelData->y = (int16_t)(((buf[3] << 8) | buf[4])) >> 2;
        pAccelData->z = (int16_t)(((buf[5] << 8) | buf[6])) >> 2;

        pAccelData->x *= accSensitivity;
        pAccelData->y *= accSensitivity;
        pAccelData->z *= accSensitivity;

        pMagnData->x = ((buf[7] << 8)  | buf[8]);
        pMagnData->y = ((buf[9] << 8)  | buf[10]);
        pMagnData->z = ((buf[11] << 8) | buf[12]);

        pMagnData->x *= 0.1; //0.1uT/LSB
        pMagnData->y *= 0.1;
        pMagnData->z *= 0.1;

        return 0;
    }
    return -1;
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荻夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值