MMA8452Q几种模式的初始化实例

这段时间调试一个mma8452Q传感器,对几种模式进行了简单的测试 ,注释可能存在数据不准确的情况,大体流程及每个模式操作的寄存器是没问题的,高手勿喷,

各项阀值,需要根据实际情况进行更改。

1、运动模式
void MMA8452Q_Init_motion(void) 
{
kal_uint8 dev_id;
int i=0;
       float temp;
       MMA8452Q_Delay(2);                    //上电延时
    //TODO   初始化iic
//MMA8452_Standby();
Single_Write_MMA8452(0x2A,0x10);//将设备设置为100hz odr 
   MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x15,0xf8);// 配置寄存器通过设置 “或”条件OAE =1 是能XY方向运动检测和锁存
   MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x17,0x11);//设定移动侦测阀值>3G 注:步数0.063/计数   3g/0.063 = 47.6 ~ 48  1.2/0.063 =20
   MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x18,0x0a);// 设置去斗计数器100HZ采样率,计时器100毫秒 以消除虚假度数
   MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x2d,0x04);//启用系统中运动/自由落体中断功能(CTRL_REG4)
   MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x2e,0x04);//将运动/自由落体中断功能配置到INT1的硬件引脚(CTRL_REG5)
Single_Write_MMA8452(CTRL_REG1, 0x01);//设置为800hz
MMA845x_Active();

   MMA8452Q_Delay(10); 

}

2、自由落体模式

void MMA8452Q_Init_freefall(void) //mma8452q::mma8452q(uint8_t addr) {
{
kal_uint8 dev_id;
int i=0;
       float temp;
       MMA8452Q_Delay(2);                    //上电延时
//TODO 初始化iic

Single_Write_MMA8452(0x2A,0x20);//将设备设置为50hz odr  0x20 , 0x1A =100hz  ,0x12= 200hz
   MMA8452Q_Delay(10); 

Single_Write_MMA8452(0x15,0xB8);// 配置寄存器通过设置 “或”条件OAE =0 是能XY方向运动检测和锁存
   MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x17,0x06);//设定移动侦测阀值产生的加速度<0.2g 注:步数0.063/计数   0.2g/0.063 = 3.17  1.2/0.063 =20
   MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x18,0x10);// 设置去斗计数器50HZ采样率,计时器120毫秒 以消除虚假度数 10
   MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x2d,0x04);//启用系统中运动/自由落体中断功能(CTRL_REG4)
   MMA8452Q_Delay(10); 
//Single_Write_MMA8452(0x2e,0x04);//将运动/自由落体中断功能配置到INT1的硬件引脚(CTRL_REG5)
MMA845x_Active();
   MMA8452Q_Delay(10); 

}

运功和自由落体读取的中断寄存器为0x16


3、初始化单脉冲模式

void MMA8452Q_Init_one_tap()

{

    kal_uint8 dev_id;

    int i=0;
   float temp;
   MMA8452Q_Delay(2);                    //上电延时

//TODO 初始化iic


//1、芯片进入待机模式 设置为400hz
Single_Write_MMA8452(0x2A,0x08);//将设备设置为50hz odr  20 di 1A 100hz  0x12 200hz  0x08 400hz
   MMA8452Q_Delay(10); 
//2、设置运行xyz轴单点中断
Single_Write_MMA8452(0x21,0x15);//设置xyz 方向中断
MMA8452Q_Delay(10); 
//3、设置单点中断 的阀值
Single_Write_MMA8452(0x23,0x19);//每一步是 0.0063g/count   1.575g/0.063 = 25counts   2.65g/0.063g=42counts  
MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x24,0x19);//1.575g
MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x25,0x2A);//2.65g
MMA8452Q_Delay(10); 
//4、设置单点中断触发时间 50ms  正常模式不是低滤波
//50ms/0.063 = 80counts
Single_Write_MMA8452(0x26,0x50);//50ms
MMA8452Q_Delay(10); 
//5、设置延时时间
//数据频率是400hz 每一步是 1.25ms
//300ms/1.25ms = 240conut
Single_Write_MMA8452(0x27,0xF0);//50ms
MMA8452Q_Delay(10); 
//6、设置系统中断到 int1 
Single_Write_MMA8452(0x2D,0x08);//设置中断区系统  CTRL_REG4
MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x2E,0x08);//指定硬件中断脚到 INT1 CTRL_REG5
MMA8452Q_Delay(10); 
//7、激活芯片
MY_Multiple_Read_MMA8452(0x2A,0);//读取到的值付给 BUF[0]  
MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x2A,BUF[0]|0x01);//指定硬件中断脚到 INT1 CTRL_REG5

MMA8452Q_Delay(10); 

}

4、初始化双脉冲模式

void MMA8452Q_Init_two_tap()
{


kal_uint8 dev_id;
int i=0;
   float temp;
   MMA8452Q_Delay(2);                    //上电延时
//TODO 初始化iic
//1、芯片进入待机模式 设置为400hz
Single_Write_MMA8452(0x2A,0x08);//将设备设置为50hz odr  20 di 1A 100hz  0x12 200hz  0x08 400hz
   MMA8452Q_Delay(10); 
//2、设置运行xyz轴单点中断 双击中断 DPA =0 
Single_Write_MMA8452(0x21,0x2A);//设置xyz 方向中断
MMA8452Q_Delay(10); 
//3、设置各轴中断 的阀值  每一步是 0.0063g
Single_Write_MMA8452(0x23,0x19);//每一步是 0.0063g/count   1.575g/0.063 = 25counts   2.65g/0.063g=42counts  
MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x24,0x19);//1.575g
MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x25,0x2A);//2.65g
MMA8452Q_Delay(10); 
//4、设置单点中断触发时间 60ms   400HZ ODR 梯步是1.25ms 每步(count)
//60ms/1.25 = 48counts
Single_Write_MMA8452(0x26,0x30);//60ms
MMA8452Q_Delay(10); 
//5、设置延时时间200ms 低滤波模式 400hz ODP LPMODE 梯步是2.5ms
//数据频率是400hz 每一步是 2.5ms
//200ms/2.5ms = 80conut
Single_Write_MMA8452(0x27,0x50);//200ms
MMA8452Q_Delay(10); 
//6、设置第二次脉冲间隔   低滤波模式 400hz ODP LPMODE 梯步是2.5ms
//300ms/2.5ms = 120counts
Single_Write_MMA8452(0x28,0x78);//300ms
MMA8452Q_Delay(10); 
//7、设置系统中断到 int1 
Single_Write_MMA8452(0x2D,0x08);//设置中断区系统  CTRL_REG4
MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x2E,0x08);//指定硬件中断脚到 INT1 CTRL_REG5
MMA8452Q_Delay(10); 
//8、激活芯片
MY_Multiple_Read_MMA8452(0x2A,0);//读取到的值付给 BUF[0]  
MMA8452Q_Delay(10); 
Single_Write_MMA8452(0x2A,BUF[0]|0x01);//指定硬件中断脚到 INT1 CTRL_REG5
MMA8452Q_Delay(10); 

}

脉冲对应的中断寄存器为




每次产生中断优先读取0x0C寄存器,查找是什么产生了中断



猜你喜欢

转载自blog.csdn.net/yi_tianchou/article/details/80610684
今日推荐