锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-08-07 14:00:00 nt1传感器4a磁电系列加速度传感器5e0100200112传感器传感器qs30nt磁传感器

简介

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从机地址可通过外引脚配置,具体如下
SA1 SA0 Slave Address
0 0 0x1E
0 1 0x1D
1 0 0x1C
1 1 0x1F
  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;
}
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章