使用加速度传感器应该注意几点:

第一:确保你的IIC是正确的;

第二,首先必须校准系统,校准方法,例如以下:将7455平放,保证z轴向下,这是假设系统是Ok的,那么x轴输出为0,y轴输出为0,z轴输出为63左右,假设不为以上參数,应该做例如以下调整:測量值比实际值小的情况下,往校准寄存器里面写入一个2*误差值;假设測量值假设大于实际值,应该写入一个值为相应误差的负值的ASCII码,比方假设測出值为70,那么应该写入-16,即(0xf0);

下面就是我调试mma7455的代码:

#include "msp430f5438.h"
#include "public.h"
#include "simulate_iic.h"
#include <stdbool.h> #include "init.h" #include "mma7455.h"
#include "lcd1602.h"
#include<math.h>
typedef unsigned int uint;
typedef unsigned char uchar;
char mma7455write_byte(unsigned char reg,unsigned char data)//寄存器地址,数据
{
char flag;
// WDTCTL = WDTPW + WDTHOLD; // 禁止看门狗定时器
iic_start();//起始信号
write_byte(0x3a);//数据发送
flag=get_ack();//接受应答位,即数据成功发送后,接受到的应答
if(flag)
{
flag=0;
write_byte(reg);//数据发送
} flag=get_ack();//接受应答位,即数据成功发送后,接受到的应答
if(flag)
{
flag=0;
write_byte(data);
} flag=get_ack();
if(flag)
{
flag=0;
iic_stop();
return 0;
} return 1; } char readMMA7455Byte(unsigned char regadd)
{
char flag;
char z;
z=0;
iic_start();
write_byte(0x3a);//先写入器件地址
flag=get_ack();
if(flag)
{
write_byte(regadd);//有应答之后再写寄存器地址
flag=0;
} flag=get_ack();
if(flag)
{
flag=0;
iic_start();//继续等应答之后写入该地址和读命令,但是认为这不必要这么做
write_byte(0x3b);//但是时间的原因,仅仅有找着实例的操作先写着,以后再改动
} flag=get_ack();
if(flag)
{
flag=0;
z=read_byte();
} send_ack(); iic_stop(); return z; }
// X:255 1.65V -1.00g
// 012345678901234567
void Cvt_Str(char zifu[], char V1)
{
char characters[17]="0123456789ABCDEF";
char tv=0; tv=V1/100;
zifu[2] = characters[tv];
tv=(V1%100)/10;
zifu[3] = characters[tv];
tv=V1%10;
zifu[4] = characters[tv]; zifu[5] = ' '; zifu[6] = '0';
zifu[7] = 'x';
tv=V1/16;
zifu[8] = characters[tv];
tv=V1%16;
zifu[9] = characters[tv]; zifu[10] = ' '; if(V1>127)
{
zifu[11] = '-';
tv=255-V1;
zifu[12] = characters[tv/63];
zifu[13] = '.';
zifu[14] = characters[((tv*100/63)%100)/10];
zifu[15] = characters[(tv*100/63)%10];
}
else
{
zifu[11] = '+';
tv=V1;
zifu[12] = characters[tv/63];
zifu[13] = '.';
zifu[14] = characters[((tv*100/63)%100)/10];
zifu[15] = characters[(tv*100/63)%10];
}
zifu[16] = 'g';
}
uint arc_tan2(uchar Ax,uchar Ay)
{
int diat_t;
float m;
m=atan2(Ay,Ax);
diat_t=(int)(m*1800/3.14);
return diat_t;
}
uint measure()
{
uchar x;
uchar y;
uint x1,y1;
uchar xsign,ysign;
uint angle;
angle=0;
x=readMMA7455Byte(0x06);
y=readMMA7455Byte(0x07);
x=x+0x2C;
y=y+0x25;
if(x>127)
{
x=255-x;
x1=((float)x*100)/63.0;
xsign=0x2b;
}
else
{
x1=((float)x*100)/63.0;
xsign=0x2d;
}
if(y>127)
{
y=255-y;
y1=((float)y*100)/63.0;
ysign=0x2b;
}
else
{
y1=((float)y*100)/63.0;
ysign=0x2d;
}
angle = arc_tan2(x1,y1);
/*if(xsign==0x2b&&ysign==0x2b)
{
angle = arc_tan2(x1,y1);
}
else if(xsign==0x2b&&ysign==0x2d)
{
angle = 900+arc_tan2(y1,x1);;
}
else if(xsign==0x2d&&ysign==0x2d)
{
angle = 2700-angle;
}
else if(xsign==0x2d&&ysign==0x2b)
{
angle = 2700+angle;
}*/
return angle;
}
void main()
{
char txtbuf[16]="X:255 -1.00g";
//uchar x,y,x2,y2;
//volatile uint x1,y1;
// uchar j,k;
clk_init();
lcd1602_pin_init();
lcd_init();
delay_ms(50);
while(mma7455write_byte(0x16,0x005));
while(mma7455write_byte(0x10,0xff));//校正X值
while(mma7455write_byte(0x11,0x07));
while(mma7455write_byte(0x12,0x18));//校正Y值
while(mma7455write_byte(0x14,0xDC));//校正Z值
while(mma7455write_byte(0x15,0xFF));
while(1)
{
/*lcd_pos(0,0);
lcd_wdat('a');
lcd_wdat('n');
lcd_wdat('g');
lcd_wdat('l');
lcd_wdat('e');
lcd_wdat(':'); lcd_printf(measure());//x
//delay_ms(1000);
//lcd_wcmd(0x01); */ //显示清屏 /*x=readMMA7455Byte(0x06);
y=readMMA7455Byte(0x07);
x2=x+0x2C;
y2=y+0x25;
x=x+0x2C;
y=y+0x25;
if(x>0x7f)
{
x=255-x;
j=1;
x1=((float)x*100)/63.0;
}
else
{
x1=((float)x*100)/63.0;
j=0;
}
if(y>0x7f)
{
y=255-y;
y1=((float)y*100)/63.0;
k=1;
}
else
{
y1=((float)y*100)/63.0;
k=0;
}
lcd_pos(0,0);
if(j==1) lcd_wdat('-');
else lcd_wdat('+');
lcd_char(x1);
lcd_pos(0,1);
if(k==1) lcd_wdat('-');
else lcd_wdat('+');
lcd_char(y1);
delay_ms(1000);
lcd_wcmd(0x01); lcd_pos(0,0);
Cvt_Str(txtbuf,x2);
txtbuf[0]='X';
lcd_string(txtbuf);
lcd_pos(0,1);
Cvt_Str(txtbuf,y2);
txtbuf[0]='Y';
lcd_string(txtbuf);
delay_ms(1000);
lcd_wcmd(0x01);*/ //显示清屏
lcd_pos(0,0);
Cvt_Str(txtbuf,readMMA7455Byte(0x08));
txtbuf[0]='Z';
lcd_string(txtbuf);
lcd_pos(0,1);
lcd_printf(arc_tan2(readMMA7455Byte(0x08),readMMA7455Byte(0x06)));
delay_ms(1000);
lcd_wcmd(0x01); //显示清屏 lcd_pos(0,1);
Cvt_Str(txtbuf,readMMA7455Byte(0x06));
txtbuf[0]='X';
lcd_string(txtbuf);
lcd_pos(0,0);
Cvt_Str(txtbuf,readMMA7455Byte(0x07));
txtbuf[0]='Y';
lcd_string(txtbuf);
delay_ms(1000);
lcd_wcmd(0x01); //显示清屏
}
}

MMA7455加速度传感器測量角度的更多相关文章

  1. ADXL3xx: 读取 ADXL3xx 加速度传感器

    原文链接:https://www.arduino.cc/en/Tutorial/ADXL3xx ADXL3xx加速度传感器 本教程将为你展示如何读取Analog Devices的ADXL3xx系列加速 ...

  2. Android的重力传感器(3轴加速度传感器)简单实例

    重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会 ...

  3. 与众不同 windows phone (18) - Device(设备)之加速度传感器, 数字罗盘传感器

    原文:与众不同 windows phone (18) - Device(设备)之加速度传感器, 数字罗盘传感器 [索引页][源码下载] 与众不同 windows phone (18) - Device ...

  4. 【Espruino】NO.12 加速度传感器演示

    http://blog.csdn.net/qwert1213131/article/details/31035403 本文属于个人理解,能力有限,纰漏在所难免.还望指正! [小鱼有点电] [Espru ...

  5. OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据

    由于数据采集站基本都安装在野外或者楼顶,安装位置以及震动对检测数据的准确性有一定影响.所以想要有一个位置状态数据,正好发现麒麟作上有ADXL345,这样一个数字输出的加速度传感器.如图中红框所示: 1 ...

  6. [原创]cocos2d-x研习录-第三阶 特性之加速度传感器

    智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的体验,比如飞翔的企鹅(英文AirPenguin)游戏就是通过加速度传感器来控制角色的移动和跳跃方向.下面学习Cocos2D-x中如何使用加 ...

  7. 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植

    2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控, ...

  8. Android--保持加速度传感器在屏幕关闭后运行

    由于写论文需要,需要用手机加速度采集数据,关于android加速度传感器的介绍网上一抓一大把,但大多都是大同小异,跟官网文档差不多.自己写了个取加速度传感器的APK,发现数据有点不对劲,原理屏幕一关后 ...

  9. Android加速度传感器实现“摇一摇”,带手机振动

    由于代码有点多,所以就分开写了,注释还算详细,方便学习 Activity package com.lmw.android.test;   import android.app.Activity; im ...

随机推荐

  1. 使用Maven打包项目并上传到Linux服务器

    Maven打包: 项目右键Run as-->Maven build...-->  出来下面的界面,注意红色部分的填写,Goals填写package表示打包,下面的Skip Tests表示打 ...

  2. 基于visual Studio2013解决算法导论之052深度优先

     题目 深度优先 解决代码及点评 // 深度优先.cpp : 定义控制台应用程序的入口点. // // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include < ...

  3. 《HTML 5网页开发实例具体解释》文件夹

    第一篇  从宏观上认识HTML 5 讲述了HTML 5引发的Web革命.HTML 5的总体特性.HTML 5相关概念和框架和开发环境搭建. 第1章 HTML 5引发的Web革命 1.1  你是不是真的 ...

  4. Shell中的if else语句小演示

    安安静静学习小shell,今天看到if else 喽~ 下面这个脚本是判断用户执行脚本的参数,如果是hello的话,就显示how are you 如果什么都没有,就提示输入 如果参数不是hello,就 ...

  5. lua 安装配置

    LUA用纯C语言编写 1.相关安装配置 Last login: Thu Jul  9 08:42:02 on console nixinshengdeMacBook-Pro:~ nixinsheng$ ...

  6. opencv开源库

    opencv是开源库 在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib 为什么要CMake,这里我陈述自己的想法,作为一个刚使用opencv库的小白来说,有以下大概 ...

  7. 使用VS+VisualGDB编译Linux版本RCF(相当于Linux也有COM版本了)

    阅读目录 通过向导配置项目 配置目录结构 修改项目配置 添加RCF源代码 完成配置并进行编译 添加测试程序 添加测试代码——通过TCP进行通信 运行测试程序并查看测试结果 VisualGDB生成的所有 ...

  8. duilib之源码分析

    <duilib之源码分析>1 stdAfx.h * lengthof(x) 计算数组长度宏 * MAX  两值最大 * MIN  两值最小 * CLAMP(x,a,b) x在a,b之间则取 ...

  9. 实战 iTextSharp

    原文 实战 iTextSharp iTextSharp 是用来生成  PDF 的一个组件,在 1998 年夏天的时候,Bruno Lowagie ,iText 的创作者,参与了学校的一个项目,当时使用 ...

  10. 如何在VMware中修改Mac OS的屏幕分辨率

    关于mac os分辨率问题:方法一:临时方法,只对当次启动有效,即在启动倒计时的时候,回车,等待输入参数是输入如下文本:“Graphics Mode"="1280x800x32@6 ...