这段时间调试一个mma8452Q传感器,对几种模式进行了简单的测试 ,注释可能存在数据不准确的情况,大体流程及每个模式操作的寄存器是没问题的,高手勿喷,
各项阀值,需要根据实际情况进行更改。
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
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寄存器,查找是什么产生了中断