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

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

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

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

  1. #include "msp430f5438.h"
  2. #include "public.h"
  3. #include "simulate_iic.h"
  4. #include <stdbool.h>
  5.  
  6. #include "init.h"
  7.  
  8. #include "mma7455.h"
  9. #include "lcd1602.h"
  10. #include<math.h>
  11. typedef unsigned int uint;
  12. typedef unsigned char uchar;
  13. char mma7455write_byte(unsigned char reg,unsigned char data)//寄存器地址,数据
  14. {
  15. char flag;
  16. // WDTCTL = WDTPW + WDTHOLD; // 禁止看门狗定时器
  17. iic_start();//起始信号
  18. write_byte(0x3a);//数据发送
  19. flag=get_ack();//接受应答位,即数据成功发送后,接受到的应答
  20. if(flag)
  21. {
  22. flag=0;
  23. write_byte(reg);//数据发送
  24. }
  25.  
  26. flag=get_ack();//接受应答位,即数据成功发送后,接受到的应答
  27. if(flag)
  28. {
  29. flag=0;
  30. write_byte(data);
  31. }
  32.  
  33. flag=get_ack();
  34. if(flag)
  35. {
  36. flag=0;
  37. iic_stop();
  38. return 0;
  39. }
  40.  
  41. return 1;
  42.  
  43. }
  44.  
  45. char readMMA7455Byte(unsigned char regadd)
  46. {
  47. char flag;
  48. char z;
  49. z=0;
  50. iic_start();
  51. write_byte(0x3a);//先写入器件地址
  52. flag=get_ack();
  53. if(flag)
  54. {
  55. write_byte(regadd);//有应答之后再写寄存器地址
  56. flag=0;
  57. }
  58.  
  59. flag=get_ack();
  60. if(flag)
  61. {
  62. flag=0;
  63. iic_start();//继续等应答之后写入该地址和读命令,但是认为这不必要这么做
  64. write_byte(0x3b);//但是时间的原因,仅仅有找着实例的操作先写着,以后再改动
  65. }
  66.  
  67. flag=get_ack();
  68. if(flag)
  69. {
  70. flag=0;
  71. z=read_byte();
  72. }
  73.  
  74. send_ack();
  75.  
  76. iic_stop();
  77.  
  78. return z;
  79.  
  80. }
  81. // X:255 1.65V -1.00g
  82. // 012345678901234567
  83. void Cvt_Str(char zifu[], char V1)
  84. {
  85. char characters[17]="0123456789ABCDEF";
  86. char tv=0;
  87.  
  88. tv=V1/100;
  89. zifu[2] = characters[tv];
  90. tv=(V1%100)/10;
  91. zifu[3] = characters[tv];
  92. tv=V1%10;
  93. zifu[4] = characters[tv];
  94.  
  95. zifu[5] = ' ';
  96.  
  97. zifu[6] = '0';
  98. zifu[7] = 'x';
  99. tv=V1/16;
  100. zifu[8] = characters[tv];
  101. tv=V1%16;
  102. zifu[9] = characters[tv];
  103.  
  104. zifu[10] = ' ';
  105.  
  106. if(V1>127)
  107. {
  108. zifu[11] = '-';
  109. tv=255-V1;
  110. zifu[12] = characters[tv/63];
  111. zifu[13] = '.';
  112. zifu[14] = characters[((tv*100/63)%100)/10];
  113. zifu[15] = characters[(tv*100/63)%10];
  114. }
  115. else
  116. {
  117. zifu[11] = '+';
  118. tv=V1;
  119. zifu[12] = characters[tv/63];
  120. zifu[13] = '.';
  121. zifu[14] = characters[((tv*100/63)%100)/10];
  122. zifu[15] = characters[(tv*100/63)%10];
  123. }
  124. zifu[16] = 'g';
  125. }
  126. uint arc_tan2(uchar Ax,uchar Ay)
  127. {
  128. int diat_t;
  129. float m;
  130. m=atan2(Ay,Ax);
  131. diat_t=(int)(m*1800/3.14);
  132. return diat_t;
  133. }
  134. uint measure()
  135. {
  136. uchar x;
  137. uchar y;
  138. uint x1,y1;
  139. uchar xsign,ysign;
  140. uint angle;
  141. angle=0;
  142. x=readMMA7455Byte(0x06);
  143. y=readMMA7455Byte(0x07);
  144. x=x+0x2C;
  145. y=y+0x25;
  146. if(x>127)
  147. {
  148. x=255-x;
  149. x1=((float)x*100)/63.0;
  150. xsign=0x2b;
  151. }
  152. else
  153. {
  154. x1=((float)x*100)/63.0;
  155. xsign=0x2d;
  156. }
  157. if(y>127)
  158. {
  159. y=255-y;
  160. y1=((float)y*100)/63.0;
  161. ysign=0x2b;
  162. }
  163. else
  164. {
  165. y1=((float)y*100)/63.0;
  166. ysign=0x2d;
  167. }
  168. angle = arc_tan2(x1,y1);
  169. /*if(xsign==0x2b&&ysign==0x2b)
  170. {
  171. angle = arc_tan2(x1,y1);
  172. }
  173. else if(xsign==0x2b&&ysign==0x2d)
  174. {
  175. angle = 900+arc_tan2(y1,x1);;
  176. }
  177. else if(xsign==0x2d&&ysign==0x2d)
  178. {
  179. angle = 2700-angle;
  180. }
  181. else if(xsign==0x2d&&ysign==0x2b)
  182. {
  183. angle = 2700+angle;
  184. }*/
  185. return angle;
  186. }
  187. void main()
  188. {
  189. char txtbuf[16]="X:255 -1.00g";
  190. //uchar x,y,x2,y2;
  191. //volatile uint x1,y1;
  192. // uchar j,k;
  193. clk_init();
  194. lcd1602_pin_init();
  195. lcd_init();
  196. delay_ms(50);
  197. while(mma7455write_byte(0x16,0x005));
  198. while(mma7455write_byte(0x10,0xff));//校正X值
  199. while(mma7455write_byte(0x11,0x07));
  200. while(mma7455write_byte(0x12,0x18));//校正Y值
  201. while(mma7455write_byte(0x14,0xDC));//校正Z值
  202. while(mma7455write_byte(0x15,0xFF));
  203. while(1)
  204. {
  205. /*lcd_pos(0,0);
  206. lcd_wdat('a');
  207. lcd_wdat('n');
  208. lcd_wdat('g');
  209. lcd_wdat('l');
  210. lcd_wdat('e');
  211. lcd_wdat(':');
  212.  
  213. lcd_printf(measure());//x
  214. //delay_ms(1000);
  215. //lcd_wcmd(0x01); */ //显示清屏
  216.  
  217. /*x=readMMA7455Byte(0x06);
  218. y=readMMA7455Byte(0x07);
  219. x2=x+0x2C;
  220. y2=y+0x25;
  221. x=x+0x2C;
  222. y=y+0x25;
  223. if(x>0x7f)
  224. {
  225. x=255-x;
  226. j=1;
  227. x1=((float)x*100)/63.0;
  228. }
  229. else
  230. {
  231. x1=((float)x*100)/63.0;
  232. j=0;
  233. }
  234. if(y>0x7f)
  235. {
  236. y=255-y;
  237. y1=((float)y*100)/63.0;
  238. k=1;
  239. }
  240. else
  241. {
  242. y1=((float)y*100)/63.0;
  243. k=0;
  244. }
  245. lcd_pos(0,0);
  246. if(j==1) lcd_wdat('-');
  247. else lcd_wdat('+');
  248. lcd_char(x1);
  249. lcd_pos(0,1);
  250. if(k==1) lcd_wdat('-');
  251. else lcd_wdat('+');
  252. lcd_char(y1);
  253. delay_ms(1000);
  254. lcd_wcmd(0x01);
  255.  
  256. lcd_pos(0,0);
  257. Cvt_Str(txtbuf,x2);
  258. txtbuf[0]='X';
  259. lcd_string(txtbuf);
  260. lcd_pos(0,1);
  261. Cvt_Str(txtbuf,y2);
  262. txtbuf[0]='Y';
  263. lcd_string(txtbuf);
  264. delay_ms(1000);
  265. lcd_wcmd(0x01);*/ //显示清屏
  266. lcd_pos(0,0);
  267. Cvt_Str(txtbuf,readMMA7455Byte(0x08));
  268. txtbuf[0]='Z';
  269. lcd_string(txtbuf);
  270. lcd_pos(0,1);
  271. lcd_printf(arc_tan2(readMMA7455Byte(0x08),readMMA7455Byte(0x06)));
  272. delay_ms(1000);
  273. lcd_wcmd(0x01); //显示清屏
  274.  
  275. lcd_pos(0,1);
  276. Cvt_Str(txtbuf,readMMA7455Byte(0x06));
  277. txtbuf[0]='X';
  278. lcd_string(txtbuf);
  279. lcd_pos(0,0);
  280. Cvt_Str(txtbuf,readMMA7455Byte(0x07));
  281. txtbuf[0]='Y';
  282. lcd_string(txtbuf);
  283. delay_ms(1000);
  284. lcd_wcmd(0x01); //显示清屏
  285. }
  286. }

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. UVA 531 - Compromise(dp + LCS打印路径)

      Compromise  In a few months the European Currency Union will become a reality. However, to join th ...

  2. IOS SWIFT 网络请求JSON解析 基础一

    前言:移动互联网时代,网络通信已经是手机端必不可少的功能.应用中也必不可少地使用了网络通信,增强客户端与服务器交互.使用NSURLConnection实现HTTP的通信.NSURLConnection ...

  3. 17.1 Replication Configuration 复制:

    17.1 Replication Configuration 复制: 17.1.1 How to Set Up Replication 17.1.2 Replication Formats 17.1. ...

  4. boost::share_ptr用法

    boost中提供了几种智能指针方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而标准库中提供的智能指针为auto_ptr. 这其中,我最喜欢,使用最多的 ...

  5. 我的Android进阶之旅------>HTTP 返回状态值详解

    (本文转载于:http://blog.csdn.net/ithomer/article/details/10240351) 当用户点击或搜索引擎向网站服务器发出浏览请求时,服务器将返回Http Hea ...

  6. ARM相关知识

    ARM7采用冯·诺依曼(Von-Neumann)结构,数据存储器和程序存储器重合在一起.    同时,此结构也被大多数计算机所采用. ARM7为三级流水线结构(取指,译码,执行),平均功耗为0.6mW ...

  7. HNCU1330:算法3-1:八进制数

    http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1330 题目描述 将十进制数转换为八进制, ...

  8. C/C++迭代器使用具体解释

    迭代器是一种检查容器内元素并遍历元素的数据类型.能够替代下标訪问vector对象的元素. 每种容器类型都定义了自己的迭代器类型,如 vector: vector<int>::iterato ...

  9. Oracle数据库索引使用及索引失效总结

    容易引起oracle索引失效的原因很多: 1.在索引列上使用函数.如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了. 2.新建的表还没来得及生成统计信息,分析 ...

  10. UVA 10317 - Equating Equations (背包)

    Problem F Equating Equations Input: standard input Output: standard output Time Limit: 6 seconds Mem ...