智能车制作

标题: MMA7660 使用大汇总--红树伟业 [打印本页]

作者: harley881022    时间: 2012-3-31 18:40
标题: MMA7660 使用大汇总--红树伟业
本帖最后由 harley881022 于 2012-3-31 18:40 编辑

     首先在介绍本篇技术文档之前,我先简单介绍一下我们这个团队,作为红树伟业背后技术支持也有一段时间了,对于绝大多是人来说,我们还没被大家所熟悉了解,可能我们做技术的都比较低调吧,呵呵,相信你们都懂的!
    其实我们的团队的成员还是比较有特点的,有在校大三的学生,有在校研究生,也有毕业一两年的社会初生虎,团队人数有十几个人,初具规模了,嘿嘿!我们有一个共同的特点,也是最重要的特点就是我们在科研的路上始终专注,精益求精,把现在最有限的时间奋力投入到科研的这条路上,我们喜欢所以我们专注。在电子设计比赛方面,我们有很丰富的比赛经验,相信能为你以后参加各种比赛或者项目开发出谋献策。好吧,废话不多说,让我们转入今天的正题:关于对MMA7660的探讨,前半部分是我们整理的资料,后半部分是我们产品的一些东西。用它就让我们去了解它吧!
一、简介
    MMA7660是-1.5g ~ 1.5g范围的XYZ三轴检测加速度大小,由数字IIC输出,是非常低功耗、小形容性MEMS传感器,具有低通滤波器,用于0g和增益误差的补偿以及用户可配置的转化成6位数值。模拟电压为2.4-3.6V,数字工作电压1.71-3.6V,可进行三轴取向/运动的检测,广泛应用与手机、PDA、便携PC的防盗、游戏的运动检测等
    由于MMA7660比较低端,因此也只有6BIT的精度,而且输出值上还会有3个刻度的误差,因此在值的输出上,必须经过一个软件的均值滤波处理。一般来说,如果传感器只是应用于方位检测的话,8个值的滤波就够了。而用于动作检测的话,一般使用32阶的均值滤波。
    MMA7660的采用IIC的接口。在读取XYZ坐标的时候,最好采用的就是Multiple Byte Read的方式,这样才能保证XYZ三个坐标是同一次采样的结果。如果分开读取,则有可能读取到不同组的采样数据。

二、工作原理:          MMA7660是一种电容式g-sensor. 与压阻式不同的是, 电容式很难在同一个结构中同时感测到三个轴的变化, 通常都是X,YZ分开来的, (这也就是为什么当板子水平放置时,无论如何改变X,Y的位置,都不会有中断产生,因为这时它只能检测Z轴的变化,X,Y的变化它检测不到, 只有当我们将板子倾斜一个角度后才能检测X,Y的变化) . 而压阻式在同一个结构就能感测到三个轴的变化.
[attach]21748[/attach]
    MMA7660加速度传感器主要由两部分组成:G-单元和信号调理ASIC电路(见上图)。G-单元是机械结构,它是用半导体制作技术、有多晶硅半导体材料制成,并且是密封的,图中的积分、放大、滤波、温度补偿、控制逻辑和EEPROM相关电路、振荡器、始终生成器、以及自检等电路组成,完成G-单元测量的电容值到电压输出的转换
    G-单元的等效电路如上图所示,它相当于在两个固定的电容板中间放置一个可移动的极板。当有加速度作用于系统时,中间极板偏离静止位置。用中间极板偏离知之为止的距离测量加速度,中间极板与其中一个固定极板的距离增加,同时与另一个固定极板的距离减少,且距离变化值相等。距离的变化使得两个极板间的电容改变(如图)。
    信号调理ASIC电路将G-单元测量的两个电容值转换成加速度值,并使加速度与输出电压成正比。当测量完毕后,在INT1/INT2输出高电平,用户可以通过IICSPI接口读取MMA7660内部的寄存器的值,判断运动的方向。自检单元用于保证G-单元和加速计芯片中的电路工作正常,输出电压成比例。

三、工作模式:
     MMA7660主要有三种工作模式.(MMA766010个寄存器可供设置其工作模式,采样速率,中断使能等。)

         1).  Standby(待机)模式
此时只有I2C工作,接收主机来的指令. 该模式用来设置寄存器. 也就是说, 要想改变MMA7660的任何一个寄存器的值,必须先进入Standby模式. 设置完成后再进入ActiveAuto-Sleep模式.
         2). Active and Auto-Sleep (活动并且Auto-Sleep) 模式
         MMA7660的工作状态分两种, 一种是高频度采样, 一种是低频度采样. 为什么这样分呢, 为了节省功耗,但是在活动时又保持足够的灵敏度.
         所以说MMA7660Active模式其实又分两种模式,一种是纯粹的Active模式, 即进了Active模式后一直保持高的采样频率,不变. 还有一种是Active & Auto-Sleep模式, 就是说系统激活后先进入高频率采样,经过一定时间后,如果没检测到有活动,它就进入低频率采样 ,所以就叫做Auto-Sleep,它不是睡眠模式, 它只是降低采样频率
         3). Auto-Wake (自动唤醒) 模式
              Auto-Sleep后就进入低频率采样模式,这种模式就叫做Auto-Wake摸式, 即自动唤醒模式.值得注意的是,该模式并非真正的休眠模式,而只是低速采样模式。在该模式下,能够有效地降低芯片的运行功耗。
  
四、管脚介绍


五、 初始化:
[attach]21749[/attach]

六、模块原理图
七、模块接线图简图
八、参考程序
/********************
起始信号
********************/
void IIC_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
}
/*******************
停止信号
*******************/
void IIC_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}
/*****************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
*****************/
void IIC_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}
/***************
接收应答信号
***************/
bit IIC_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
    return CY;
}
/***********************
向IIC总线发送一个字节数据
***********************/
void IIC_SendByte(BYTE dat)
{
    BYTE i;
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    IIC_RecvACK();
}
/***********************
从IIC总线接收一个字节数据
***********************/
BYTE IIC_RecvByte()
{
    BYTE i;
    BYTE dat = 0;
    SDA = 1;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        dat |= SDA;             //读数据               
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    return dat;
}
//*****************
void MMA7660_write(uchar REG_Address,uchar REG_data)
{
    IIC_Start();                  //起始信号
    IIC_SendByte(SlaveAddress);   //发送设备地址+写信号
IIC_SendByte(REG_Address);    //内部寄存器地址   
IIC_SendByte(REG_data);       //内部寄存器数据
    IIC_Stop();                   //发送停止信号
    Delay5us();                  //延时   
}
//********单字节读取*********
uchar MMA7660_read(uchar REG_Address)
{
    uchar REG_data;
    IIC_Start();                          //起始信号
    IIC_SendByte(SlaveAddress);           //发送设备地址+写信号
    IIC_SendByte(REG_Address);                   //发送存储单元地址,从0开始  
    IIC_Start();                          //起始信号
    IIC_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    REG_data=IIC_RecvByte();              //读出寄存器数据
    IIC_SendACK(1);   
    IIC_Stop();                           //停止信号
    return REG_data;
}
void MMA7660_Startup(void)
{
                              
   MMA7660_write(MMA7660_MODE,0x00);             //stand mode first to modify the registers
   MMA7660_write(MMA7660_SPCNT,0);              //disable sleep count
   MMA7660_write(MMA7660_INTSU,0x84);          //enable tap and shake x detection interrupt
   MMA7660_write(MMA7660_PDET,0x75);          //enable z_axis tap detection  10101counts
   MMA7660_write(MMA7660_SR,0);              //SPS registers(samples per second)
   MMA7660_write(MMA7660_PD,0x17);          //tap/pulse debounce count registers   
   MMA7660_write(MMA7660_MODE,0x41);       //goto active mode int push_pull                             
}
九、模块说明
   
红树伟业推出的MMA7660模块,结构简单,尺寸小,不占据空间。VCC采用5V电源供电,内部有622稳压芯片,转化成3.3V供给芯片MMA7660SCLSDAIIC总线上的时钟和信号线,时钟为高时,读取数据。在上面的程序上,已经写的非常清楚了。MMA7660特点鲜明,比起MMA7361来说,数据读取速度要快,这点对于C组模型车来说是非常重要的,采集速度越快,反馈速度越快,小车才能走得直。而MMA7455MMA7660的升级版,精度更高,且有SPI通信功能,速度更快。MMA7660INT为中断引脚,当数据准备发送时候,会发出信号给MCU
模块的介绍就到此结束,下期再推出MMA7455的介绍,欢迎大家一起来讨论,关注我们红树伟业,一起学习,一起进步,你们的批评与建议,我们才能做到更好。

作者: Goolloo    时间: 2012-3-31 23:04
好帖子
作者: jxndlym    时间: 2012-4-1 03:03
不错
作者: 停顿十秒    时间: 2012-4-1 19:49
谢谢大家对红树伟业的支持!


                                                 红树伟业------------------致力于服务师生
作者: yssdsz    时间: 2012-4-3 15:07
停顿十秒 发表于 2012-4-1 19:49
谢谢大家对红树伟业的支持!

亲,7660精度是不是微低啊。。。。。

作者: wbin91    时间: 2012-5-5 15:35
停顿十秒 发表于 2012-4-1 19:49
谢谢大家对红树伟业的支持!

这个iic可以与5v单片机通信吗,我用了能行,会烧坏芯片吗?



作者: 什么你说    时间: 2012-7-6 20:10
先顶一个,比赛好像用的是模拟的加速度传感器吧??
作者: 风水影动    时间: 2013-8-12 22:07

作者: lance    时间: 2015-1-20 20:29
赞一个,这个太棒了




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2