Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2294042
  • 博文数量: 187
  • 博客积分: 1457
  • 博客等级: 上尉
  • 技术积分: 2423
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-13 09:41
个人简介

如需要绘制PCB,设计电路可以和我联系。sunhenu@163.com.

文章分类

全部博文(187)

文章存档

2017年(2)

2016年(2)

2015年(7)

2014年(13)

2013年(80)

2012年(83)

分类: 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运行的时候,有时候数据离实际值差的离谱,不知道为何会这样的啊,有网友知道,告诉我一下的啊。

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

阅读(11710) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

jy023261662013-05-24 21:42:46

我用2g量程  64是90° 
63就差了很多,不知道你有没有这种情况