原创 MMA7455加速度传感器使用

2013-1-21 11:10 1226 7 7 分类: MCU/ 嵌入式 文集: MCU

 

MMA7455加速度传感器是freescale公司的看下面的链接

http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA745xL

这个页面可以下载它的datasheet,和应用笔记,很重要,里面还有一些参考例程。

24343357_1344406697MYdy.jpg

 

简单说一下这个传感器的,是3轴加速度传感器。数字输出接口是IIC或者SPI,很容易使用单片机控制该芯片,它还有低功耗模式,可以用于电池供电。检测最大加速度是正负8g,有不同的灵敏度,如16/g,32/g,64/g,可以选择的,使用这个芯片最主要还是对芯片的寄存器的操作,我具体说一下

24343357_1344406701eRi5.jpg

 

地址为06-08的寄存器保存的就是XYZ轴的加速度数值,可以同过IIC读出来,然后利用灵敏度转化为实际的加速度数值。那个DRDY是数值转换完成状态位,在读取数值前,要检测该位,只有它为1的时候,说明数据转换完成,可以读取。

 

因为这个芯片是利用变化的电容来检测加速度的,所以有个初始值的误差,需要校正,校正寄存器是下图,

24343357_1344406706g6hg.jpg

就是说,上面的06-08寄存器的值,是加上这个校正值后的值,注意这个校正寄存器可以保存正负校正值,都是用二进制补码格式的,啥是二进制补码,可以去google,不多说了。不过这里说明一下这个校正值的权值是1/2灵敏度,就是说如果X值是5,你要给它归零,你就需要在X校正寄存器写入-5*2,也就是-10,-10的二进制补码是1111 0110 这是8位二进制的值,要是16位二进制的值就是1111 1111 1111 0110,就是0xFFF6,我们就要把0xFFF6写入10,11寄存器里面,那个是高低位就不用说了吧。

下面的图片是从它的应用技术文档里面截取的。

24343357_1344406710NhSZ.jpg

 

这个芯片有几种运行模式,省电模式,测量模式,水平检测模式,脉冲检测模式,我们使用测量模式。

24343357_1344406703hY5w.jpg

 

 

主要的流程也就是这么多了。下面对照程序说明一下流程这样比较直观。

24343357_1344407054Huo6.jpg

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.

24343357_1344477793p7nd.jpg

24343357_1344477795s04c.jpg

24343357_1344477797nrj4.jpg

24343357_134447780036ID.jpg

 

 

最后说一点的啊,我上面的图片是瞬时截图,使用看着数据很好,其实,在我多次go运行的时候,有时候数据离实际值差的离谱,不知道为何会这样的啊,有网友知道,告诉我一下的啊。

24343357_1344478214803B.jpg

我这张图片就是那种很不好的情况,芯片放置方向和上面四张图片的第一张方向一致。

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条