二、工作原理: MMA7660是一种电容式g-sensor. 与压阻式不同的是, 电容式很难在同一个结构中同时感测到三个轴的变化, 通常都是X,Y和Z分开来的, (这也就是为什么当板子水平放置时,无论如何改变X,Y的位置,都不会有中断产生,因为这时它只能检测Z轴的变化,X,Y的变化它检测不到, 只有当我们将板子倾斜一个角度后才能检测X,Y的变化) . 而压阻式在同一个结构就能感测到三个轴的变化.
MMA7660加速度传感器主要由两部分组成:G-单元和信号调理ASIC电路(见上图)。G-单元是机械结构,它是用半导体制作技术、有多晶硅半导体材料制成,并且是密封的,图中的积分、放大、滤波、温度补偿、控制逻辑和EEPROM相关电路、振荡器、始终生成器、以及自检等电路组成,完成G-单元测量的电容值到电压输出的转换
G-单元的等效电路如上图所示,它相当于在两个固定的电容板中间放置一个可移动的极板。当有加速度作用于系统时,中间极板偏离静止位置。用中间极板偏离知之为止的距离测量加速度,中间极板与其中一个固定极板的距离增加,同时与另一个固定极板的距离减少,且距离变化值相等。距离的变化使得两个极板间的电容改变(如图)。
信号调理ASIC电路将G-单元测量的两个电容值转换成加速度值,并使加速度与输出电压成正比。当测量完毕后,在INT1/INT2输出高电平,用户可以通过IIC和SPI接口读取MMA7660内部的寄存器的值,判断运动的方向。自检单元用于保证G-单元和加速计芯片中的电路工作正常,输出电压成比例。
三、工作模式:
MMA7660主要有三种工作模式.(MMA7660有10个寄存器可供设置其工作模式,采样速率,中断使能等。)
1). Standby(待机)模式
此时只有I2C工作,接收主机来的指令. 该模式用来设置寄存器. 也就是说, 要想改变MMA7660的任何一个寄存器的值,必须先进入Standby模式. 设置完成后再进入Active或Auto-Sleep模式.
2). Active and Auto-Sleep (活动并且Auto-Sleep) 模式
MMA7660的工作状态分两种, 一种是高频度采样, 一种是低频度采样. 为什么这样分呢, 为了节省功耗,但是在活动时又保持足够的灵敏度.
所以说MMA7660的Active模式其实又分两种模式,一种是纯粹的Active模式, 即进了Active模式后一直保持高的采样频率,不变. 还有一种是Active & Auto-Sleep模式, 就是说系统激活后先进入高频率采样,经过一定时间后,如果没检测到有活动,它就进入低频率采样 ,所以就叫做Auto-Sleep,它不是睡眠模式, 它只是降低采样频率
3). Auto-Wake (自动唤醒) 模式
Auto-Sleep后就进入低频率采样模式,这种模式就叫做Auto-Wake摸式, 即自动唤醒模式.值得注意的是,该模式并非真正的休眠模式,而只是低速采样模式。在该模式下,能够有效地降低芯片的运行功耗。
四、管脚介绍
五、 初始化:
六、模块原理图
七、模块接线图简图
八、参考程序
/********************
起始信号
********************/
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供给芯片MMA7660。SCL和SDA为IIC总线上的时钟和信号线,时钟为高时,读取数据。在上面的程序上,已经写的非常清楚了。MMA7660特点鲜明,比起MMA7361来说,数据读取速度要快,这点对于C组模型车来说是非常重要的,采集速度越快,反馈速度越快,小车才能走得直。而MMA7455是MMA7660的升级版,精度更高,且有SPI通信功能,速度更快。MMA7660的INT为中断引脚,当数据准备发送时候,会发出信号给MCU。
模块的介绍就到此结束,下期再推出MMA7455的介绍,欢迎大家一起来讨论,关注我们红树伟业,一起学习,一起进步,你们的批评与建议,我们才能做到更好。