Atmega16驱动三轴加速度传感器MMA7455
最近做一个设计G-Sense的设备,需要一个三轴加速度传感器,最终选择飞思卡尔的MMA7455,因为看起来似乎比博士的三轴加速度芯片简单一些,哈哈。原本是准备应用在ARM上的,首先在比较熟悉的AVR单片机的环境下做个测试。
来个MMA7455模块的近照:
下面贴出所有的代码(测试通过)
注意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相关推荐
- 三轴加速度传感器bma150驱动解析
BMA150 博世 三轴加速度传感器 SPI(4线,3线),i2c,中断引脚 频响+/- 2g,4g,8g;带宽25~1500hz,中断触发内部加速度求值 低功耗,快速唤醒 包含数据寄存器,控制寄存器 ...
- 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器
1 产品介绍 MSV3100A三轴加速度传感器 MSV3100A是一款三轴向模拟输出的MEMS加速度传感器.传感器由三个相互正交的微加速度计和信号变换电路组成.能够承受高达10,000g的冲击载荷和恒 ...
- 溢出检测单符号位法_设计经验:如何用三轴加速度传感器检测倾斜角?
本文介绍了三轴加速度传感器的特性,并通过一个典型的应用--检测倾斜角--对单轴.双轴和三轴加速度传感器进行了比较,并给出了选型建议. 在前两篇文章中,我们介绍了单/双轴加速度传感器在来检测倾斜角上的应 ...
- ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解61:DSP控制ADXL345三轴加速度传感器-LCD(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解62:DSP控制ADXL345三轴加速度传感器-贪食蛇游戏(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- android SENSOR_ACCELEROMETER 三轴加速度传感器
先看效果图: package org.ninetripods.mq.asdasdasdasdasdas; import android.content.Context; import android. ...
- ST公司 Lis2dh12 三轴加速度传感器,计算加速度值转成角度值
目录 概述 项目上使用了一款Lis2dh12三轴加速度传感器.开发前要准备的工作. 1.原理图: 1.1.创建lis2dh12.c文件 1.2.在此重点说明,如果想调传感器的中断灵敏度,注意:关注1. ...
最新文章
- 仿QQ空间用一个tableview显示多种自定义cell
- 网络管理工具与IT运维管理平台的差别
- python语言做法_python学习笔记(十六)
- 计算机组成原理基于mips结构pdf,计算机组成原理_L12-MIPS系统结构-V1.pdf
- ajax省市二级联动硬编码,AJAX请求接受硬编码的JSON,但不接受软编码
- php mysql_fetch_array($result)_PHP mysqli_free_result()与mysqli_fetch_array()函数
- C#图片处理之:色彩调整
- Unity读取CSV表格时出现中文乱码处理方式
- 截图工具-Excel加载宏(图片大小可调)
- vgp虚拟路面_某车型开发阶段实际道路谱和虚拟路面谱对比分析.pdf
- 愚人节,这样的微信公众号图文排版方式你见过吗?
- HBase文档操作--练习篇
- 旋转木马图片效果图,轮播图
- 机器学习初探:(十)K均值聚类(K-means)以及KNN算法
- [测试开发面试]zyb面试题总结
- xfce-因为面板在 kiosk 模式下运行,所以不允许作为普通用户的您更改面板配置
- 强制重启计算机快捷键,电脑强制关机快捷键_电脑强制关机的快捷键
- pytorch矩阵乘法mm,bmm
- 读书笔记:软件工程(11) - 传统方法学 - 软件需求分析
- 总结 nginx access.log 太大如何清理