如需要绘制PCB,设计电路可以和我联系。sunhenu@163.com.
分类: LINUX
2012-08-08 14:17:19
MMA7455加速度传感器是freescale公司的看下面的链接
这个页面可以下载它的datasheet,和应用笔记,很重要,里面还有一些参考例程。
简单说一下这个传感器的,是3轴加速度传感器。数字输出接口是IIC或者SPI,很容易使用单片机控制该芯片,它还有低功耗模式,可以用于电池供电。检测最大加速度是正负8g,有不同的灵敏度,如16/g,32/g,64/g,可以选择的,使用这个芯片最主要还是对芯片的寄存器的操作,我具体说一下
地址为06-08的寄存器保存的就是XYZ轴的加速度数值,可以同过IIC读出来,然后利用灵敏度转化为实际的加速度数值。那个DRDY是数值转换完成状态位,在读取数值前,要检测该位,只有它为1的时候,说明数据转换完成,可以读取。
因为这个芯片是利用变化的电容来检测加速度的,所以有个初始值的误差,需要校正,校正寄存器是下图,
就是说,上面的06-08寄存器的值,是加上这个校正值后的值,注意这个校正寄存器可以保存正负校正值,都是用二进制补码格式的,啥是二进制补码,可以去google,不多说了。不过这里说明一下这个校正值的权值是1/2灵敏度,就是说如果X值是5,你要给它归零,你就需要在X校正寄存器写入-5*2,也就是-10,-10的二进制补码是1111 0110 这是8位二进制的值,要是16位二进制的值就是1111 1111 1111 0110,就是0xFFF6,我们就要把0xFFF6写入10,11寄存器里面,那个是高低位就不用说了吧。
下面的图片是从它的应用技术文档里面截取的。
这个芯片有几种运行模式,省电模式,测量模式,水平检测模式,脉冲检测模式,我们使用测量模式。
主要的流程也就是这么多了。下面对照程序说明一下流程这样比较直观。
ISendStr(0x3a,0x16,0x09,1);是配置工作模式,测量模式,正负4G,
ISendStr(0x1D<<1,0x10,6,1);
ISendStr(0x1D<<1,0x11,0,1);
ISendStr(0x1D<<1,0x12,17,1);
ISendStr(0x1D<<1,0x13,0,1);
ISendStr(0x1D<<1,0x14,0xfd,1);
ISendStr(0x1D<<1,0x15,0xff,1);
添加校正值,要经过测试,自己选择比较合适的值。
while(!(readydata&0x01))
{
IRcvStr(0x3a,0x09,&readydata,1);
}
IRcvStr(0x3a,0x06,&xdata,1);
IRcvStr(0x3a,0x07,&ydata,1);
IRcvStr(0x3a,0x08,&zdata,1);
这就是读取XYZ轴的值了。
下面的if语句是判断语句,自己可以设置,然后点亮二极管啥的。
这里调用的函数都是IIC函数,不多说了了,就这样结束吧。下面传几张,我断点调试的图,显示XYZ轴的数据,原始的数据,也就是06-08寄存器的数据。至于是怎么放置的,我想你看看XYZ轴的数据就会明白了吧。
量程是正负4G,灵敏度是32/G.
最后说一点的啊,我上面的图片是瞬时截图,使用看着数据很好,其实,在我多次go运行的时候,有时候数据离实际值差的离谱,不知道为何会这样的啊,有网友知道,告诉我一下的啊。
我这张图片就是那种很不好的情况,芯片放置方向和上面四张图片的第一张方向一致。