你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32驱动GY85-IMU模块

[复制链接]
攻城狮Melo 发布时间:2023-3-17 21:33
GY85是一个惯性测量模块,内部集成了三轴加速度计、三轴陀螺仪、电子罗盘、气压传感器等芯片,用于测量和报告设备速度、方向、重力,模块可以将加速度计、陀螺仪、电子罗盘等传感器的数据进行综合,在上位机可以结合各种数据进行惯导算法融合。9 z, c/ d8 K5 w6 p' \' k6 o& B
这里介绍一下STM32驱动GY85的代码,模块与STM32的通信接口是IIC协议,我们采用软件IO口模拟IIC时序进行通信,读取到各个芯片的数据存放在全局变量,关于GY85的介绍以及一些基础知识可以参考这篇博客:点击跳转% R6 E' s# C! B6 f# M
& K/ ]( U4 O& N- C' R5 ~; S
芯片说明:
  ?' U  Z2 W  P+ I9 t* A% MADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量)9 p. ]0 i; Y4 D& p3 C
L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)1 n2 U- ]' j# [  n
HMC5883L:电子罗盘,测量与地磁北极的偏转角度
! Y, b+ h$ K2 F+ r+ Y6 GBMP085:气压传感器,测量大气压、温度
  I1 y* C3 R# G; Z6 j
下面就是全部的驱动代码了:3 \  f  B; b$ S  q

  1.   L1 k) h) ^4 U2 X9 u8 N
  2. /*******************************************************************************
    % t3 ^" h- H1 S; b+ p) p
  3. *  函数功能:串口2发送数据  HMC5883L        + ADXL345 + BMP085+L3G4200D(串口2在mian初始化完成)
    ( ?# ?) m! A" V/ G6 w7 Z
  4. *  波特率:115200
    * f/ [4 S, H/ K3 g
  5. *  时间:2020.7.12" Z* j) C; O: F1 ~  m) [
  6. *  修改注释:全8 d2 b! D( f% I1 ]2 L  b! Y) O
  7. *******************************************************************************/8 C5 n" w2 N$ N# K" R" T' w
  8. ) V6 Z0 @) c- U8 E5 _; `( j
  9. /*芯片说明# P6 \' d( ~# N. B& J* b
  10. *ADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量): W) q( o' W0 P% W! e9 d) l
  11. *L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)9 j0 y" g- w2 U( J8 e$ s+ m9 d
  12. *HMC5883L:电子罗盘,测量与地磁北极的偏转角度5 Z2 v; A& G+ D, ]4 f% q, _
  13. *BMP085:气压传感器,测量大气压、温度9 [) I$ \3 e6 D8 e3 `0 P0 J8 d
  14. */( X, E) S7 ]( X3 s/ c* o
  15. - r. D! k- e" B5 C4 V
  16. #include "IMU.h"
    & ?. n' m8 u0 u5 {0 R
  17. 5 F! W% t5 y: G: Y) {7 S7 V' \* }
  18. GPIO_InitTypeDef GPIO_InitStructure;8 l. X, c! V# o; c! }. F& `7 D
  19. ErrorStatus HSEStartUpStatus;2 \3 i' z6 A1 N2 J
  20. 1 w% q7 D2 R+ H" l9 S

  21. . \* _; Z- q  z8 g& y
  22. #define   FALSE 0
    7 d+ q$ w" S8 H# y7 }5 b) u
  23. #define   TRUE  1
    + A; H/ n. ^: T8 m8 Q

  24. & }, d3 H8 N: h9 x* [
  25. #define   u8 unsigned char
    0 K. W1 M. W+ k+ ^% w0 ^
  26. #define   u32 unsigned int
    + a& b: a( ~6 s& R4 o
  27. #define   uchar unsigned char8 S/ I% ?; h1 d/ \- J& f2 h4 c
  28. #define   uint unsigned int        . ?6 _0 n$ S4 W- S% P7 ?8 W# K
  29. #define   OSS 0         //        BMP085使用4 J4 L& ^. m2 C6 g0 B% @! `5 n1 i
  30. * m- t  v" W0 p7 b. u
  31. //L3G4200D内部寄存器  A# Y! @- b' P3 W3 s6 t
  32. #define CTRL_REG1 0x205 L, I* u- `3 F/ G' j4 T, R+ Q
  33. #define CTRL_REG2 0x21
    3 N* h0 o# j7 m" I' t( F; H! k
  34. #define CTRL_REG3 0x22
    ; G& _, ~' u4 u$ j% w
  35. #define CTRL_REG4 0x23
      i$ ~/ d- e3 L$ Z
  36. #define CTRL_REG5 0x24
    / {. n% g, C+ r# ~9 x0 S0 s# a
  37. #define OUT_X_L 0x28
    ' G2 A4 y0 w9 n: g% z6 n/ x7 u
  38. #define OUT_X_H 0x29
    4 F. Q" r. p# q3 _) s9 U; U2 l7 `
  39. #define OUT_Y_L 0x2A
    5 _' b2 f2 H5 M9 H- M
  40. #define OUT_Y_H 0x2B
    7 f. `$ @% z% @
  41. #define OUT_Z_L 0x2C# n: W0 J4 M* V4 R4 K& G
  42. #define OUT_Z_H 0x2D
    * v4 }# y0 A- W2 `; C$ D' H* `
  43. ' W+ D* h5 V) \3 }5 p* [; }
  44. //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
    ; e  j  |. `; w0 d$ J- g- ^
  45. #define        HMC5883L_Addr   0x3C        //磁场传感器器件地址
    / S  ?( m# B8 G' e0 r+ a
  46. #define        ADXL345_Addr    0xA6        //加速度传感器器件地址
    + E9 K, v+ Z( U' [7 ?
  47. #define        BMP085_Addr     0xee        //气压传感器器件地址
    / z$ J  G" U( I; b% c$ l# A
  48. #define        L3G4200_Addr    0xD2        //陀螺仪传感器器件地址; V! b- o8 m) s+ g4 h! e
  49. 2 {  O! i; H* V" \3 q$ S
  50. unsigned char BUF[8];                   //接收数据缓存区,作用是暂时缓存寄存器的值,之后做算法分析' w: O# V0 O) u) r( @; a" m
  51. char  test=0;
    ) B8 B: v0 D5 ?( p. R. |
  52. int   x,y;
    " w6 V3 e/ s% w1 J2 I+ ?
  53. uchar ge,shi,bai,qian,wan,shiwan;           //uart,显示变量
    ! A  d3 U5 L7 m7 y
  54. , ^8 i5 ?2 i4 z8 V5 r# O' C
  55. " g' Q: z6 M; o3 a# W% c& G
  56. short T_X,T_Y,T_Z;                     //陀螺仪输出数据
    , s& `2 @6 _: `8 w% q
  57. float angle;                           //电子罗盘输出角度,与地磁北极的偏转角度
    " s* n- H. X; I* y2 n

  58. 1 A& d" S7 j# R6 h; M0 M
  59. /* 加速度计ADXL345 数据 *// e- e! Z# g! j$ R# q% j* T5 Q
  60. int A_X,A_Y,A_Z;                       //加速度计读取的寄存器数据
    2 ]; @$ C# L: _! ~% @+ N
  61. short data_xyz[3];                     //加速度计合成数据
    8 E. e2 q. l! B! T: `
  62. float Q,T,K;                           //加速度计x、y、z原始数据) |; O- g7 `( m4 e, W
  63. float Roll,Pitch;                      //Roll,Pitch角度8 |7 O' }3 O4 ]. |  ?/ ]& n; O9 b' S1 d

  64. + `& C1 B$ G2 n( d
  65. 6 {5 e) v) c. z3 x" ^& E
  66. /* BMP085使用的变量 */) |3 J8 u0 H) a+ b
  67. short ac1;: z9 a2 O+ P4 A- o% N& a
  68. short ac2;
    * m, d9 g* L$ X
  69. short ac3;
    ' F) Y9 k- ^* y. }$ v9 A
  70. unsigned short ac4;5 B6 R$ V% x+ R; v, c
  71. unsigned short ac5;0 [  b1 l0 y, G- k, V9 e# ]
  72. unsigned short ac6;* B  [0 j4 a# u
  73. short b1;   {  G/ f5 Q" [6 n5 [, V! w
  74. short b2;
    : V( X% ]" ^- r% J1 t) ?
  75. short mb;( G" q" b4 J1 q1 |
  76. short mc;3 H. Q  Q5 f: X! }
  77. short md;; o$ V* O8 u# P/ \. ~

  78. $ D0 j8 \  h% ]9 Y
  79. long  temperature;   //温度+ G/ _. g' ?7 |' ?
  80. long  pressure;      //气压. e* s8 R1 |; b1 Y- C7 \! S
  81. , i# X/ `/ e; v) n& w' m; g
  82. 0 _/ S, f7 O: b6 {* E+ U
  83. //************************************++++++++++++++++++++++++++++++++
    % Z) y1 [, b. J( u" w
  84. /*模拟IIC端口输出输入定义
    $ L6 W( y# ~# P; h1 G
  85. *SDA:PB93 G8 P2 N$ q' p3 }
  86. *SCL:PB8- e5 k/ t9 R/ @! U2 x: a
  87. */
    ; h; B4 a% W( }7 a) S9 z
  88. #define SCL_H         GPIOB->BSRR = GPIO_Pin_8
    ! s/ i( w8 ]# B- h
  89. #define SCL_L         GPIOB->BRR  = GPIO_Pin_8
    : l6 k* ]# Y' a! X6 S* w/ ]7 B
  90.    
    2 [! c5 W0 ^+ @8 y/ h
  91. #define SDA_H         GPIOB->BSRR = GPIO_Pin_92 q  b3 c4 P. G- E7 ]1 T
  92. #define SDA_L         GPIOB->BRR  = GPIO_Pin_9
    1 ]* N7 I6 ~7 H6 `

  93. % s7 m6 M) o0 H( u# \) c
  94. #define SCL_read      GPIOB->IDR  & GPIO_Pin_83 V: _0 {9 t+ y
  95. #define SDA_read      GPIOB->IDR  & GPIO_Pin_9
    * z2 K: I! D! H* R3 i( d# N

  96. 8 o9 u/ H# j- r4 H# I

  97. . }7 u; l: H( L# y$ s, Z
  98. ; Y; ]' ^7 M, J( D  T
  99. /* 转换数据 */
    5 o' D2 q* K' A# D' E
  100. void conversion(long temp_data)  2 _7 \) O" I6 Z, C0 E% s/ [/ b- Q
  101. {     3 s- H8 z: K' @' ~6 \! J
  102.     shiwan=temp_data/100000+0x30 ;$ p! J3 W+ n8 q' U7 ^
  103.     temp_data=temp_data%100000;   //取余运算 ( O* Z$ W8 g  b! P4 r2 K
  104.     wan=temp_data/10000+0x30 ;2 K3 o6 j- X2 M  c" ?
  105.     temp_data=temp_data%10000;   //取余运算: X, v/ p; t. E0 X  y" R, v
  106.         qian=temp_data/1000+0x30 ;1 u! {3 c. n4 N9 k( D
  107.     temp_data=temp_data%1000;    //取余运算/ v* Y7 R) h6 q
  108.     bai=temp_data/100+0x30   ;1 Q: {" e  K$ l  o% ~4 }
  109.     temp_data=temp_data%100;     //取余运算
    2 F2 B# q& B. A
  110.     shi=temp_data/10+0x30    ;
    1 u+ x& Z+ R% p# n7 Z! P7 A
  111.     temp_data=temp_data%10;      //取余运算$ {% v/ ]4 a: a# [+ R
  112.     ge=temp_data+0x30;        
    9 R- W- m1 g* @4 n2 L. I
  113. }
    6 S& C# }( x# a4 t: F
  114. /*******************************************************************************
    + h. u9 p" I' F4 h6 M" P& m- V/ b
  115. * Function Name  : I2C_GPIO_Config
    7 o( B8 z7 n2 M9 Z6 ~5 s
  116. * Description    : Configration Simulation IIC GPIO
    ) H; R0 ^( \: r& s- B
  117. * Input          : None + g1 ]% j' z9 @' r
  118. * Output         : None- k+ R9 n/ C7 b9 L* [
  119. * Return         : None
    6 V9 S0 A+ k+ H; Z! F5 v5 l  }# B7 Q
  120. ****************************************************************************** */8 m; k  [* t( v. |5 s8 y
  121. void I2C_GPIO_Config(void)  y2 h" ^; K: p
  122. {
    2 g; `* C+ L8 [5 x, L0 ]/ H# R
  123.   GPIO_InitTypeDef  GPIO_InitStructure;
    ; R9 ^& b9 W; P1 S
  124. % r6 W  J! z4 J
  125.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8|GPIO_Pin_9;
    % `2 t7 l1 Y2 |" Q
  126.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: M/ p/ [! P2 u4 Z4 j1 W9 y
  127.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
      p5 C+ h( q) N- p$ {6 T" _
  128.   GPIO_Init(GPIOB, &GPIO_InitStructure);
    5 q' ?/ H' m& o

  129. ; I7 z, {. h% m& P7 N  I# R  A
  130. }, w* A& Y9 V/ m# n

  131. ; R& J1 r+ A% j
  132. /*******************************************************************************. e0 q7 P: Q* N% h* X
  133. * Function Name  : I2C_delay6 r5 D# s  X# R( a  [1 g1 `
  134. * Description    : Simulation IIC Timing series delay
    0 @* l, B4 n4 O( S+ k* h8 i
  135. * Input          : None
    8 @& B( V9 b" C0 G
  136. * Output         : None% e1 k' W/ C# B% `  E3 u
  137. * Return         : None6 h$ G' A+ [# K+ [
  138. ****************************************************************************** */
    $ p5 ?: B6 Q9 q/ w
  139. void I2C_delay(void)
    " v! P2 h/ `3 O1 X7 p
  140. {! {0 l6 C7 P3 p6 _; P
  141.                
    7 `  n  C* e9 k3 @0 Z$ m
  142.    u8 i=30; //这里可以优化速度        ,经测试最低到5还能写入
    8 }5 [. y" x! v
  143.    while(i)
    & n7 o2 A8 w" p# }1 x
  144.    { + Y% D* r1 r" o
  145.      i--;
    ; d* }% c8 X) B, ~, X* k
  146.    }  % ]& ]# Q# t2 b, x4 K9 [
  147. }# d: i( w0 @% b( ~9 K# A

  148. 4 J: X# m; o8 ^! q7 g1 g
  149. void delay5ms(void)
    ) ^" \; ~0 i# F+ {( e
  150. {2 d; d* O4 _$ P: t5 t# k5 O! B
  151.                
    ; z3 V( m! S7 P: J$ H( @# Q
  152.    int i=5000;  
    % n5 q/ B4 T, ^
  153.    while(i)
    * Q/ g1 Y# w4 X/ Y( G+ q
  154.    {
    . [9 f2 H6 l: T* c3 w6 e" d7 }4 V+ v
  155.      i--;
    " `$ i: B+ o, z" d+ C6 V
  156.    }  
    ; ?5 t7 g& o: \) t6 _
  157. }4 e0 |: `& W  Y0 e# }
  158. /*******************************************************************************
    ! D0 A9 ~% s/ L  Q
  159. * Function Name  : I2C_Start5 d, z: ]; D8 [/ G
  160. * Description    : Master Start Simulation IIC Communication. [, |0 J5 }7 V- |% b) f
  161. * Input          : None; B7 |' b2 t: e; u
  162. * Output         : None9 Z  K) ^9 ]  x' I# t
  163. * Return         : Wheather         Start
    9 s% X. \& N" P+ ~2 D; x
  164. ****************************************************************************** */
    6 _& X; [' v# m( F* [' A
  165. uint8_t I2C_Start(void)2 C# L: G4 t! v5 [2 T
  166. {
    : H, t, M; h' i+ A! k
  167.         SDA_H;
    3 G4 D+ T( a& V- X) E3 L: e
  168.         SCL_H;
    $ C( c: W  H; v8 S
  169.         I2C_delay();
    ! w- f1 e/ K4 S7 k9 o+ k
  170.         if(!SDA_read)return FALSE;        //SDA线为低电平则总线忙,退出, a# Z) g- I7 N2 P
  171.         SDA_L;* Z% w0 W; ^5 t4 U; o4 Q7 ~5 p# H
  172.         I2C_delay();
    & I  D1 H  x& L. H, r4 Y
  173.         if(SDA_read) return FALSE;        //SDA线为高电平则总线出错,退出3 f% O/ w+ g- m1 j
  174.         SDA_L;3 ?& B4 {; z8 C0 R# `+ D+ }5 T
  175.         I2C_delay();
      I5 c+ H5 R# m& |. V
  176.         return TRUE;0 J; X  @, k$ U- A
  177. }
    6 h: G/ E9 L) r' [! f& T9 D/ `+ f  g, y
  178. /*******************************************************************************; m" f/ J- b+ [8 i+ a* i+ j3 C$ O
  179. * Function Name  : I2C_Stop
    , G  n( J; p" L! h
  180. * Description    : Master Stop Simulation IIC Communication* `6 t/ t5 b+ y" I$ I* ~3 J4 ]. t
  181. * Input          : None
    0 b" ]. }( _3 W
  182. * Output         : None& }3 V9 i' S5 j9 F
  183. * Return         : None$ T: r6 H7 Z+ G
  184. ****************************************************************************** */
    3 f+ a+ ~/ d  A) g& a
  185. void I2C_Stop(void)& M. d* X9 Y' c. G8 C& O
  186. {
    + f% g# C: A- S$ A8 \
  187.         SCL_L;5 N. h7 H% n, u- `
  188.         I2C_delay();4 W; L2 |8 N0 Y. I+ K$ C5 W& U
  189.         SDA_L;% L- \3 ]$ F$ \& K2 S
  190.         I2C_delay();
    ) K! B/ t5 n4 v7 C( Y! E- P
  191.         SCL_H;( Y% A% _% @9 W8 \# D) m
  192.         I2C_delay();) P( Z" \; s: g' Q: u, `. P" T+ Y
  193.         SDA_H;' B& G% X! |& }
  194.         I2C_delay();
    ! Z! b1 C9 P$ g
  195. } - A' _! v6 K/ M: p0 T/ v$ G
  196. /*******************************************************************************6 O4 Q' D# s1 {1 x% A5 I' N
  197. * Function Name  : I2C_Ack' j" T$ q2 k9 n  p
  198. * Description    : Master Send Acknowledge Single
    % M3 t+ Q3 b4 B4 T8 ~
  199. * Input          : None2 W% r/ i0 M4 |3 c# k5 m' f
  200. * Output         : None# A9 N% U8 Y4 [4 E+ K
  201. * Return         : None
    " @" ^$ E6 I2 O8 P# t: ~: S/ Y0 O/ }
  202. ****************************************************************************** */
    " P/ z8 P/ V# b/ A
  203. void I2C_Ack(void)
    & o: E" L' W4 Z1 b' R
  204. {       
    4 @" X' l9 z5 s; E7 M7 e! _
  205.         SCL_L;
    ( s" N8 g" Q3 J5 |/ ~+ Z" S+ f( }
  206.         I2C_delay();
    5 `, ~, B. C# V
  207.         SDA_L;- p/ T- l, L" H0 `* ?7 X
  208.         I2C_delay();
    & }. P& ?5 Y* k6 v2 m! N
  209.         SCL_H;# D8 ?0 |5 [! J  ]5 }
  210.         I2C_delay();! W( L, q' H3 j3 }) U) M9 C
  211.         SCL_L;
    4 G, A3 y) R# O) W9 k2 G$ n2 g9 I  z
  212.         I2C_delay();
    + t+ i. ?+ L5 M, C4 |
  213. }   
    ( V- c, V7 o) `
  214. /*******************************************************************************
    ( t& |+ \0 T* @1 M& t& c
  215. * Function Name  : I2C_NoAck
    * F& D8 n/ ~2 k/ a
  216. * Description    : Master Send No Acknowledge Single
    " N% `( q- b# i& D% q2 }
  217. * Input          : None$ ~. W9 @: C" r
  218. * Output         : None; w. L. e. p1 a3 c
  219. * Return         : None
    . W7 h6 O+ H0 X  B- h4 ^* h  L
  220. ****************************************************************************** */
    ) m3 t( d+ I: r
  221. void I2C_NoAck(void)7 ?2 V0 g6 g' w
  222. {        2 e  a& h6 f# k  A8 S9 k
  223.         SCL_L;
    . @$ W% [" E7 m" [) g
  224.         I2C_delay();
    6 D& S# T/ A: r3 [
  225.         SDA_H;$ @7 q; n9 J+ a/ f% e) h& `- Q
  226.         I2C_delay();+ f8 m& m# A' N& ]' A* @
  227.         SCL_H;) y! o$ h9 |- ^% m" t
  228.         I2C_delay();
    & ^6 B- R; P; n. k$ Z3 @3 k3 h
  229.         SCL_L;) l! w" k" a. A. t
  230.         I2C_delay();" ~$ I* T, U0 w0 f
  231. }
    3 Y6 }8 C2 t# i0 g! Q) z' U6 i
  232. /*******************************************************************************
    # K3 T. Y$ T4 ]/ }% f+ C
  233. * Function Name  : I2C_WaitAck
    , W6 {* d" j8 D4 O1 Y* @
  234. * Description    : Master Reserive Slave Acknowledge Single
    . x0 [7 S( v# _& W$ K7 l0 \
  235. * Input          : None! J9 v9 T6 `9 `
  236. * Output         : None" O+ t% }5 B% {" Y8 e, M- [
  237. * Return         : Wheather         Reserive Slave Acknowledge Single
    6 K3 w( r- d. f: e
  238. ****************************************************************************** */  V4 w% N( [: i* Z& J0 e$ P
  239. uint8_t I2C_WaitAck(void)          //返回为:=1有ACK,=0无ACK6 M( o. d8 X, s9 G9 n
  240. {
    2 ?: M1 |. [& J5 P: C8 A
  241.         SCL_L;; ^4 i/ Y5 \. h  {: A3 ]
  242.         I2C_delay();- V+ T2 S6 h9 c+ {
  243.         SDA_H;                        $ u8 j( g- N: z7 X' |
  244.         I2C_delay();/ C, q+ N2 L  i7 D4 [% f2 N, d
  245.         SCL_H;
    7 [( K' N7 d  d; N3 |/ g1 |6 A
  246.         I2C_delay();) T; v. Q/ x$ M
  247.         if(SDA_read)
      D- M* l2 b1 \6 a& d/ S% D
  248.         {
    4 t* I, _* m+ R0 F4 }6 B: @
  249.       SCL_L;
    $ H$ e! ?7 t' M" L1 g  ?5 p
  250.           I2C_delay();
    3 S9 C+ g8 |- s6 d7 l
  251.       return FALSE;: u" ^1 i. D  N  O, E! D
  252.         }
    ' C. Y5 w3 j6 ?; g, {# E
  253.         SCL_L;- t: Z% c0 b4 ^4 m
  254.         I2C_delay();
    6 T7 n. s; X& I" N0 k
  255.         return TRUE;, h6 @: l2 u  t9 ?' q; L
  256. }
    , L6 G1 {; x; i: G
  257. /*******************************************************************************0 B2 Y& D+ Y  A) Q  ?
  258. * Function Name  : I2C_SendByte
    5 Z" F8 F8 K- t+ V
  259. * Description    : Master Send a Byte to Slave9 l" B% h, G- M3 I- L- {
  260. * Input          : Will Send Date
    9 N+ |2 x1 I2 t  C
  261. * Output         : None
    5 |' t1 e) W- j- t
  262. * Return         : None. r( X  v) P2 O# J( w% b
  263. ****************************************************************************** */4 A8 G4 Y8 ~& ]+ O/ x# r: w$ [
  264. void I2C_SendByte(u8 SendByte) //数据从高位到低位//' k) ^  p3 a1 H. ]. z6 A
  265. {9 l$ t( l: I, \& A
  266.     u8 i=8;
    , O0 T1 j* h0 d; }! U2 z* v
  267.     while(i--)2 Z  X) m. }. P# ~: N3 K4 L+ u. O3 H
  268.     {
    ; @# P1 s9 R. p0 h" X9 {# J
  269.         SCL_L;
    " B. _* ]2 X7 V3 q5 l; G8 R
  270.         I2C_delay();8 U8 i% i0 w: v  f/ i# [% a4 c- M
  271.       if(SendByte&0x80)
    # ?$ \, ^# f7 @6 k3 V
  272.         SDA_H;  
    3 F3 H) j; L) d1 m3 u" y6 k9 K
  273.       else
    2 Q% `/ H1 B2 c2 Q
  274.         SDA_L;   5 Q* c. ^. n% r8 D, W
  275.         SendByte<<=1;
    + M6 r4 k/ H2 R3 a
  276.         I2C_delay();
    ) U+ k- a1 f+ [3 M* \; f  m! K  P+ V6 @
  277. , I& c. _& s5 g- T+ k, g
  278.                 SCL_H;
    ( _8 ]: r3 V7 g1 U! y7 c/ }' {& F( z
  279.         I2C_delay();* t5 P& x+ R( k$ o5 Z. r1 e! X. z
  280.     }2 F: x! Q1 _* P7 w. m
  281.     SCL_L;' E6 N$ B) o# r# ^. G! f' x
  282. }  ) I& C% F7 e7 A, \3 l
  283. /*******************************************************************************. g2 U: o7 c" F8 r  D- ^
  284. * Function Name  : I2C_RadeByte3 i" Q4 g7 _# t0 s9 S! A
  285. * Description    : Master Reserive a Byte From Slave
    7 c. x+ c. t8 o5 v$ E
  286. * Input          : None
    $ V' b# T' c  d4 P( u
  287. * Output         : None2 x/ A2 Z* l( x) |/ p' B& u  B
  288. * Return         : Date From Slave
    ( N- {; P3 }0 ~" Q: e
  289. ****************************************************************************** */! ^2 j; e" {- V$ t; \
  290. unsigned char I2C_RadeByte(void)  //数据从高位到低位//
    7 ]2 y$ \' U+ p) H
  291. {
    8 ^3 z9 [+ O6 `) N  g6 a
  292.     u8 i=8;
      x7 b6 S9 Q$ ^( ]% L
  293.     u8 ReceiveByte=0;5 l/ ]' F1 `  l  v7 E

  294. 1 y" i: Y: {; D: b0 K
  295.     SDA_H;                               
    ( l5 Y; q: k0 f6 a6 Y0 x* \9 K
  296.     while(i--)# f( A& O+ \& }+ v# Q' ?* T
  297.     {
    ) j/ t$ I2 J% S$ M; i% A
  298.       ReceiveByte<<=1;      
    ! w- m% x  v, a6 c6 S
  299.       SCL_L;% ^8 |0 A; g" V: `
  300.       I2C_delay();
    # @( F4 f4 w: J% d( F. v
  301.           SCL_H;
    3 \; g2 F) |* e, O/ W: }& v
  302.       I2C_delay();        ) B: ^4 Z. \! E" j; T6 X; P
  303.       if(SDA_read)
    ) G% q+ u4 @. }  _
  304.       {5 L( b' Y% K- N. b+ o
  305.         ReceiveByte|=0x01;
    ! }4 @9 a2 p0 I) q% J% l0 |  {5 z
  306.       }
      ~3 p/ Y) A$ M: r* ~9 {! B
  307.     }7 U+ k1 A' d3 |; f
  308.     SCL_L;
      F$ _# e* X# o4 i. b6 R
  309.     return ReceiveByte;& d, Z$ f4 k& Q) X% d; x! [
  310. } & [5 z0 |! j/ I
  311. //ZRX          . C8 |% {% |9 f* e
  312. //单字节写入*******************************************
    ! l. u( x* U' [$ K+ }
  313. " b8 d7 b# V2 e; O3 |0 V6 P1 r
  314. uint8_t Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)                     //void
    9 Z5 Y' F& r3 L& J; `+ V
  315. {* ]( y* E8 D7 P' l8 G+ R5 k: J9 @8 [
  316.           if(!I2C_Start())return FALSE;
    : k1 P, C6 R1 W) ]
  317.     I2C_SendByte(SlaveAddress);   //发送设备地址+写信号//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址 & ]4 G0 f- |' `
  318.     if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
    & H5 V3 f# x' u  @2 A; [, m
  319.     I2C_SendByte(REG_Address );   //设置低起始地址      
    / x& r. g# B& F, H5 A
  320.     I2C_WaitAck();        5 v9 O/ d, i$ x5 F# ^; R5 U
  321.     I2C_SendByte(REG_data);
    ; L6 J# S% p1 p2 {
  322.     I2C_WaitAck();   $ v$ g% G; x! j1 o1 L# A8 d4 F
  323.     I2C_Stop(); 6 _) T2 g8 ?8 B$ ^, s
  324.     delay5ms();
    7 O& F$ `: q+ B  O' t
  325.     return TRUE;
    7 R" Z/ x- [8 r, c) `  v, ?
  326. }4 C0 d* G- g( |! N: V

  327. * c4 u: t8 H2 [( s
  328. //单字节读取*****************************************
    + B3 s, D. h/ D+ d0 o
  329. unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
    . k# s6 g2 ?' `& |( n/ b% ?
  330. {   unsigned char REG_data;            
    " K2 e  J% y* I$ T
  331.         if(!I2C_Start())return FALSE;! P! |2 x2 r. d( e
  332.     I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址 0 k3 D+ A, \; z, {- i2 M; E  }
  333.     if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}' w( [- R: h% k4 r8 A& u0 ]* p2 s- O
  334.     I2C_SendByte((u8) REG_Address);   //设置低起始地址      " P3 c6 b; L7 s7 l2 `
  335.     I2C_WaitAck();
    ' X4 u: F8 h, h& C
  336.     I2C_Start();
    5 |$ f+ k* q8 k, I  c; s2 A- F
  337.     I2C_SendByte(SlaveAddress+1);
    4 {  R4 n; E! b
  338.     I2C_WaitAck();3 y8 ~, h0 E% \! y
  339. , b/ z* j0 V% D: z4 ~
  340.         REG_data= I2C_RadeByte();
    - D$ t( W5 ^3 n& }( ~
  341.     I2C_NoAck();1 I8 M8 ~- E; [
  342.     I2C_Stop();
    6 ?2 e  M: ]7 S  [; B) ?
  343.     //return TRUE;
    9 Y1 |" [7 h1 e0 A2 ^& ]
  344.         return REG_data;
    1 C1 y& H0 {; b- Z- s3 w
  345. , J. _  n2 v4 Q. Y
  346. }                                                     
    , t$ s+ B  j  C0 y- e' p
  347. ) a5 z8 n. O  N* A! }
  348. /*; m! f$ q8 y0 s6 ]
  349. ********************************************************************************
    * y. A- m# T" Y( B
  350. ** 函数名称 : Delay(vu32 nCount)
    6 w7 m7 Y* r6 t; V
  351. ** 函数功能 : 延时函数8 e+ T& \2 \; Y6 q2 l# U( I" n
  352. ** 输    入        : 无
    2 C. L5 F$ P" Z$ N; c0 C# J
  353. ** 输    出        : 无' ^: V  @; y2 J% _7 {
  354. ** 返    回        : 无; S6 F. |; m' M" W8 P) ?# [
  355. ********************************************************************************# Y% x# y  \/ `, b+ d) ]' F5 q
  356. */: R5 r, k( o  N- y3 e, N6 Y/ K
  357. void Delay(u32 nCount)
    & k/ N* [: V% E; k1 o: g
  358. {1 n+ E1 J0 m- j* x8 s' }7 O( \6 D' D
  359.   for(; nCount != 0; nCount--);  {4 u# T9 T2 f* q+ g, l& R
  360. }
    3 {& T: g, {  P# W2 [

  361. * \1 |( l* p3 J# p( N
  362. /*
    / Q1 J' R& P* y5 h( n- j  \" n7 v
  363. ********************************************************************************
    # V6 c! D( a* x0 P7 Y
  364. ** 函数名称 : void Delayms(vu32 m)
    1 \& R) B4 E/ P% ~  S
  365. ** 函数功能 : 长延时函数         m=1,延时1ms
    4 L8 C( m# c" ?# z$ G5 n
  366. ** 输    入        : 无
    , C6 j9 C0 r$ i; t, Y5 ]
  367. ** 输    出        : 无! @' U3 {& d9 o! M4 d
  368. ** 返    回        : 无
    # q  K" Z, L% X' R9 V- D, ^  N1 Z
  369. ********************************************************************************
    / @& L( F$ \! _; D4 d8 ]) c
  370. */2 D# k/ |/ A8 E# _) G! j- A  m
  371. void Delayms(u32 m)
    0 h+ R+ m$ x: h) Q* A7 G4 G
  372. {3 S+ w& @# C/ q: I9 f# `. c
  373.   u32 i;
    / m4 G8 V$ P$ r' P7 v
  374.   
    : \/ l+ W; J, V
  375.   for(; m != 0; m--)        6 Y1 o6 [. n% X3 a: T" G
  376.        for (i=0; i<50000; i++);
    ! ?/ C/ m  @7 p! ^8 }7 u, Y
  377. }
    5 d% a0 n8 P9 g. `+ y  K6 [
  378. 1 d0 R- z$ `, W6 a

  379. 5 q: H4 l3 S3 Y, f- W# x

  380.   O/ k" o2 B7 v- B# i& S6 S

  381. - @8 N& r$ ]4 ]# L) j! D9 F
  382. //************************************************4 m, x6 c$ @( ^  H( R
  383. void  USART2_SendData(unsigned char SendData)
    % Y- i$ s4 I" f6 i
  384. {! V1 o. h0 Y8 x4 ?0 @
  385. USART_SendData(USART2, SendData);
    ; m" }# S7 y/ S  H1 k
  386. Delayms(1);: x1 `( _% I7 e4 q  L) g
  387. }
    ) u. V! w+ T+ U7 |9 N4 T; i
  388.         ; x0 c% c# F/ X  A) @4 C. v
  389. * V% ]4 O& ~' Z( C/ U3 O) c
  390. //********************************************************************
    6 \: d5 A: A* d/ }, {
  391. long bmp085ReadTemp(void)/ S; E9 l6 C5 N0 b  y/ ^9 U
  392. {   short  temp_ut;9 n$ B: m2 c6 P* }6 k4 }2 q- L  A
  393.         Single_Write(BMP085_Addr,0xF4,0x2E);8 d, }# L! ~' f6 b' V- u' e1 J
  394.         Delayms(5);        // max time is 4.5ms7 k( g+ S9 U& ~* F" Z' V9 Z
  395.         temp_ut = Single_Read(BMP085_Addr,0xF6);0 H4 G8 M: l1 q( x7 K+ `
  396.         temp_ut = (temp_ut<<8)| Single_Read(BMP085_Addr,0xF7);               
    2 [: K& J! k/ p
  397.         return (long) temp_ut ;7 `" L  X  d! N4 B6 I
  398. }  M: U; `% _$ z0 X9 _4 |; J9 ~
  399. //*************************************************************! e) q7 s" B- K" _% w

  400. ; q- F5 h8 o6 s/ R
  401. long bmp085ReadPressure(void)- a, K: i  k( [) C- S
  402. {
    & N8 L8 {- i! p
  403.         long pressure = 0;
    5 K9 \. ^% b& [0 U  X
  404.         Single_Write(BMP085_Addr,0xF4,0x34);
    , g7 _! b" ]4 [, L
  405.         Delayms(5);        // max time is 4.5ms
    ( T$ D/ q; W! \7 y! V
  406.         pressure = Single_Read(BMP085_Addr,0xF6);
    / l, }1 K+ m3 o3 O4 t" b& r% S2 D
  407.         pressure = (pressure<<8)| Single_Read(BMP085_Addr,0xF7);               
    3 e( ~# t$ J- Q; N9 {# Z( \
  408.         pressure &= 0x0000FFFF;       
    , q6 E+ E; @, S- P7 H9 u
  409.         return pressure;       
    / r' p) G* \' \* u7 ]( T
  410. }
    6 f: }% F+ k! Q4 q4 {- I
  411. . K+ w  ^6 B$ E# Z
  412. //******************; j5 d% D' ?+ {) H& ?" a
  413. void Send_ADXL345_data(int dis_data)) v: ^* ^  a* }2 \; N4 H
  414.   { 6 A$ C$ c' O& j6 u
  415.     float temp ;' p& Y4 d5 M2 _: }2 O2 w
  416.         if(dis_data>0x7fff)dis_data-=0xffff;6 W* c2 D( P9 ]$ U
  417.         if(dis_data<0){
    5 i8 ~2 p! P# g; u$ K- i5 ?$ j+ ^
  418.                dis_data=-dis_data;
    " k; Z! J2 x6 {% ^& k4 {6 Q; {% ~
  419.              USART_SendData(USART1,'-');$ Z  ~2 C* C) L; [- Z6 o
  420.                  Delayms(2);
    , ]4 V7 j- k; o# O
  421.         }3 B7 {6 _+ G7 k' P' n
  422.         else3 f% o& N4 d& o% D$ x, ^
  423.           {
    5 O; L4 n" b2 H; Z
  424.            USART_SendData(USART1,'+');+ z( @; L  Y5 Y1 o* Y+ r. j
  425.            Delayms(2);
    # h5 T; }. H: f) N9 `& E- s
  426.            }
    + q3 v. n5 X( ?; a+ a) e* x0 ^
  427.         temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页  g: C! t8 v6 W( ~9 u/ B1 _! c+ _$ j
  428.         conversion(temp);          //转换出显示需要的数据         , A& P8 y" J# A3 a7 o- N$ K' q
  429.             USART2_SendData(qian);
    1 n/ h8 {. B7 A* e( e5 [( ^
  430.                 USART2_SendData('.');
    ( Y5 h( o1 ^. }! g5 _
  431.             USART2_SendData(bai);
    ! l( U" o& ^) O/ K+ R( M# B0 t
  432.             USART2_SendData(shi);
    ' D2 O) n+ z5 D: k; K7 n, s
  433.             USART2_SendData(ge); - t* d8 q3 o  y' z
  434.                 USART2_SendData('g');
    . C/ x  a! L7 [. l
  435. }4 _7 |5 ?4 B" G, |) g) \
  436. //***************************************; V0 _, K; h4 `8 p
  437. //******************  ~$ k3 H5 f- f5 K0 ?" B  n$ e
  438. void Send_L3G420D_data(short dis_data)
    / P1 B8 m3 @6 _9 G: J+ X6 f2 \* H
  439.   { float temp ;7 X$ P8 j2 n1 o
  440.         if(dis_data<0){
    . H/ t* F) c2 ^* f
  441.                dis_data=-dis_data;- _3 l2 c6 j! a* G
  442.              USART_SendData(USART1,'-');+ Z2 N) L: Y# [- e( i1 g: j
  443.                  Delayms(2);
    # u! ]4 q6 l! y6 ]  E7 `& X5 t
  444.         }$ g- J9 B) N+ R9 ?: A6 t
  445.         else
    / a- a$ h8 Z( `
  446.           { 7 y- s: S' |9 G
  447.            USART_SendData(USART1,'+');
    : _2 w% o3 K5 s  R, H
  448.            Delayms(2);/ o, t2 p) {6 I) {( P2 ~
  449.            }- K  p$ {6 T9 \2 c/ b+ L
  450.         temp=(float)dis_data*0.07;  //计算数据和显示,查考ADXL345快速入门第4页
    * b. U8 Z, l! C2 e: j4 ?' l
  451.         conversion(temp);           //转换出显示需要的数据         ( N$ Q' z4 N/ r5 q1 Q! k( M8 I
  452.             USART2_SendData(bai);
    $ Z& q0 o8 h: Y3 [$ b/ R
  453.             USART2_SendData(shi); . _. s9 r0 v( K+ d# Z- c
  454.             USART2_SendData(ge);
    + x: \$ J' q! E' x

  455. 8 r  X0 ]6 U: v
  456. }
    0 v9 b" _$ u" Q
  457. //***************************************! |( W" f. A& C/ Q, a- p% m' F
  458. 3 u- u% N( s% i
  459.   `5 ]- P1 F  C5 Z8 ]0 v
  460. void Send_HMC5883L(void)
    + z: r! M' [  r. L9 F4 t1 W/ S% t3 u
  461. {
    1 R+ M4 o) W4 {) e. c  A" y
  462. USART2_SendData('H');
    * d& F) @. s8 }  d
  463. USART2_SendData('M');
    9 ~) y( n4 @7 r7 w( Q: r+ T
  464. USART2_SendData('C');! m- b1 Z7 o9 w& _
  465. USART2_SendData('5');
    3 ]2 X8 j7 }) @7 U( n& t5 h
  466. USART2_SendData('8');/ _- {4 A) |; R
  467. USART2_SendData('8');- K: \2 g7 M1 P4 r- }; V9 o
  468. USART2_SendData('3');
    3 J4 P. `2 s- k4 B2 u
  469. USART2_SendData('L');
    3 e5 W( Z+ ~0 ?. N
  470. USART2_SendData(':');
      u0 o; O$ s; R
  471. conversion(angle);7 E  H( u1 ?4 [8 O3 ]
  472. USART2_SendData(bai); ' T' K# S( ^) K' [. J) n; x9 |5 K7 \
  473. USART2_SendData(shi);
    6 D1 s8 `% l/ Q, s
  474. USART2_SendData(ge); : _6 l/ F; c2 r: R0 p( r4 j* ?
  475. USART2_SendData('`');    D: O5 {( V; a8 B
  476. USART2_SendData(0x0d);
    7 k& G7 F+ @( H2 r
  477. USART2_SendData(0x0a);9 y4 K5 l0 M& i- X5 K- C/ S8 x
  478. }8 n: _  m8 f0 H6 C
  479. //*************************************************1 f3 Q- W6 X' C+ l# C; f! I
  480. void  Send_BMP085(void)
    6 K1 Y/ L% ]* ?+ P% @
  481. {
    : c5 u' d, K& T9 r8 D& a
  482. USART2_SendData('B');
    9 C$ V3 m  T) f; p( E
  483. USART2_SendData('M');9 N, u4 o% \& p! l( Z
  484. USART2_SendData('P');. |) ]& I2 P# o
  485. USART2_SendData('0');
    7 u- s0 Q. W) X( G
  486. USART2_SendData('8');
    6 f- |( _: E4 V' v" x  \
  487. USART2_SendData('5');+ q3 Q/ V& w7 f  L# K; N
  488. USART2_SendData(':');8 G1 l7 n  F  @7 `' g& i
  489. 5 J( p& i% O) Q! Y+ x3 ?" Z4 M- {
  490. USART2_SendData('t');
    + Q& c% i: @! Y" F% k
  491. USART2_SendData('=');
    ! C/ o0 B: E/ S" |! @
  492. conversion(temperature);- z- D% X5 E6 k& k! a; b' E
  493. USART2_SendData(bai);
    . X4 j$ G7 @+ x
  494. USART2_SendData(shi); . @! v0 p9 W1 L8 T
  495. USART2_SendData('.');- N5 ^# B" z0 L0 ^4 J# u0 t
  496. USART2_SendData(ge);9 N& T4 n1 T2 _' x6 a: \
  497. USART2_SendData('`'); ! K6 W5 {) P; X6 J/ R0 J1 `
  498. USART2_SendData('C'); 4 B2 ?# I: R* a$ o- u/ J

  499. . B: k0 n( i* p$ ~3 S8 B8 R
  500. USART2_SendData(' ');
    , u% r6 X) g. A3 H" Y3 h2 n7 ?6 |& ^6 e
  501. USART2_SendData('p');% H9 L' n! K8 S+ w9 U: ]# H
  502. USART2_SendData('=');
    " ?4 f, v$ I  o& e2 z3 G8 b1 n
  503. conversion(pressure);3 n7 D) `6 @! ~: x

  504. " V9 L( i+ `0 \' u/ Y
  505. USART2_SendData(shiwan);
    3 S1 B# S% [+ ~- s* ^1 Z
  506. USART2_SendData(wan);
    6 N. j$ g7 j  r" {5 J" z
  507. USART2_SendData(qian);
      t# [# Q2 R" S# L. r6 K
  508. USART2_SendData('.');3 p' B" [5 Y6 C% L  N* h; g3 a
  509. USART2_SendData(bai); + w* B/ g/ N7 a9 T. j
  510. USART2_SendData(shi);
    6 i+ H5 f3 ^( k
  511. USART2_SendData(ge);
    5 t8 K: q, w# \) y
  512. USART2_SendData('K');
    2 s; ?2 D  P" M/ d/ |* k! Y
  513. USART2_SendData('p');
    - Y$ v& V. p; z5 ?
  514. USART2_SendData('a');                                  / u: E0 P  N1 H$ B& W4 L1 Y# P
  515. USART2_SendData(0x0d);
    ; {$ @$ K+ y4 D6 @& n- e# Z
  516. USART2_SendData(0x0a);
    7 g( l: s# Z; r- e' m; N7 w8 M
  517. 6 h8 J5 N$ e/ r
  518. }
    ' |1 ~& ~8 h( z" M: {7 I6 |
  519. //*****************************************************
    & W1 t3 ]$ a) l- X( s. ]/ T. f

  520. ! w) k5 |; [* B( e, [3 y3 j
  521. void  Send_ADXL345(void)
    $ ?: k) K1 i! i
  522. {
    + i, o! k  g6 ~. a4 C  n: d
  523. USART2_SendData('A');4 i* w, b7 K( q9 M, [: x
  524. USART2_SendData('D');
    ; q0 W5 k& O9 I
  525. USART2_SendData('X');
    + X  C1 W- t9 O5 h, z  I$ k* D0 c
  526. USART2_SendData('L');7 v& Q: }4 t+ w$ e
  527. USART2_SendData('3');5 m) m  L! w! u' ^% Z3 K* d
  528. USART2_SendData('4');
    2 F/ ~6 k" U8 Z' X" p6 H) B! R6 o
  529. USART2_SendData('5');
    * V$ @1 M7 t( `" e4 k# X
  530. USART2_SendData(':');. K5 s$ t) t$ M
  531.            USART2_SendData('X');
    2 S; d! i% |$ J* l! [5 t, H
  532.            USART2_SendData('=');
    . F+ G! |, @/ o, w* a. X
  533.            Send_ADXL345_data(A_X);  e) y; B9 O: }

  534. . C1 Y0 u9 N3 d$ A- f
  535.            USART2_SendData('Y');! e# W& i1 ^5 R7 g, M* l
  536.            USART2_SendData('=');
      |; Y, _' k. f. r% m1 t
  537.            Send_ADXL345_data(A_Y);
    5 B1 B% Q7 t" R# m/ O

  538. 9 s4 q7 B7 ?3 w0 N! T' |3 J+ R: a
  539.            USART2_SendData('Z');
    ; g1 m! f% b# D% d, }
  540.            USART2_SendData('=');
    + {2 U8 B# g9 `2 ^+ p" S% a  w: Z
  541.            Send_ADXL345_data(A_Z);: D2 |, f6 ~- U# _6 y# `! H

  542. ! p9 H! Z6 e6 _4 i+ E! n+ Q
  543.            adxl345_angle();9 [; P, M! Z- V3 Q) A

  544. 2 b- ~$ ~: _, ?0 B% U: q6 Q) N/ s& i

  545. 4 I' D2 m& n' r% h7 Y! P/ _% N
  546. USART2_SendData(0x0d);$ N) a  ?) b  }3 w
  547. USART2_SendData(0x0a);" o5 i1 _" e/ B+ [
  548. }8 T" d- {" n3 }5 o# k
  549. //*****************************************************
    8 ?2 r" V3 {, `6 V: M! t
  550. void Send_L3G4200D(void)8 v6 S2 T  R+ D3 c4 Y
  551. {8 p+ k9 d* w; e2 K
  552.            USART2_SendData('L');! b/ Z6 W& x2 _; O; {% l; X7 i
  553.         USART2_SendData('3');2 e3 r: Q' s" B& E6 a
  554.         USART2_SendData('G');
    / R) F* K0 U8 b- t
  555.         USART2_SendData('4');
    $ W6 x1 Q( _0 \3 V# J% Y
  556.         USART2_SendData('2');. @: L+ M* @/ }' n
  557.         USART2_SendData('0');
    - U) }! P2 n# B* m9 p
  558.         USART2_SendData('0');
    $ A5 [( I% z' U! ]/ {4 R4 m
  559.         USART2_SendData('D');
    6 S8 l8 r8 O8 @! f" M3 f2 U- q
  560.         USART2_SendData(':');
    $ v' q6 b' E4 c: u* C" `
  561. 7 k4 c3 m) W0 x/ j
  562.            USART2_SendData('X');$ W  w  x" ~- M0 I6 X% A2 _0 G
  563.            USART2_SendData('=');7 }+ t" l  u: N
  564.            Send_L3G420D_data(T_X);
    6 }2 C: O( N2 ]/ E* |! n
  565. 1 |/ W& A; R8 H
  566.            USART2_SendData('Y');* v. `8 [+ W! x- f4 `$ @- v+ E
  567.            USART2_SendData('=');7 ]: b0 E, H. F- }. c
  568.            Send_L3G420D_data(T_Y);
    8 P  Y6 z4 k% S# G7 z6 ~6 ?' W
  569.   F! d1 G5 \/ ]1 ^$ U1 n0 d
  570.            USART2_SendData('Z');
    9 \  ?7 V& T" H7 I8 C7 e
  571.            USART2_SendData('=');
    / k8 W4 ~1 c( `
  572.            Send_L3G420D_data(T_Z);6 C6 e0 w7 e( f
  573. : u. O7 ^2 m  e5 P2 H* D  k' x6 m
  574.           USART2_SendData(0x0d);: }- `) t9 }5 U8 K) E" T& X
  575.      USART2_SendData(0x0a);
    1 ^$ Z  S- G4 Q+ k. q9 i/ \& D
  576. }( H- K' D9 g( u5 W. k0 A- |
  577. //******************************************************2 H* K+ D" K6 k( T7 z
  578. void read_HMC5883L(void)3 S; ]8 v7 S$ O, s1 q
  579. {5 R& _4 }! c- v/ I: W
  580.        Single_Write(HMC5883L_Addr,0x00,0x14);   //
    1 s; h0 Y5 @2 A5 W% x
  581.        Single_Write(HMC5883L_Addr,0x02,0x00);   //! M) E3 c( S1 O. t3 p" F
  582.              Delayms(10);2 Y" A+ D. A0 @9 q

  583. ; A. z. B! B- B! |  e( d& x
  584.        BUF[1]=Single_Read(HMC5883L_Addr,0x03);//OUT_X_L_A5 B" W$ {- O8 \# O' \
  585.        BUF[2]=Single_Read(HMC5883L_Addr,0x04);//OUT_X_H_A
    ) ]+ v6 S( w# Z: z
  586. 2 y$ t5 t1 n' F: N1 n- {
  587.            BUF[3]=Single_Read(HMC5883L_Addr,0x07);//OUT_Y_L_A
    - b5 z& A( ?' d6 B+ F
  588.        BUF[4]=Single_Read(HMC5883L_Addr,0x08);//OUT_Y_H_A( u; q4 S( i" C9 ^$ ^/ _. C
  589. . b: I; p' E" H) W; f
  590.        x=(BUF[1] << 8) | BUF[2]; //Combine MSB and LSB of X Data output register7 p5 k+ \- e; \# @4 M
  591.        y=(BUF[3] << 8) | BUF[4]; //Combine MSB and LSB of Z Data output register
    $ H1 i+ l# v7 q3 G- s1 b
  592. - R9 H9 G" l7 A
  593.        if(x>0x7fff)x-=0xffff;          6 [5 C+ R  w/ z
  594.        if(y>0x7fff)y-=0xffff;          3 m" p  c4 G" Z, z
  595.        angle= atan2(y,x) * (180 / 3.14159265) + 180; // angle in degrees
    $ R8 X7 C/ {3 q$ \4 C
  596. }, [' U) {6 m$ |( ~4 q% \
  597. //****************************************
    * \4 _9 U. M+ q8 Y5 R5 Y& ~/ ~7 D
  598. void read_ADXL345(void)2 e9 t7 z" J8 _$ i
  599. {4 S: \: p+ ^4 P
  600.        BUF[0]=Single_Read(ADXL345_Addr,0x32);//OUT_X_L_A+ p2 B( O- h- B+ c
  601.        BUF[1]=Single_Read(ADXL345_Addr,0x33);//OUT_X_H_A+ Y! _/ J+ x) M8 b( e% m

  602. # l9 W% L, i) j2 q+ o8 J- o
  603.            BUF[2]=Single_Read(ADXL345_Addr,0x34);//OUT_Y_L_A2 \! s3 x% Z" Z) V! B% ~% _- r
  604.        BUF[3]=Single_Read(ADXL345_Addr,0x35);//OUT_Y_H_A
    ) r  h: L7 q+ A6 p% Y# p

  605. ; v* D+ g& Q8 V2 Z9 i& H, k
  606.            BUF[4]=Single_Read(ADXL345_Addr,0x36);//OUT_Z_L_A0 v9 P2 ]5 O  V
  607.        BUF[5]=Single_Read(ADXL345_Addr,0x37);//OUT_Z_H_A
    . M1 ?$ f: y1 y7 s: d7 v
  608. 3 O, M9 r1 ~$ b
  609.            A_X=(BUF[1]<<8)+BUF[0];  //合成数据  1 d- W' U8 r8 W0 A4 I, u) O2 d
  610.            A_Y=(BUF[3]<<8)+BUF[2];  //合成数据
    ; s- a2 z! p0 V
  611.            A_Z=(BUF[5]<<8)+BUF[4];  //合成数据" [  U% S/ [! f
  612. }
    ) l# V0 v& o0 q) F, p
  613. //*****************************************
    7 {& v2 ?9 o" @3 B( {, J+ s
  614. void read_BMP085(void)% q% [+ \' ~& H2 t
  615. {0 l3 r8 `/ Y, X% Z; c6 h, {2 a
  616. 5 C. j+ ^( Y3 y3 L
  617.            long ut;; N( e6 _0 F# h5 N0 F  X. b: i
  618.         long up;
    7 P' e9 |) \' T. r8 e- @1 n: r: K0 q
  619.         long x1, x2, b5, b6, x3, b3, p;1 D; e% t4 x( g0 S' y4 B4 n1 e/ B
  620.         unsigned long b4, b7;: U) |* g  Q5 a/ G. h$ r

  621. 7 p0 p9 @: I7 N0 n
  622.         ut = bmp085ReadTemp();           // 读取温度
    ' B5 \- h6 B- p/ i4 f, w6 y. ?
  623. //        ut = bmp085ReadTemp();           // 读取温度9 B* @% B9 ~( y9 K% R# z
  624.         up = bmp085ReadPressure();  // 读取压强+ `5 z; X8 e1 [
  625. //        up = bmp085ReadPressure();  // 读取压强
    % N" p2 G& j9 M/ z- `
  626.         x1 = ((long)ut - ac6) * ac5 >> 15;
    + `, i4 e- ^+ U3 p
  627.         x2 = ((long) mc << 11) / (x1 + md);8 J$ ^) F2 o+ {* g2 A' `2 {' f; {
  628.         b5 = x1 + x2;
    / F, f3 p% d3 r# G$ L7 k( ^
  629.         temperature = (b5 + 8) >> 4;
    # _) q- d  T/ q. S  u. |, Q4 h1 g: O
  630.         : M7 ?2 m! o/ X
  631.          //****************
    ( G6 }4 `3 A3 [9 Q

  632. " b6 {) d5 ?- ]2 ]* ^% r
  633.         b6 = b5 - 4000;
    * B# x) ~- ?+ Y! S
  634.         x1 = (b2 * (b6 * b6 >> 12)) >> 11;
    # u' j: }* E9 V7 ?( S2 |
  635.         x2 = ac2 * b6 >> 11;
    4 t, k- Y0 K( J! I
  636.         x3 = x1 + x2;5 y' i+ S' l% {1 T. {
  637.         b3 = (((long)ac1 * 4 + x3) + 2)/4;
    3 Z8 Y* I0 V+ u( D' p1 e" u9 U) j2 M; D
  638.         x1 = ac3 * b6 >> 13;0 b# k& [: J4 w
  639.         x2 = (b1 * (b6 * b6 >> 12)) >> 16;) B' z# ]6 h2 e- m
  640.         x3 = ((x1 + x2) + 2) >> 2;
    ; H$ E1 z% e+ K$ \) d# M: l% T
  641.         b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;9 e" ?! ]2 x3 f% m5 K1 L
  642.         b7 = ((unsigned long) up - b3) * (50000 >> OSS);
    # D: j% o" x$ X: a
  643.         if( b7 < 0x80000000)
    6 I9 M) m& o6 j5 u" M1 j! a
  644.              p = (b7 * 2) / b4 ;
    2 L/ s- r0 f2 N( w( H
  645.            else  " U( W3 t/ p2 Z, O8 A" R0 T
  646.                     p = (b7 / b4) * 2;
      B+ A. E  [& e
  647.         x1 = (p >> 8) * (p >> 8);- o$ j& \- x( _3 o9 h
  648.         x1 = (x1 * 3038) >> 16;
    ) U2 h, [5 M* H( `$ u' K# i
  649.         x2 = (-7357 * p) >> 16;1 T! I- c6 U  x5 w, V6 `) R# T- j
  650.          pressure = p + ((x1 + x2 + 3791) >> 4);
    : L7 l+ ]3 i+ Z9 _5 d; Z; x9 I7 b
  651. }
    , `* P! Z+ ~- u3 F
  652. //***************************
      M/ n. d' W3 x# A: s" G0 u
  653. void  Init_ADXL345(void)
    , G" B* r7 C" E0 E, j5 j( ~& Z0 P* p
  654. {2 B2 F: a% c& _3 u" U6 l
  655.    Single_Write(ADXL345_Addr,0x31,0x0B);   //测量范围,正负16g,13位模式# M5 q3 Z9 ~: ~) Z
  656.   // Single_Write(ADXL345_Addr,0x2C,0x0e);   //速率设定为100hz 参考pdf13页
    ! J% z! X9 K0 d( k7 a  ?7 H" }
  657.    Single_Write(ADXL345_Addr,0x2D,0x08);   //选择电源模式   参考pdf24页7 G8 R, g0 L3 V2 C7 E7 S) f4 H- @
  658.    Single_Write(ADXL345_Addr,0x2E,0x80);   //使能 DATA_READY 中断
      M6 D9 k2 `6 \
  659.   // Single_Write(ADXL345_Addr,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页. c7 O: T+ g7 S. a  Q/ S) d
  660.   // Single_Write(ADXL345_Addr,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页2 }; i* I; O- e! p- q9 ?' q3 h
  661.   // Single_Write(ADXL345_Addr,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
    ( H. x" b$ k- G
  662. }; {2 [' e/ |9 B2 ^
  663. //****************************
    4 h% n* B- @5 }5 E" V! q$ ]0 v
  664. void  Init_BMP085(void)  E) K( M2 G2 k( w7 `
  665. {
    % ^$ e4 R4 x. z) G5 W7 U+ b
  666.         ac1 = Single_Read(BMP085_Addr,0xAA);8 X8 {9 v1 u$ h( V; I* b' \
  667.         ac1 = (ac1<<8)|Single_Read(BMP085_Addr,0xAB);
    6 y8 m& \  [0 n9 S
  668. ! x  f+ y9 i* l- V+ Z8 u1 M7 ?
  669.     ac2 = Single_Read(BMP085_Addr,0xAC);0 L4 A  ~% @% I# x% I8 a/ W7 S
  670.         ac2 = (ac2<<8)| Single_Read(BMP085_Addr,0xAD);
    ! N4 C9 |3 R. L3 ]# o

  671.   b' w9 I7 \6 n  W7 D4 W; G
  672.         ac3 = Single_Read(BMP085_Addr,0xAE);+ \2 D$ t" \. g; c8 g$ T- d2 Q
  673.         ac3 = (ac3<<8)| Single_Read(BMP085_Addr,0xAF);
    ' _* e4 ~* T% X$ D: q9 N1 p  N8 X
  674. , t# l) F1 c, F( u
  675.         ac4 = Single_Read(BMP085_Addr,0xB0);
    5 W, E4 j) S* O% T% k, R3 n
  676.         ac4 = (ac4<<8)| Single_Read(BMP085_Addr,0xB1);
    , H" C! d# f) [$ I5 ^. Z3 ^
  677. : z7 V9 T7 O4 L8 \
  678.         ac5 = Single_Read(BMP085_Addr,0xB2);3 f; W1 s3 k- y) K+ @
  679.         ac5 = (ac5<<8)| Single_Read(BMP085_Addr,0xB3);" m! _( m- }1 D. c! }8 h
  680. % _" W9 s5 b( y! f* U/ D- g0 k
  681.         ac6 = Single_Read(BMP085_Addr,0xB4);
    ' K) I0 s* p# E" s4 ^
  682.         ac6 = (ac6<<8)| Single_Read(BMP085_Addr,0xB5);+ H; x1 z0 `$ Q& `+ G

  683. 9 E& I& K3 I* y8 K
  684.         b1 = Single_Read(BMP085_Addr,0xB6);
    4 G, R. ?& ~% ^9 Q- C
  685.         b1 = (b1<<8)| Single_Read(BMP085_Addr,0xB7);! b) ~& r+ t3 c. |0 X

  686. . |; g3 e3 B- Q- p7 |6 d
  687.         b2 = Single_Read(BMP085_Addr,0xB8);
    8 t# Z2 z% A# p: }1 o
  688.         b2 = (b2<<8)| Single_Read(BMP085_Addr,0xB9);
    % ^2 V' K6 x% j8 y3 Y! v
  689. ' j7 T0 O" B- Y0 m3 h/ _
  690.         mb = Single_Read(BMP085_Addr,0xBA);
    & u" t8 k. ]6 W% [0 s$ {0 O
  691.         mb = (mb<<8)| Single_Read(BMP085_Addr,0xBB);7 n( a$ Y4 u$ t4 _) u1 `0 z& d

  692. 7 J# `' p9 f3 q0 x( z2 Q7 y
  693.         mc = Single_Read(BMP085_Addr,0xBC);& R4 L( Q! O% ^( {: B
  694.         mc = (mc<<8)| Single_Read(BMP085_Addr,0xBD);
    . ~$ O# k% N& [  m5 I

  695. 6 X2 ?/ a1 u) b3 H" ]
  696.         md = Single_Read(BMP085_Addr,0xBE);
    . P2 o/ Y" s5 L2 N/ z
  697.         md = (md<<8)| Single_Read(BMP085_Addr,0xBF);1 o  D& Z! Q# p( r& R! ]8 U4 ^

  698. , ~. o( K+ y8 R2 i5 X
  699. }
    % ^* U( D9 s1 X8 X3 V
  700. //****************************
    2 Q; t# E1 x, J, H
  701. void  Init_HMC5883L(void)
      l6 I' K/ m. O0 {" {# ^% C
  702. {
    3 n$ H) E* R+ R) E3 J/ Y4 v
  703.    Single_Write(HMC5883L_Addr,0x00,0x14);   //  ], @  C8 H$ h3 A- Z9 w8 h: H% @
  704.    Single_Write(HMC5883L_Addr,0x02,0x00);   //, i( A/ J+ n4 W+ T
  705. }
      F% J1 @5 a  [3 K" L) m
  706. //*****************************************4 L3 r3 Y! E- r  c, N2 p* k$ G
  707. . l! |' L$ F8 f) o, E& A# U
  708. //************初始化L3G4200D*********************************" y  d+ k: `1 X/ b3 |! X1 H- J
  709. void Init_L3G4200D(void)* M* Y- U9 _+ G1 i6 Y; ]9 Q$ I0 A
  710. {0 O7 C5 N; l! B% Z
  711.         Single_Write(L3G4200_Addr,CTRL_REG1, 0x0f);$ v5 E9 @7 U# u! r. U) y" x
  712.         Single_Write(L3G4200_Addr,CTRL_REG2, 0x00);
    # X$ `& W% A! S% Y
  713.         Single_Write(L3G4200_Addr,CTRL_REG3, 0x08);: C: `7 a  N4 I; z/ r3 w
  714.         Single_Write(L3G4200_Addr,CTRL_REG4, 0x30);        //+-2000dps
    5 h& y6 T1 C* F3 B, C
  715.         Single_Write(L3G4200_Addr,CTRL_REG5, 0x00);. D! S+ D& L3 B& A" z5 h1 E9 y
  716. }       
    / w/ l" f0 T8 k/ l% f
  717. //******读取L3G4200D数据****************************************) m4 a/ v% ?3 Y: f0 |
  718. void read_L3G4200D(void)
    & Z! }. h3 m6 S7 p, R
  719. {, Y0 X4 ^  e! P% t" L
  720.    BUF[0]=Single_Read(L3G4200_Addr,OUT_X_L);
    " u/ S' i8 f! _: j3 {' T0 m
  721.    BUF[1]=Single_Read(L3G4200_Addr,OUT_X_H);' J' s1 b- M' G7 \
  722.    T_X=        (BUF[1]<<8)|BUF[0];
    . [: Q% f+ A) D; h6 _8 Q: F
  723. 5 ~+ X& U0 d1 V/ X2 G6 J& E

  724. ' a' D# f! B3 w! ~

  725. ! j, T1 N& {: g
  726.    BUF[2]=Single_Read(L3G4200_Addr,OUT_Y_L);, D1 m2 n: U! Y1 |3 J- h/ e( p* D
  727.    BUF[3]=Single_Read(L3G4200_Addr,OUT_Y_H);
    0 u3 O9 M! H. p# M( l
  728.    T_Y=        (BUF[3]<<8)|BUF[2];4 P) D; |3 Y9 b" N* n& e8 Q& n
  729.   ! L" `0 s. x& e. H+ Z" v1 e
  730. , c8 `; H3 e5 L9 o- O
  731.    BUF[4]=Single_Read(L3G4200_Addr,OUT_Z_L);
    & Y* p  V3 v7 @' q  k
  732.    BUF[5]=Single_Read(L3G4200_Addr,OUT_Z_H);
    # t( W- C; @" B; W$ a
  733.    T_Z=        (BUF[5]<<8)|BUF[4];9 o  `* ^4 r& o! T& T( u

  734. / W6 R* ]8 z0 L% H1 u+ x$ i
  735. }
    # o( c6 Q8 }% G! D6 y
  736. % Y/ F1 B/ U2 i; ^) g# R( Q
  737. //******************ADXL345计算倾斜角度************2 M4 i. `- r2 J5 F
  738. void adxl345_angle(void)
    / R. U7 A' H) [* {0 ]! R
  739. {5 J6 t- p1 e; i3 j) ]2 S
  740. 1 l& y$ ], {9 E% b% v
  741. data_xyz[0]=A_X;  //合成数据   : N/ Y$ c0 V1 Z: w& k! ^; y
  742. data_xyz[1]=A_Y;  //合成数据   
    . f9 V3 l! Z) o* |8 c( v1 T
  743. data_xyz[2]=A_Z;  //合成数据   2 c6 R2 O+ w! o  G: U2 e
  744. 7 e7 O1 S( R" D$ W; d$ p6 @
  745. //分别是加速度X,Y,Z的原始数据,10位的
    ( o3 H  G" F3 G$ _  t
  746. Q=(float)data_xyz[0]*3.9;
    ' t9 t7 p6 E/ N& F2 e% Q8 b
  747. T=(float)data_xyz[1]*3.9;
    ' W3 p8 s' H, [) i7 x  T/ O
  748. K=(float)data_xyz[2]*3.9;
    + i8 E. }3 C, B, n
  749. Q=-Q;  v' k6 w% O& x2 ^! M
  750. 5 t. y' Q; \" h0 c' u
  751.   Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180);    //X轴角度值5 E' Z4 y+ h  \+ `
  752.   Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180);  //Y轴角度值, x* A( b9 I: D% o
  753.   //conversion(Pitch);                                                                   //需要显示时候请更换6 w' f8 {: N3 N' G$ d) u  n
  754.   conversion(Roll);
    + X/ z$ Y( q7 U4 y. W1 n
  755.         USART2_SendData(' '); - ^& c& C+ G0 Q. K
  756.                 USART2_SendData(' '); 8 l+ F! g/ A1 r2 J# t$ n/ b7 D
  757.               USART2_SendData(bai);
    % Q3 N/ E3 U9 U% `" f- ^# H
  758.             USART2_SendData(shi); : I7 A) X% w+ H, [, s; ?
  759.             USART2_SendData(ge);. f7 m8 v: C- l9 c2 B0 E8 Y, w
  760. }
    " _; ]4 P6 y8 L7 e& N

  761. 1 [/ I9 L% g+ Y& C/ c, E
  762. int main(void)+ c- P- L2 v4 `3 P1 y) w& C' n
  763. {/ a# P- I5 s! m  x
  764.         DEBUG_USART_Config();+ L$ L! [# j9 R6 [( y9 y" j* v$ b
  765.         Init_HMC5883L();  l: M& k& r# A
  766.   Init_ADXL345();8 Q: i8 d' h' [! B
  767.   Init_BMP085();2 [1 d# n6 l8 ^3 x- W- d
  768.   Init_L3G4200D();
    4 S" s2 k! W" I. R) |" U3 i1 J: i
  769.        
    , ^: Z1 _5 k3 {( O2 U
  770.         while(1)- B- E' p% X& W+ @5 X6 d5 g" _
  771.         {: `5 c0 H( Q  W
  772.                 read_HMC5883L();# G; `4 D" e# b  p1 }3 e
  773.        Send_HMC5883L();. I  ?  a+ P8 E
  774.                 read_ADXL345();
    6 i# ~1 F, K. ]
  775.            Send_ADXL345();# K, N) }5 a! {9 {) a0 A
  776.                 read_L3G4200D();  r" S# m  R. \
  777.             Send_L3G4200D();/ j3 D4 D  ^! |* D
  778.                 read_BMP085();                   ) M, Z" W3 n" F6 z7 m! o
  779.            Send_BMP085();
    5 _4 x1 T2 k) b0 ?! ^; g/ I4 D* B
  780.                 Delayms(20);
    8 x6 J# u* J0 U/ y+ l9 ~% d
  781.         }
    6 C! |7 N+ f$ w& S5 d+ A
  782. }
    / d/ {) D5 c, M: ~: F- L5 t
  783. ///*************结束***************// L2 Z3 C. j! r, t: q8 J
  784. % K8 W3 X7 t6 `" p
复制代码
3 }' ?/ \8 l7 S; R3 R
————————————————
$ n$ \9 S8 t" `- w版权声明:Aspirant-GQ
4 g7 J( ^% r5 w/ t如有侵权请联系删除0 W% {& g5 N5 l) g3 Z: ]- n5 O1 Y
6 `0 m& b+ Q( a
8 A: o) x% {, m( K1 B
* _; P6 f+ R9 Q4 Q5 {
赞 收藏 评论0 发布时间:2023-3-17 21:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版