这个三轴加速度是国外的,开源做的不好,但集成在手机上用的很多。
网上搜索了一番找不到资料,官网能找到linux或者处理器平台的驱动,github上也是。
其实也就是一个IIC驱动,用国产的8位单片机。不知道为啥,竟然有很多问这个但是不会驱动的,刚好做了,拿出来记录一波。
主要参数如下,找到寄存器map就可以撸IIC驱动了
unsigned char KXTJ2_Init(void)
{
unsigned char tmp_data=0x00;
unsigned char tmp_count=0;
Timer0_Delay1ms(20);
//After the part is powered up, it takes 10ms before it is ready for I2C communication.
do{
if(tmp_count++>200)
return 0;
Timer0_Delay1ms(2);
tmp_data=Single_Read(KXTJ2_1009_I2C_SLAVE_ADDR,KXTJ2_1009_REG_DEVID);
}
while(tmp_data!=0x09);
Single_Write(KXTJ2_1009_I2C_SLAVE_ADDR,KXTJ2_1009_REG_DATA_FORMAT,0x00);//PC1 = 0
Timer0_Delay1ms(20);
Single_Write(KXTJ2_1009_I2C_SLAVE_ADDR,KXTJ2_1009_REG_DATA_FORMAT,0x40);// +-2G 12bit
Single_Write(KXTJ2_1009_I2C_SLAVE_ADDR,KXTJ2_1009_REG_BW_RATE,0x02); // ODR 50HZ
Single_Write(KXTJ2_1009_I2C_SLAVE_ADDR,KXTJ2_1009_REG_DATA_FORMAT,0xC0);// PC1 = 1
//After the part is enabled (PC1 bit in Control Register 1 is asserted), it
//takes from 2.1 ms to 80 ms depending on the ODR before the acceleration outputs are valid.
Timer0_Delay1ms(100);
return 1;
}
核心初始化代码如上,主要配置量程,和ODR。
这样就可以读到最原始的数据了。最重要的问题来了,它的数据存放格式在官网的另一个文档里,后面才搜到。高8为和低8位的高4位有效
经过这点,就可以正确的读取到原始数据了,可是还有一个隐藏的问题,这可不像6050,16位,符号数你基本不用管。这个可是12位的有符号数,需要转成16位有符号数。下面这个函数一步到位了,直接转成了以重力加速度g值为单位的返回参数
/*
* 函数功能:12bit加速度计转换成G值
* 参数
* h--高八位值
* l--低八位的高四位
* 函数返回值:加速度g值
*/
float mma_switch(unsigned char h,unsigned char l)
{
float ret;
unsigned short int V1,h_l;
int sign;
h_l=(h<<8u)+l;
//12位
if(h>0x7F)
{
sign=-1;
V1=(~(h_l>>4)+1)&0X0FFF;
}
else
{
sign=1;
V1=(h_l>>4)&0X0FFF;
}
ret=sign*(((double)V1)/0x3ff);
return ret;
}
经过上面的转换,终于得到了三轴检测到的加速度值了,然后可以姿态解算等。用于测水平,运动加速度检测等等。如果有二次开发的可以联系我。
如果需要IMU模块 或者IMU方案定制 可以参考淘宝https://item.taobao.com/item.htm?spm=a230r.1.14.220.3fbce2151EzKi0&id=618941554431&ns=1&abbucket=3#detail
致敬开源
--骚年追梦