最近做一个设计G-Sense的设备,需要一个三轴加速度传感器,最终选择飞思卡尔的MMA7455,因为看起来似乎比博士的三轴加速度芯片简单一些,哈哈。原本是准备应用在ARM上的,首先在比较熟悉的AVR单片机的环境下做个测试。
  来个MMA7455模块的近照:

 

  考虑到7455工作在3.3V,所以用宽电压工作的Atmega16L,这样就不存在电压冲突的问题。电路图参考7455的Datasheet:

  在这里,中断INT1和INT2我都没有用,ACC_CS接3.3采用I2C模式,IADDR0接3.3,设置7455的写地址为0X3A,读地址为0X3B,该引脚如果接地,则7455的读写地址分分别为0X38和0X39(参考7455手册)。

下面贴出所有的代码(测试通过)

注意USART.h为串口调试代码,我已经省略,可以根据自己的习惯修改。

/****************************************Copyright (c)**************************************************
**                                  Southeast Univerdity
**--------------File Info-------------------------------------------------------------------------------
** File Name:          Type.h
** Last modified Date: 2011-09-1
** Last Version:       1.0
** Description:         定义数据类型的别名
**------------------------------------------------------------------------------------------------------
** Created By:         JianGe
** Created date:       2011-09-01
** Version:            1.0
**------------------------------------------------------------------------------------------------------ */#ifndef  __TYPE_H__
#define  __TYPE_H__ /********************************************************************************************************
*                       Date types(Compiler specific)  数据类型(和编译器相关)                         *
********************************************************************************************************/
typedef unsigned char  uint8;          // Unsigned  8 bit quantity  无符号8位整型变量
typedef signed   char  int8;           // Signed    8 bit quantity  有符号8位整型变量
typedef unsigned short uint16;         // Unsigned 16 bit quantity  无符号16位整型变量
typedef signed   short int16;          // Signed   16 bit quantity  有符号16位整型变量
typedef unsigned int   uint32;         // Unsigned 32 bit quantity  无符号32位整型变量
typedef signed   int   int32;          // Signed   32 bit quantity  有符号32位整型变量
typedef float           fp32;          // Single precision floating point 单精度浮点数(32位长度)
typedef double          fp64;          // Double precision floating point 双精度浮点数(64位长度)   #ifndef TRUE
#define TRUE  1
#endif #ifndef FALSE
#define FALSE 0
#endif #ifndef NULL
#define NULL  0
#endif #endif
/*********************************************************************************************************
*                                        End Of File                                                     *
*********************************************************************************************************/ 
/****************************************Copyright (c)**************************************************
**                                  Southeast Univerdity
**--------------File Info-------------------------------------------------------------------------------
** File Name:          I2C.h
** Last modified Date: 2011-09-1
** Last Version:       1.0
** Description:        IO口模拟I2C协议的函数声明
**------------------------------------------------------------------------------------------------------
** Created By:         JianGe
** Created date:       2011-09-1
** Version:            1.0
**------------------------------------------------------------------------------------------------------ */
#ifndef  __I2C_H__
#define  __I2C_H__ #include "Type.h"extern void I2C_Init(void);
extern void Delay(void);
extern void I2C_Start(void);
extern void I2C_Stop(void);
extern uint8 Write_I2C(uint8 data);
extern uint8 Read_I2C(uint8 ack);#endif
/*********************************************************************************************************
*                                        End Of File                                                     *
*********************************************************************************************************/ 
/****************************************Copyright (c)**************************************************
**                                  Southeast Univerdity
**--------------File Info-------------------------------------------------------------------------------
** File Name:          I2C.c
** Last modified Date: 2011-09-01
** Last Version:       1.0
** Description:        IO口模拟I2C协议的函数实现
**------------------------------------------------------------------------------------------------------
** Created By:         JianGe
** Created date:       2011-09-01
** Version:            1.0
**------------------------------------------------------------------------------------------------------ */#include<iom16v.h>
#include<macros.h>
#include"I2C.h"
#include "Type.h"//外部上拉电阻,PORTC.0--SCL,PORTC.1--SDA,模拟I2C协议
//当DDRC.0和DDRC.1置为输出时,拉低SDA;置为输入时,内部上拉拉高SDA(省去了外部上拉电阻)#define SCL_0 DDRA|=BIT(0)
#define SCL_1 DDRA&=~BIT(0)
#define SDA_0 DDRA|=BIT(1)
#define SDA_1 DDRA&=~BIT(1)
#define SDA_in (PINA&0X02)  //判断SDA的电平/*********************************************************************************************************
** Function name:       I2C_Inti
** Descriptions:        I2C初始化
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void I2C_Init(void)
{PORTA&=~(BIT(0)|BIT(1));SCL_1;SDA_1;
}/*********************************************************************************************************
** Function name:       Delay
** Descriptions:        模拟I2C时序的延时
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void Delay(void)
{NOP();NOP();NOP();NOP();
}/*********************************************************************************************************
** Function name:       I2C_Start
** Descriptions:        模拟I2C的开始时序
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void I2C_Start(void)
{SDA_1;SCL_1;Delay();SDA_0;Delay();SCL_0;Delay();
}/*********************************************************************************************************
** Function name:       I2C_Stop
** Descriptions:        模拟I2C时序的结束时序
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void I2C_Stop(void)
{SDA_0;SCL_1;Delay();SDA_1;Delay();
}/*********************************************************************************************************
** Function name:       Write_I2C
** Descriptions:        向I2C器件的指定单元写一个字节
** input parameters:    代写入的一字节数据
** output parameters:   无
** Returned value:      接收器件的应答信号(1-已经应答 0-没有应答)
*********************************************************************************************************/
uint8 Write_I2C(uint8 data)
{uint8 ack,i;for(i=0;i<8;i++){if(data&0X80){SDA_1;}else{SDA_0;}SCL_1;Delay();SCL_0;data <<= 1;Delay();}Delay();SDA_1;  //释放总线,等到应答Delay();SCL_1;Delay();if(SDA_in){ack=0;}else{ack=1;}SCL_0;Delay();return ack;
}/*********************************************************************************************************
** Function name:       Read_I2C
** Descriptions:        读取I2C器件一个字节
** input parameters:    是否应答(0-NACK,1-ACK)
** output parameters:   无
** Returned value:      读到的一个字节
*********************************************************************************************************/
uint8 Read_I2C(uint8 ack)
{uint8 i,temp;temp=0;SDA_1;for(i=0;i<8;i++){Delay();SCL_0;Delay();SCL_1;Delay();temp<<=1;if(SDA_in){temp++;}}SCL_0;  //使从机等待,发出应答信号Delay();if(!ack){SDA_1;}else{SDA_0;}Delay();SCL_1;Delay();SCL_0;Delay();return temp;
}
/****************************************Copyright (c)**************************************************
**                                  Southeast Univerdity
**--------------File Info-------------------------------------------------------------------------------
** File Name:          MMA7455.h
** Last modified Date: 2011-09-02
** Last Version:       1.0
** Description:        读写MMA7455的声明
**------------------------------------------------------------------------------------------------------
** Created By:         JianGe
** Created date:       2011-09-02
** Version:            1.0
**------------------------------------------------------------------------------------------------------ */#ifdef __MMA7455_H__
#define __MMA7455_H__#include "Type.h"void MMA7455_ByteWrite(uint8 add, uint8 data);
uint8 MMA7455_ByteRead(uint8 add);#endif
/****************************************Copyright (c)**************************************************
**                                  Southeast Univerdity
**--------------File Info-------------------------------------------------------------------------------
** File Name:          MMA7455.c
** Last modified Date: 2011-09-02
** Last Version:       1.0
** Description:        读写MMA7455的实现
**------------------------------------------------------------------------------------------------------
** Created By:         JianGe
** Created date:       2011-09-02
** Version:            1.0
**------------------------------------------------------------------------------------------------------ */
#include<iom16v.h>
#include<macros.h>
#include"I2C.h"
#include "Type.h"
#include "MMA7455.h"
#include "USART.h"#define ACK 1  //MMA7455应答
#define NACK 0/*********************************************************************************************************
** Function name:       毫秒级延时程序
** Descriptions:        延时N毫秒
** input parameters:    延时秒数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void Delay_ms(uint32 ms)
{    uint32 i,j;for(i=0;i<ms;i++)for(j=0;j<564;j++);
}/*********************************************************************************************************
** Function name:       MMA7455_ByteWrite
** Descriptions:        向MMA7455指定地址写一个字节
** input parameters:    写入地址:add,写入字节:data
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void MMA7455_ByteWrite(uint8 add,uint8 data)
{I2C_Start();Write_I2C(0x3A); //写MMA7455的设备地址Write_I2C(add);Write_I2C(data);I2C_Stop();Delay_ms(10);  //这个延时很重要,保证写入时间
}/*********************************************************************************************************
** Function name:       MMA7455_ByteRead
** Descriptions:        读MMA7455指定地址一个字节
** input parameters:    读字节地址:add
** output parameters:   无
** Returned value:      读出的字节
*********************************************************************************************************/uint8 MMA7455_ByteRead(uint8 add)
{uint8 data;I2C_Start();Write_I2C(0x3A);  //写命令Write_I2C(add);I2C_Start();Write_I2C(0x3B);  //读命令data=Read_I2C(NACK);I2C_Stop();return data;
}
/****************************************Copyright (c)**************************************************
**                                  Southeast Univerdity
**--------------File Info-------------------------------------------------------------------------------
** File Name:          main.c
** Last modified Date: 2011-09-05
** Last Version:       1.0
** Description:        测试函数
**------------------------------------------------------------------------------------------------------
** Created By:         JianGe
** Created date:       2011-09-01
** Version:            1.0
**------------------------------------------------------------------------------------------------------ */#include<iom16v.h>
#include<macros.h>
#include"I2C.h"
#include "Type.h"
#include "MMA7455.h"
#include "USART.h"void main(void)
{int8 X,Y,Z = 0;MMA7455_ByteWrite(0x16,0x05);  //配置为measurement模式,8位精度MMA7455_ByteWrite(0x18,0x80);MMA7455_ByteWrite(0x10,11); //MMA7455_ByteWrite(0x11,0); MMA7455_ByteWrite(0x12,50); //MMA7455_ByteWrite(0x13,0); MMA7455_ByteWrite(0x14,0xD7);  MMA7455_ByteWrite(0x15,0xFF);  //若校正值为负,则一定要写入0XFFX = MMA7455_ByteRead(0x06);Y = MMA7455_ByteRead(0x07);Z = MMA7455_ByteRead(0x08);while(1);}

Atmega16驱动三轴加速度传感器MMA7455相关推荐

  1. 三轴加速度传感器bma150驱动解析

    BMA150 博世 三轴加速度传感器 SPI(4线,3线),i2c,中断引脚 频响+/- 2g,4g,8g;带宽25~1500hz,中断触发内部加速度求值 低功耗,快速唤醒 包含数据寄存器,控制寄存器 ...

  2. 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器

    1 产品介绍 MSV3100A三轴加速度传感器 MSV3100A是一款三轴向模拟输出的MEMS加速度传感器.传感器由三个相互正交的微加速度计和信号变换电路组成.能够承受高达10,000g的冲击载荷和恒 ...

  3. 溢出检测单符号位法_设计经验:如何用三轴加速度传感器检测倾斜角?

    本文介绍了三轴加速度传感器的特性,并通过一个典型的应用--检测倾斜角--对单轴.双轴和三轴加速度传感器进行了比较,并给出了选型建议. 在前两篇文章中,我们介绍了单/双轴加速度传感器在来检测倾斜角上的应 ...

  4. ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  5. ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  6. ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  7. ADI Blackfin DSP处理器-BF533的开发详解61:DSP控制ADXL345三轴加速度传感器-LCD(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  8. ADI Blackfin DSP处理器-BF533的开发详解62:DSP控制ADXL345三轴加速度传感器-贪食蛇游戏(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  9. android SENSOR_ACCELEROMETER 三轴加速度传感器

    先看效果图: package org.ninetripods.mq.asdasdasdasdasdas; import android.content.Context; import android. ...

  10. ST公司 Lis2dh12 三轴加速度传感器,计算加速度值转成角度值

    目录 概述 项目上使用了一款Lis2dh12三轴加速度传感器.开发前要准备的工作. 1.原理图: 1.1.创建lis2dh12.c文件 1.2.在此重点说明,如果想调传感器的中断灵敏度,注意:关注1. ...

最新文章

  1. 仿QQ空间用一个tableview显示多种自定义cell
  2. 网络管理工具与IT运维管理平台的差别
  3. python语言做法_python学习笔记(十六)
  4. 计算机组成原理基于mips结构pdf,计算机组成原理_L12-MIPS系统结构-V1.pdf
  5. ajax省市二级联动硬编码,AJAX请求接受硬编码的JSON,但不接受软编码
  6. php mysql_fetch_array($result)_PHP mysqli_free_result()与mysqli_fetch_array()函数
  7. C#图片处理之:色彩调整
  8. Unity读取CSV表格时出现中文乱码处理方式
  9. 截图工具-Excel加载宏(图片大小可调)
  10. vgp虚拟路面_某车型开发阶段实际道路谱和虚拟路面谱对比分析.pdf
  11. 愚人节,这样的微信公众号图文排版方式你见过吗?
  12. HBase文档操作--练习篇
  13. 旋转木马图片效果图,轮播图
  14. 机器学习初探:(十)K均值聚类(K-means)以及KNN算法
  15. [测试开发面试]zyb面试题总结
  16. xfce-因为面板在 kiosk 模式下运行,所以不允许作为普通用户的您更改面板配置
  17. 强制重启计算机快捷键,电脑强制关机快捷键_电脑强制关机的快捷键
  18. pytorch矩阵乘法mm,bmm
  19. 读书笔记:软件工程(11) - 传统方法学 - 软件需求分析
  20. 总结 nginx access.log 太大如何清理

热门文章

  1. 如何用计算机做样本抽样,抽样设计和样本抽选.doc
  2. mysql查询这一周数据库_MYSQL查询一周,一月内的数据
  3. 改造:Ueditor编辑器插入外链视频支持手机播放和上传本地音乐
  4. 作业五:团队项目——项目启动及需求分析
  5. Linux CentOS7系统配置IP地址
  6. 中信证券:降准并非货币宽松 缺口或达9000亿
  7. Kubuntu下root登录
  8. 天天快充滚动图片android750x379
  9. 双系统切换后系统时间错乱问题解决
  10. MySQL with 写法