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
L1 k) h) ^4 U2 X9 u8 N- /*******************************************************************************
% t3 ^" h- H1 S; b+ p) p - * 函数功能:串口2发送数据 HMC5883L + ADXL345 + BMP085+L3G4200D(串口2在mian初始化完成)
( ?# ?) m! A" V/ G6 w7 Z - * 波特率:115200
* f/ [4 S, H/ K3 g - * 时间:2020.7.12" Z* j) C; O: F1 ~ m) [
- * 修改注释:全8 d2 b! D( f% I1 ]2 L b! Y) O
- *******************************************************************************/8 C5 n" w2 N$ N# K" R" T' w
- ) V6 Z0 @) c- U8 E5 _; `( j
- /*芯片说明# P6 \' d( ~# N. B& J* b
- *ADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量): W) q( o' W0 P% W! e9 d) l
- *L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)9 j0 y" g- w2 U( J8 e$ s+ m9 d
- *HMC5883L:电子罗盘,测量与地磁北极的偏转角度5 Z2 v; A& G+ D, ]4 f% q, _
- *BMP085:气压传感器,测量大气压、温度9 [) I$ \3 e6 D8 e3 `0 P0 J8 d
- */( X, E) S7 ]( X3 s/ c* o
- - r. D! k- e" B5 C4 V
- #include "IMU.h"
& ?. n' m8 u0 u5 {0 R - 5 F! W% t5 y: G: Y) {7 S7 V' \* }
- GPIO_InitTypeDef GPIO_InitStructure;8 l. X, c! V# o; c! }. F& `7 D
- ErrorStatus HSEStartUpStatus;2 \3 i' z6 A1 N2 J
- 1 w% q7 D2 R+ H" l9 S
. \* _; Z- q z8 g& y- #define FALSE 0
7 d+ q$ w" S8 H# y7 }5 b) u - #define TRUE 1
+ A; H/ n. ^: T8 m8 Q
& }, d3 H8 N: h9 x* [- #define u8 unsigned char
0 K. W1 M. W+ k+ ^% w0 ^ - #define u32 unsigned int
+ a& b: a( ~6 s& R4 o - #define uchar unsigned char8 S/ I% ?; h1 d/ \- J& f2 h4 c
- #define uint unsigned int . ?6 _0 n$ S4 W- S% P7 ?8 W# K
- #define OSS 0 // BMP085使用4 J4 L& ^. m2 C6 g0 B% @! `5 n1 i
- * m- t v" W0 p7 b. u
- //L3G4200D内部寄存器 A# Y! @- b' P3 W3 s6 t
- #define CTRL_REG1 0x205 L, I* u- `3 F/ G' j4 T, R+ Q
- #define CTRL_REG2 0x21
3 N* h0 o# j7 m" I' t( F; H! k - #define CTRL_REG3 0x22
; G& _, ~' u4 u$ j% w - #define CTRL_REG4 0x23
i$ ~/ d- e3 L$ Z - #define CTRL_REG5 0x24
/ {. n% g, C+ r# ~9 x0 S0 s# a - #define OUT_X_L 0x28
' G2 A4 y0 w9 n: g% z6 n/ x7 u - #define OUT_X_H 0x29
4 F. Q" r. p# q3 _) s9 U; U2 l7 ` - #define OUT_Y_L 0x2A
5 _' b2 f2 H5 M9 H- M - #define OUT_Y_H 0x2B
7 f. `$ @% z% @ - #define OUT_Z_L 0x2C# n: W0 J4 M* V4 R4 K& G
- #define OUT_Z_H 0x2D
* v4 }# y0 A- W2 `; C$ D' H* ` - ' W+ D* h5 V) \3 }5 p* [; }
- //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
; e j |. `; w0 d$ J- g- ^ - #define HMC5883L_Addr 0x3C //磁场传感器器件地址
/ S ?( m# B8 G' e0 r+ a - #define ADXL345_Addr 0xA6 //加速度传感器器件地址
+ E9 K, v+ Z( U' [7 ? - #define BMP085_Addr 0xee //气压传感器器件地址
/ z$ J G" U( I; b% c$ l# A - #define L3G4200_Addr 0xD2 //陀螺仪传感器器件地址; V! b- o8 m) s+ g4 h! e
- 2 { O! i; H* V" \3 q$ S
- unsigned char BUF[8]; //接收数据缓存区,作用是暂时缓存寄存器的值,之后做算法分析' w: O# V0 O) u) r( @; a" m
- char test=0;
) B8 B: v0 D5 ?( p. R. | - int x,y;
" w6 V3 e/ s% w1 J2 I+ ? - uchar ge,shi,bai,qian,wan,shiwan; //uart,显示变量
! A d3 U5 L7 m7 y - , ^8 i5 ?2 i4 z8 V5 r# O' C
- " g' Q: z6 M; o3 a# W% c& G
- short T_X,T_Y,T_Z; //陀螺仪输出数据
, s& `2 @6 _: `8 w% q - float angle; //电子罗盘输出角度,与地磁北极的偏转角度
" s* n- H. X; I* y2 n
1 A& d" S7 j# R6 h; M0 M- /* 加速度计ADXL345 数据 *// e- e! Z# g! j$ R# q% j* T5 Q
- int A_X,A_Y,A_Z; //加速度计读取的寄存器数据
2 ]; @$ C# L: _! ~% @+ N - short data_xyz[3]; //加速度计合成数据
8 E. e2 q. l! B! T: ` - float Q,T,K; //加速度计x、y、z原始数据) |; O- g7 `( m4 e, W
- float Roll,Pitch; //Roll,Pitch角度8 |7 O' }3 O4 ]. | ?/ ]& n; O9 b' S1 d
+ `& C1 B$ G2 n( d- 6 {5 e) v) c. z3 x" ^& E
- /* BMP085使用的变量 */) |3 J8 u0 H) a+ b
- short ac1;: z9 a2 O+ P4 A- o% N& a
- short ac2;
* m, d9 g* L$ X - short ac3;
' F) Y9 k- ^* y. }$ v9 A - unsigned short ac4;5 B6 R$ V% x+ R; v, c
- unsigned short ac5;0 [ b1 l0 y, G- k, V9 e# ]
- unsigned short ac6;* B [0 j4 a# u
- short b1; { G/ f5 Q" [6 n5 [, V! w
- short b2;
: V( X% ]" ^- r% J1 t) ? - short mb;( G" q" b4 J1 q1 |
- short mc;3 H. Q Q5 f: X! }
- short md;; o$ V* O8 u# P/ \. ~
$ D0 j8 \ h% ]9 Y- long temperature; //温度+ G/ _. g' ?7 |' ?
- long pressure; //气压. e* s8 R1 |; b1 Y- C7 \! S
- , i# X/ `/ e; v) n& w' m; g
- 0 _/ S, f7 O: b6 {* E+ U
- //************************************++++++++++++++++++++++++++++++++
% Z) y1 [, b. J( u" w - /*模拟IIC端口输出输入定义
$ L6 W( y# ~# P; h1 G - *SDA:PB93 G8 P2 N$ q' p3 }
- *SCL:PB8- e5 k/ t9 R/ @! U2 x: a
- */
; h; B4 a% W( }7 a) S9 z - #define SCL_H GPIOB->BSRR = GPIO_Pin_8
! s/ i( w8 ]# B- h - #define SCL_L GPIOB->BRR = GPIO_Pin_8
: l6 k* ]# Y' a! X6 S* w/ ]7 B -
2 [! c5 W0 ^+ @8 y/ h - #define SDA_H GPIOB->BSRR = GPIO_Pin_92 q b3 c4 P. G- E7 ]1 T
- #define SDA_L GPIOB->BRR = GPIO_Pin_9
1 ]* N7 I6 ~7 H6 `
% s7 m6 M) o0 H( u# \) c- #define SCL_read GPIOB->IDR & GPIO_Pin_83 V: _0 {9 t+ y
- #define SDA_read GPIOB->IDR & GPIO_Pin_9
* z2 K: I! D! H* R3 i( d# N
8 o9 u/ H# j- r4 H# I
. }7 u; l: H( L# y$ s, Z- ; Y; ]' ^7 M, J( D T
- /* 转换数据 */
5 o' D2 q* K' A# D' E - void conversion(long temp_data) 2 _7 \) O" I6 Z, C0 E% s/ [/ b- Q
- { 3 s- H8 z: K' @' ~6 \! J
- shiwan=temp_data/100000+0x30 ;$ p! J3 W+ n8 q' U7 ^
- temp_data=temp_data%100000; //取余运算 ( O* Z$ W8 g b! P4 r2 K
- wan=temp_data/10000+0x30 ;2 K3 o6 j- X2 M c" ?
- temp_data=temp_data%10000; //取余运算: X, v/ p; t. E0 X y" R, v
- qian=temp_data/1000+0x30 ;1 u! {3 c. n4 N9 k( D
- temp_data=temp_data%1000; //取余运算/ v* Y7 R) h6 q
- bai=temp_data/100+0x30 ;1 Q: {" e K$ l o% ~4 }
- temp_data=temp_data%100; //取余运算
2 F2 B# q& B. A - shi=temp_data/10+0x30 ;
1 u+ x& Z+ R% p# n7 Z! P7 A - temp_data=temp_data%10; //取余运算$ {% v/ ]4 a: a# [+ R
- ge=temp_data+0x30;
9 R- W- m1 g* @4 n2 L. I - }
6 S& C# }( x# a4 t: F - /*******************************************************************************
+ h. u9 p" I' F4 h6 M" P& m- V/ b - * Function Name : I2C_GPIO_Config
7 o( B8 z7 n2 M9 Z6 ~5 s - * Description : Configration Simulation IIC GPIO
) H; R0 ^( \: r& s- B - * Input : None + g1 ]% j' z9 @' r
- * Output : None- k+ R9 n/ C7 b9 L* [
- * Return : None
6 V9 S0 A+ k+ H; Z! F5 v5 l }# B7 Q - ****************************************************************************** */8 m; k [* t( v. |5 s8 y
- void I2C_GPIO_Config(void) y2 h" ^; K: p
- {
2 g; `* C+ L8 [5 x, L0 ]/ H# R - GPIO_InitTypeDef GPIO_InitStructure;
; R9 ^& b9 W; P1 S - % r6 W J! z4 J
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
% `2 t7 l1 Y2 |" Q - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: M/ p/ [! P2 u4 Z4 j1 W9 y
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
p5 C+ h( q) N- p$ {6 T" _ - GPIO_Init(GPIOB, &GPIO_InitStructure);
5 q' ?/ H' m& o
; I7 z, {. h% m& P7 N I# R A- }, w* A& Y9 V/ m# n
; R& J1 r+ A% j- /*******************************************************************************. e0 q7 P: Q* N% h* X
- * Function Name : I2C_delay6 r5 D# s X# R( a [1 g1 `
- * Description : Simulation IIC Timing series delay
0 @* l, B4 n4 O( S+ k* h8 i - * Input : None
8 @& B( V9 b" C0 G - * Output : None% e1 k' W/ C# B% ` E3 u
- * Return : None6 h$ G' A+ [# K+ [
- ****************************************************************************** */
$ p5 ?: B6 Q9 q/ w - void I2C_delay(void)
" v! P2 h/ `3 O1 X7 p - {! {0 l6 C7 P3 p6 _; P
-
7 ` n C* e9 k3 @0 Z$ m - u8 i=30; //这里可以优化速度 ,经测试最低到5还能写入
8 }5 [. y" x! v - while(i)
& n7 o2 A8 w" p# }1 x - { + Y% D* r1 r" o
- i--;
; d* }% c8 X) B, ~, X* k - } % ]& ]# Q# t2 b, x4 K9 [
- }# d: i( w0 @% b( ~9 K# A
4 J: X# m; o8 ^! q7 g1 g- void delay5ms(void)
) ^" \; ~0 i# F+ {( e - {2 d; d* O4 _$ P: t5 t# k5 O! B
-
; z3 V( m! S7 P: J$ H( @# Q - int i=5000;
% n5 q/ B4 T, ^ - while(i)
* Q/ g1 Y# w4 X/ Y( G+ q - {
. [9 f2 H6 l: T* c3 w6 e" d7 }4 V+ v - i--;
" `$ i: B+ o, z" d+ C6 V - }
; ?5 t7 g& o: \) t6 _ - }4 e0 |: `& W Y0 e# }
- /*******************************************************************************
! D0 A9 ~% s/ L Q - * Function Name : I2C_Start5 d, z: ]; D8 [/ G
- * Description : Master Start Simulation IIC Communication. [, |0 J5 }7 V- |% b) f
- * Input : None; B7 |' b2 t: e; u
- * Output : None9 Z K) ^9 ] x' I# t
- * Return : Wheather Start
9 s% X. \& N" P+ ~2 D; x - ****************************************************************************** */
6 _& X; [' v# m( F* [' A - uint8_t I2C_Start(void)2 C# L: G4 t! v5 [2 T
- {
: H, t, M; h' i+ A! k - SDA_H;
3 G4 D+ T( a& V- X) E3 L: e - SCL_H;
$ C( c: W H; v8 S - I2C_delay();
! w- f1 e/ K4 S7 k9 o+ k - if(!SDA_read)return FALSE; //SDA线为低电平则总线忙,退出, a# Z) g- I7 N2 P
- SDA_L;* Z% w0 W; ^5 t4 U; o4 Q7 ~5 p# H
- I2C_delay();
& I D1 H x& L. H, r4 Y - if(SDA_read) return FALSE; //SDA线为高电平则总线出错,退出3 f% O/ w+ g- m1 j
- SDA_L;3 ?& B4 {; z8 C0 R# `+ D+ }5 T
- I2C_delay();
I5 c+ H5 R# m& |. V - return TRUE;0 J; X @, k$ U- A
- }
6 h: G/ E9 L) r' [! f& T9 D/ `+ f g, y - /*******************************************************************************; m" f/ J- b+ [8 i+ a* i+ j3 C$ O
- * Function Name : I2C_Stop
, G n( J; p" L! h - * Description : Master Stop Simulation IIC Communication* `6 t/ t5 b+ y" I$ I* ~3 J4 ]. t
- * Input : None
0 b" ]. }( _3 W - * Output : None& }3 V9 i' S5 j9 F
- * Return : None$ T: r6 H7 Z+ G
- ****************************************************************************** */
3 f+ a+ ~/ d A) g& a - void I2C_Stop(void)& M. d* X9 Y' c. G8 C& O
- {
+ f% g# C: A- S$ A8 \ - SCL_L;5 N. h7 H% n, u- `
- I2C_delay();4 W; L2 |8 N0 Y. I+ K$ C5 W& U
- SDA_L;% L- \3 ]$ F$ \& K2 S
- I2C_delay();
) K! B/ t5 n4 v7 C( Y! E- P - SCL_H;( Y% A% _% @9 W8 \# D) m
- I2C_delay();) P( Z" \; s: g' Q: u, `. P" T+ Y
- SDA_H;' B& G% X! |& }
- I2C_delay();
! Z! b1 C9 P$ g - } - A' _! v6 K/ M: p0 T/ v$ G
- /*******************************************************************************6 O4 Q' D# s1 {1 x% A5 I' N
- * Function Name : I2C_Ack' j" T$ q2 k9 n p
- * Description : Master Send Acknowledge Single
% M3 t+ Q3 b4 B4 T8 ~ - * Input : None2 W% r/ i0 M4 |3 c# k5 m' f
- * Output : None# A9 N% U8 Y4 [4 E+ K
- * Return : None
" @" ^$ E6 I2 O8 P# t: ~: S/ Y0 O/ } - ****************************************************************************** */
" P/ z8 P/ V# b/ A - void I2C_Ack(void)
& o: E" L' W4 Z1 b' R - {
4 @" X' l9 z5 s; E7 M7 e! _ - SCL_L;
( s" N8 g" Q3 J5 |/ ~+ Z" S+ f( } - I2C_delay();
5 `, ~, B. C# V - SDA_L;- p/ T- l, L" H0 `* ?7 X
- I2C_delay();
& }. P& ?5 Y* k6 v2 m! N - SCL_H;# D8 ?0 |5 [! J ]5 }
- I2C_delay();! W( L, q' H3 j3 }) U) M9 C
- SCL_L;
4 G, A3 y) R# O) W9 k2 G$ n2 g9 I z - I2C_delay();
+ t+ i. ?+ L5 M, C4 | - }
( V- c, V7 o) ` - /*******************************************************************************
( t& |+ \0 T* @1 M& t& c - * Function Name : I2C_NoAck
* F& D8 n/ ~2 k/ a - * Description : Master Send No Acknowledge Single
" N% `( q- b# i& D% q2 } - * Input : None$ ~. W9 @: C" r
- * Output : None; w. L. e. p1 a3 c
- * Return : None
. W7 h6 O+ H0 X B- h4 ^* h L - ****************************************************************************** */
) m3 t( d+ I: r - void I2C_NoAck(void)7 ?2 V0 g6 g' w
- { 2 e a& h6 f# k A8 S9 k
- SCL_L;
. @$ W% [" E7 m" [) g - I2C_delay();
6 D& S# T/ A: r3 [ - SDA_H;$ @7 q; n9 J+ a/ f% e) h& `- Q
- I2C_delay();+ f8 m& m# A' N& ]' A* @
- SCL_H;) y! o$ h9 |- ^% m" t
- I2C_delay();
& ^6 B- R; P; n. k$ Z3 @3 k3 h - SCL_L;) l! w" k" a. A. t
- I2C_delay();" ~$ I* T, U0 w0 f
- }
3 Y6 }8 C2 t# i0 g! Q) z' U6 i - /*******************************************************************************
# K3 T. Y$ T4 ]/ }% f+ C - * Function Name : I2C_WaitAck
, W6 {* d" j8 D4 O1 Y* @ - * Description : Master Reserive Slave Acknowledge Single
. x0 [7 S( v# _& W$ K7 l0 \ - * Input : None! J9 v9 T6 `9 `
- * Output : None" O+ t% }5 B% {" Y8 e, M- [
- * Return : Wheather Reserive Slave Acknowledge Single
6 K3 w( r- d. f: e - ****************************************************************************** */ V4 w% N( [: i* Z& J0 e$ P
- uint8_t I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK6 M( o. d8 X, s9 G9 n
- {
2 ?: M1 |. [& J5 P: C8 A - SCL_L;; ^4 i/ Y5 \. h {: A3 ]
- I2C_delay();- V+ T2 S6 h9 c+ {
- SDA_H; $ u8 j( g- N: z7 X' |
- I2C_delay();/ C, q+ N2 L i7 D4 [% f2 N, d
- SCL_H;
7 [( K' N7 d d; N3 |/ g1 |6 A - I2C_delay();) T; v. Q/ x$ M
- if(SDA_read)
D- M* l2 b1 \6 a& d/ S% D - {
4 t* I, _* m+ R0 F4 }6 B: @ - SCL_L;
$ H$ e! ?7 t' M" L1 g ?5 p - I2C_delay();
3 S9 C+ g8 |- s6 d7 l - return FALSE;: u" ^1 i. D N O, E! D
- }
' C. Y5 w3 j6 ?; g, {# E - SCL_L;- t: Z% c0 b4 ^4 m
- I2C_delay();
6 T7 n. s; X& I" N0 k - return TRUE;, h6 @: l2 u t9 ?' q; L
- }
, L6 G1 {; x; i: G - /*******************************************************************************0 B2 Y& D+ Y A) Q ?
- * Function Name : I2C_SendByte
5 Z" F8 F8 K- t+ V - * Description : Master Send a Byte to Slave9 l" B% h, G- M3 I- L- {
- * Input : Will Send Date
9 N+ |2 x1 I2 t C - * Output : None
5 |' t1 e) W- j- t - * Return : None. r( X v) P2 O# J( w% b
- ****************************************************************************** */4 A8 G4 Y8 ~& ]+ O/ x# r: w$ [
- void I2C_SendByte(u8 SendByte) //数据从高位到低位//' k) ^ p3 a1 H. ]. z6 A
- {9 l$ t( l: I, \& A
- u8 i=8;
, O0 T1 j* h0 d; }! U2 z* v - while(i--)2 Z X) m. }. P# ~: N3 K4 L+ u. O3 H
- {
; @# P1 s9 R. p0 h" X9 {# J - SCL_L;
" B. _* ]2 X7 V3 q5 l; G8 R - I2C_delay();8 U8 i% i0 w: v f/ i# [% a4 c- M
- if(SendByte&0x80)
# ?$ \, ^# f7 @6 k3 V - SDA_H;
3 F3 H) j; L) d1 m3 u" y6 k9 K - else
2 Q% `/ H1 B2 c2 Q - SDA_L; 5 Q* c. ^. n% r8 D, W
- SendByte<<=1;
+ M6 r4 k/ H2 R3 a - I2C_delay();
) U+ k- a1 f+ [3 M* \; f m! K P+ V6 @ - , I& c. _& s5 g- T+ k, g
- SCL_H;
( _8 ]: r3 V7 g1 U! y7 c/ }' {& F( z - I2C_delay();* t5 P& x+ R( k$ o5 Z. r1 e! X. z
- }2 F: x! Q1 _* P7 w. m
- SCL_L;' E6 N$ B) o# r# ^. G! f' x
- } ) I& C% F7 e7 A, \3 l
- /*******************************************************************************. g2 U: o7 c" F8 r D- ^
- * Function Name : I2C_RadeByte3 i" Q4 g7 _# t0 s9 S! A
- * Description : Master Reserive a Byte From Slave
7 c. x+ c. t8 o5 v$ E - * Input : None
$ V' b# T' c d4 P( u - * Output : None2 x/ A2 Z* l( x) |/ p' B& u B
- * Return : Date From Slave
( N- {; P3 }0 ~" Q: e - ****************************************************************************** */! ^2 j; e" {- V$ t; \
- unsigned char I2C_RadeByte(void) //数据从高位到低位//
7 ]2 y$ \' U+ p) H - {
8 ^3 z9 [+ O6 `) N g6 a - u8 i=8;
x7 b6 S9 Q$ ^( ]% L - u8 ReceiveByte=0;5 l/ ]' F1 ` l v7 E
1 y" i: Y: {; D: b0 K- SDA_H;
( l5 Y; q: k0 f6 a6 Y0 x* \9 K - while(i--)# f( A& O+ \& }+ v# Q' ?* T
- {
) j/ t$ I2 J% S$ M; i% A - ReceiveByte<<=1;
! w- m% x v, a6 c6 S - SCL_L;% ^8 |0 A; g" V: `
- I2C_delay();
# @( F4 f4 w: J% d( F. v - SCL_H;
3 \; g2 F) |* e, O/ W: }& v - I2C_delay(); ) B: ^4 Z. \! E" j; T6 X; P
- if(SDA_read)
) G% q+ u4 @. } _ - {5 L( b' Y% K- N. b+ o
- ReceiveByte|=0x01;
! }4 @9 a2 p0 I) q% J% l0 | {5 z - }
~3 p/ Y) A$ M: r* ~9 {! B - }7 U+ k1 A' d3 |; f
- SCL_L;
F$ _# e* X# o4 i. b6 R - return ReceiveByte;& d, Z$ f4 k& Q) X% d; x! [
- } & [5 z0 |! j/ I
- //ZRX . C8 |% {% |9 f* e
- //单字节写入*******************************************
! l. u( x* U' [$ K+ } - " b8 d7 b# V2 e; O3 |0 V6 P1 r
- uint8_t Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data) //void
9 Z5 Y' F& r3 L& J; `+ V - {* ]( y* E8 D7 P' l8 G+ R5 k: J9 @8 [
- if(!I2C_Start())return FALSE;
: k1 P, C6 R1 W) ] - I2C_SendByte(SlaveAddress); //发送设备地址+写信号//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址 & ]4 G0 f- |' `
- if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
& H5 V3 f# x' u @2 A; [, m - I2C_SendByte(REG_Address ); //设置低起始地址
/ x& r. g# B& F, H5 A - I2C_WaitAck(); 5 v9 O/ d, i$ x5 F# ^; R5 U
- I2C_SendByte(REG_data);
; L6 J# S% p1 p2 { - I2C_WaitAck(); $ v$ g% G; x! j1 o1 L# A8 d4 F
- I2C_Stop(); 6 _) T2 g8 ?8 B$ ^, s
- delay5ms();
7 O& F$ `: q+ B O' t - return TRUE;
7 R" Z/ x- [8 r, c) ` v, ? - }4 C0 d* G- g( |! N: V
* c4 u: t8 H2 [( s- //单字节读取*****************************************
+ B3 s, D. h/ D+ d0 o - unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
. k# s6 g2 ?' `& |( n/ b% ? - { unsigned char REG_data;
" K2 e J% y* I$ T - if(!I2C_Start())return FALSE;! P! |2 x2 r. d( e
- I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址 0 k3 D+ A, \; z, {- i2 M; E }
- if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}' w( [- R: h% k4 r8 A& u0 ]* p2 s- O
- I2C_SendByte((u8) REG_Address); //设置低起始地址 " P3 c6 b; L7 s7 l2 `
- I2C_WaitAck();
' X4 u: F8 h, h& C - I2C_Start();
5 |$ f+ k* q8 k, I c; s2 A- F - I2C_SendByte(SlaveAddress+1);
4 { R4 n; E! b - I2C_WaitAck();3 y8 ~, h0 E% \! y
- , b/ z* j0 V% D: z4 ~
- REG_data= I2C_RadeByte();
- D$ t( W5 ^3 n& }( ~ - I2C_NoAck();1 I8 M8 ~- E; [
- I2C_Stop();
6 ?2 e M: ]7 S [; B) ? - //return TRUE;
9 Y1 |" [7 h1 e0 A2 ^& ] - return REG_data;
1 C1 y& H0 {; b- Z- s3 w - , J. _ n2 v4 Q. Y
- }
, t$ s+ B j C0 y- e' p - ) a5 z8 n. O N* A! }
- /*; m! f$ q8 y0 s6 ]
- ********************************************************************************
* y. A- m# T" Y( B - ** 函数名称 : Delay(vu32 nCount)
6 w7 m7 Y* r6 t; V - ** 函数功能 : 延时函数8 e+ T& \2 \; Y6 q2 l# U( I" n
- ** 输 入 : 无
2 C. L5 F$ P" Z$ N; c0 C# J - ** 输 出 : 无' ^: V @; y2 J% _7 {
- ** 返 回 : 无; S6 F. |; m' M" W8 P) ?# [
- ********************************************************************************# Y% x# y \/ `, b+ d) ]' F5 q
- */: R5 r, k( o N- y3 e, N6 Y/ K
- void Delay(u32 nCount)
& k/ N* [: V% E; k1 o: g - {1 n+ E1 J0 m- j* x8 s' }7 O( \6 D' D
- for(; nCount != 0; nCount--); {4 u# T9 T2 f* q+ g, l& R
- }
3 {& T: g, { P# W2 [
* \1 |( l* p3 J# p( N- /*
/ Q1 J' R& P* y5 h( n- j \" n7 v - ********************************************************************************
# V6 c! D( a* x0 P7 Y - ** 函数名称 : void Delayms(vu32 m)
1 \& R) B4 E/ P% ~ S - ** 函数功能 : 长延时函数 m=1,延时1ms
4 L8 C( m# c" ?# z$ G5 n - ** 输 入 : 无
, C6 j9 C0 r$ i; t, Y5 ] - ** 输 出 : 无! @' U3 {& d9 o! M4 d
- ** 返 回 : 无
# q K" Z, L% X' R9 V- D, ^ N1 Z - ********************************************************************************
/ @& L( F$ \! _; D4 d8 ]) c - */2 D# k/ |/ A8 E# _) G! j- A m
- void Delayms(u32 m)
0 h+ R+ m$ x: h) Q* A7 G4 G - {3 S+ w& @# C/ q: I9 f# `. c
- u32 i;
/ m4 G8 V$ P$ r' P7 v -
: \/ l+ W; J, V - for(; m != 0; m--) 6 Y1 o6 [. n% X3 a: T" G
- for (i=0; i<50000; i++);
! ?/ C/ m @7 p! ^8 }7 u, Y - }
5 d% a0 n8 P9 g. `+ y K6 [ - 1 d0 R- z$ `, W6 a
5 q: H4 l3 S3 Y, f- W# x
O/ k" o2 B7 v- B# i& S6 S
- @8 N& r$ ]4 ]# L) j! D9 F- //************************************************4 m, x6 c$ @( ^ H( R
- void USART2_SendData(unsigned char SendData)
% Y- i$ s4 I" f6 i - {! V1 o. h0 Y8 x4 ?0 @
- USART_SendData(USART2, SendData);
; m" }# S7 y/ S H1 k - Delayms(1);: x1 `( _% I7 e4 q L) g
- }
) u. V! w+ T+ U7 |9 N4 T; i - ; x0 c% c# F/ X A) @4 C. v
- * V% ]4 O& ~' Z( C/ U3 O) c
- //********************************************************************
6 \: d5 A: A* d/ }, { - long bmp085ReadTemp(void)/ S; E9 l6 C5 N0 b y/ ^9 U
- { short temp_ut;9 n$ B: m2 c6 P* }6 k4 }2 q- L A
- Single_Write(BMP085_Addr,0xF4,0x2E);8 d, }# L! ~' f6 b' V- u' e1 J
- Delayms(5); // max time is 4.5ms7 k( g+ S9 U& ~* F" Z' V9 Z
- temp_ut = Single_Read(BMP085_Addr,0xF6);0 H4 G8 M: l1 q( x7 K+ `
- temp_ut = (temp_ut<<8)| Single_Read(BMP085_Addr,0xF7);
2 [: K& J! k/ p - return (long) temp_ut ;7 `" L X d! N4 B6 I
- } M: U; `% _$ z0 X9 _4 |; J9 ~
- //*************************************************************! e) q7 s" B- K" _% w
; q- F5 h8 o6 s/ R- long bmp085ReadPressure(void)- a, K: i k( [) C- S
- {
& N8 L8 {- i! p - long pressure = 0;
5 K9 \. ^% b& [0 U X - Single_Write(BMP085_Addr,0xF4,0x34);
, g7 _! b" ]4 [, L - Delayms(5); // max time is 4.5ms
( T$ D/ q; W! \7 y! V - pressure = Single_Read(BMP085_Addr,0xF6);
/ l, }1 K+ m3 o3 O4 t" b& r% S2 D - pressure = (pressure<<8)| Single_Read(BMP085_Addr,0xF7);
3 e( ~# t$ J- Q; N9 {# Z( \ - pressure &= 0x0000FFFF;
, q6 E+ E; @, S- P7 H9 u - return pressure;
/ r' p) G* \' \* u7 ]( T - }
6 f: }% F+ k! Q4 q4 {- I - . K+ w ^6 B$ E# Z
- //******************; j5 d% D' ?+ {) H& ?" a
- void Send_ADXL345_data(int dis_data)) v: ^* ^ a* }2 \; N4 H
- { 6 A$ C$ c' O& j6 u
- float temp ;' p& Y4 d5 M2 _: }2 O2 w
- if(dis_data>0x7fff)dis_data-=0xffff;6 W* c2 D( P9 ]$ U
- if(dis_data<0){
5 i8 ~2 p! P# g; u$ K- i5 ?$ j+ ^ - dis_data=-dis_data;
" k; Z! J2 x6 {% ^& k4 {6 Q; {% ~ - USART_SendData(USART1,'-');$ Z ~2 C* C) L; [- Z6 o
- Delayms(2);
, ]4 V7 j- k; o# O - }3 B7 {6 _+ G7 k' P' n
- else3 f% o& N4 d& o% D$ x, ^
- {
5 O; L4 n" b2 H; Z - USART_SendData(USART1,'+');+ z( @; L Y5 Y1 o* Y+ r. j
- Delayms(2);
# h5 T; }. H: f) N9 `& E- s - }
+ q3 v. n5 X( ?; a+ a) e* x0 ^ - temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页 g: C! t8 v6 W( ~9 u/ B1 _! c+ _$ j
- conversion(temp); //转换出显示需要的数据 , A& P8 y" J# A3 a7 o- N$ K' q
- USART2_SendData(qian);
1 n/ h8 {. B7 A* e( e5 [( ^ - USART2_SendData('.');
( Y5 h( o1 ^. }! g5 _ - USART2_SendData(bai);
! l( U" o& ^) O/ K+ R( M# B0 t - USART2_SendData(shi);
' D2 O) n+ z5 D: k; K7 n, s - USART2_SendData(ge); - t* d8 q3 o y' z
- USART2_SendData('g');
. C/ x a! L7 [. l - }4 _7 |5 ?4 B" G, |) g) \
- //***************************************; V0 _, K; h4 `8 p
- //****************** ~$ k3 H5 f- f5 K0 ?" B n$ e
- void Send_L3G420D_data(short dis_data)
/ P1 B8 m3 @6 _9 G: J+ X6 f2 \* H - { float temp ;7 X$ P8 j2 n1 o
- if(dis_data<0){
. H/ t* F) c2 ^* f - dis_data=-dis_data;- _3 l2 c6 j! a* G
- USART_SendData(USART1,'-');+ Z2 N) L: Y# [- e( i1 g: j
- Delayms(2);
# u! ]4 q6 l! y6 ] E7 `& X5 t - }$ g- J9 B) N+ R9 ?: A6 t
- else
/ a- a$ h8 Z( ` - { 7 y- s: S' |9 G
- USART_SendData(USART1,'+');
: _2 w% o3 K5 s R, H - Delayms(2);/ o, t2 p) {6 I) {( P2 ~
- }- K p$ {6 T9 \2 c/ b+ L
- temp=(float)dis_data*0.07; //计算数据和显示,查考ADXL345快速入门第4页
* b. U8 Z, l! C2 e: j4 ?' l - conversion(temp); //转换出显示需要的数据 ( N$ Q' z4 N/ r5 q1 Q! k( M8 I
- USART2_SendData(bai);
$ Z& q0 o8 h: Y3 [$ b/ R - USART2_SendData(shi); . _. s9 r0 v( K+ d# Z- c
- USART2_SendData(ge);
+ x: \$ J' q! E' x -
8 r X0 ]6 U: v - }
0 v9 b" _$ u" Q - //***************************************! |( W" f. A& C/ Q, a- p% m' F
- 3 u- u% N( s% i
- `5 ]- P1 F C5 Z8 ]0 v
- void Send_HMC5883L(void)
+ z: r! M' [ r. L9 F4 t1 W/ S% t3 u - {
1 R+ M4 o) W4 {) e. c A" y - USART2_SendData('H');
* d& F) @. s8 } d - USART2_SendData('M');
9 ~) y( n4 @7 r7 w( Q: r+ T - USART2_SendData('C');! m- b1 Z7 o9 w& _
- USART2_SendData('5');
3 ]2 X8 j7 }) @7 U( n& t5 h - USART2_SendData('8');/ _- {4 A) |; R
- USART2_SendData('8');- K: \2 g7 M1 P4 r- }; V9 o
- USART2_SendData('3');
3 J4 P. `2 s- k4 B2 u - USART2_SendData('L');
3 e5 W( Z+ ~0 ?. N - USART2_SendData(':');
u0 o; O$ s; R - conversion(angle);7 E H( u1 ?4 [8 O3 ]
- USART2_SendData(bai); ' T' K# S( ^) K' [. J) n; x9 |5 K7 \
- USART2_SendData(shi);
6 D1 s8 `% l/ Q, s - USART2_SendData(ge); : _6 l/ F; c2 r: R0 p( r4 j* ?
- USART2_SendData('`'); D: O5 {( V; a8 B
- USART2_SendData(0x0d);
7 k& G7 F+ @( H2 r - USART2_SendData(0x0a);9 y4 K5 l0 M& i- X5 K- C/ S8 x
- }8 n: _ m8 f0 H6 C
- //*************************************************1 f3 Q- W6 X' C+ l# C; f! I
- void Send_BMP085(void)
6 K1 Y/ L% ]* ?+ P% @ - {
: c5 u' d, K& T9 r8 D& a - USART2_SendData('B');
9 C$ V3 m T) f; p( E - USART2_SendData('M');9 N, u4 o% \& p! l( Z
- USART2_SendData('P');. |) ]& I2 P# o
- USART2_SendData('0');
7 u- s0 Q. W) X( G - USART2_SendData('8');
6 f- |( _: E4 V' v" x \ - USART2_SendData('5');+ q3 Q/ V& w7 f L# K; N
- USART2_SendData(':');8 G1 l7 n F @7 `' g& i
- 5 J( p& i% O) Q! Y+ x3 ?" Z4 M- {
- USART2_SendData('t');
+ Q& c% i: @! Y" F% k - USART2_SendData('=');
! C/ o0 B: E/ S" |! @ - conversion(temperature);- z- D% X5 E6 k& k! a; b' E
- USART2_SendData(bai);
. X4 j$ G7 @+ x - USART2_SendData(shi); . @! v0 p9 W1 L8 T
- USART2_SendData('.');- N5 ^# B" z0 L0 ^4 J# u0 t
- USART2_SendData(ge);9 N& T4 n1 T2 _' x6 a: \
- USART2_SendData('`'); ! K6 W5 {) P; X6 J/ R0 J1 `
- USART2_SendData('C'); 4 B2 ?# I: R* a$ o- u/ J
. B: k0 n( i* p$ ~3 S8 B8 R- USART2_SendData(' ');
, u% r6 X) g. A3 H" Y3 h2 n7 ?6 |& ^6 e - USART2_SendData('p');% H9 L' n! K8 S+ w9 U: ]# H
- USART2_SendData('=');
" ?4 f, v$ I o& e2 z3 G8 b1 n - conversion(pressure);3 n7 D) `6 @! ~: x
" V9 L( i+ `0 \' u/ Y- USART2_SendData(shiwan);
3 S1 B# S% [+ ~- s* ^1 Z - USART2_SendData(wan);
6 N. j$ g7 j r" {5 J" z - USART2_SendData(qian);
t# [# Q2 R" S# L. r6 K - USART2_SendData('.');3 p' B" [5 Y6 C% L N* h; g3 a
- USART2_SendData(bai); + w* B/ g/ N7 a9 T. j
- USART2_SendData(shi);
6 i+ H5 f3 ^( k - USART2_SendData(ge);
5 t8 K: q, w# \) y - USART2_SendData('K');
2 s; ?2 D P" M/ d/ |* k! Y - USART2_SendData('p');
- Y$ v& V. p; z5 ? - USART2_SendData('a'); / u: E0 P N1 H$ B& W4 L1 Y# P
- USART2_SendData(0x0d);
; {$ @$ K+ y4 D6 @& n- e# Z - USART2_SendData(0x0a);
7 g( l: s# Z; r- e' m; N7 w8 M - 6 h8 J5 N$ e/ r
- }
' |1 ~& ~8 h( z" M: {7 I6 | - //*****************************************************
& W1 t3 ]$ a) l- X( s. ]/ T. f
! w) k5 |; [* B( e, [3 y3 j- void Send_ADXL345(void)
$ ?: k) K1 i! i - {
+ i, o! k g6 ~. a4 C n: d - USART2_SendData('A');4 i* w, b7 K( q9 M, [: x
- USART2_SendData('D');
; q0 W5 k& O9 I - USART2_SendData('X');
+ X C1 W- t9 O5 h, z I$ k* D0 c - USART2_SendData('L');7 v& Q: }4 t+ w$ e
- USART2_SendData('3');5 m) m L! w! u' ^% Z3 K* d
- USART2_SendData('4');
2 F/ ~6 k" U8 Z' X" p6 H) B! R6 o - USART2_SendData('5');
* V$ @1 M7 t( `" e4 k# X - USART2_SendData(':');. K5 s$ t) t$ M
- USART2_SendData('X');
2 S; d! i% |$ J* l! [5 t, H - USART2_SendData('=');
. F+ G! |, @/ o, w* a. X - Send_ADXL345_data(A_X); e) y; B9 O: }
. C1 Y0 u9 N3 d$ A- f- USART2_SendData('Y');! e# W& i1 ^5 R7 g, M* l
- USART2_SendData('=');
|; Y, _' k. f. r% m1 t - Send_ADXL345_data(A_Y);
5 B1 B% Q7 t" R# m/ O
9 s4 q7 B7 ?3 w0 N! T' |3 J+ R: a- USART2_SendData('Z');
; g1 m! f% b# D% d, } - USART2_SendData('=');
+ {2 U8 B# g9 `2 ^+ p" S% a w: Z - Send_ADXL345_data(A_Z);: D2 |, f6 ~- U# _6 y# `! H
! p9 H! Z6 e6 _4 i+ E! n+ Q- adxl345_angle();9 [; P, M! Z- V3 Q) A
2 b- ~$ ~: _, ?0 B% U: q6 Q) N/ s& i
4 I' D2 m& n' r% h7 Y! P/ _% N- USART2_SendData(0x0d);$ N) a ?) b }3 w
- USART2_SendData(0x0a);" o5 i1 _" e/ B+ [
- }8 T" d- {" n3 }5 o# k
- //*****************************************************
8 ?2 r" V3 {, `6 V: M! t - void Send_L3G4200D(void)8 v6 S2 T R+ D3 c4 Y
- {8 p+ k9 d* w; e2 K
- USART2_SendData('L');! b/ Z6 W& x2 _; O; {% l; X7 i
- USART2_SendData('3');2 e3 r: Q' s" B& E6 a
- USART2_SendData('G');
/ R) F* K0 U8 b- t - USART2_SendData('4');
$ W6 x1 Q( _0 \3 V# J% Y - USART2_SendData('2');. @: L+ M* @/ }' n
- USART2_SendData('0');
- U) }! P2 n# B* m9 p - USART2_SendData('0');
$ A5 [( I% z' U! ]/ {4 R4 m - USART2_SendData('D');
6 S8 l8 r8 O8 @! f" M3 f2 U- q - USART2_SendData(':');
$ v' q6 b' E4 c: u* C" ` - 7 k4 c3 m) W0 x/ j
- USART2_SendData('X');$ W w x" ~- M0 I6 X% A2 _0 G
- USART2_SendData('=');7 }+ t" l u: N
- Send_L3G420D_data(T_X);
6 }2 C: O( N2 ]/ E* |! n - 1 |/ W& A; R8 H
- USART2_SendData('Y');* v. `8 [+ W! x- f4 `$ @- v+ E
- USART2_SendData('=');7 ]: b0 E, H. F- }. c
- Send_L3G420D_data(T_Y);
8 P Y6 z4 k% S# G7 z6 ~6 ?' W - F! d1 G5 \/ ]1 ^$ U1 n0 d
- USART2_SendData('Z');
9 \ ?7 V& T" H7 I8 C7 e - USART2_SendData('=');
/ k8 W4 ~1 c( ` - Send_L3G420D_data(T_Z);6 C6 e0 w7 e( f
- : u. O7 ^2 m e5 P2 H* D k' x6 m
- USART2_SendData(0x0d);: }- `) t9 }5 U8 K) E" T& X
- USART2_SendData(0x0a);
1 ^$ Z S- G4 Q+ k. q9 i/ \& D - }( H- K' D9 g( u5 W. k0 A- |
- //******************************************************2 H* K+ D" K6 k( T7 z
- void read_HMC5883L(void)3 S; ]8 v7 S$ O, s1 q
- {5 R& _4 }! c- v/ I: W
- Single_Write(HMC5883L_Addr,0x00,0x14); //
1 s; h0 Y5 @2 A5 W% x - Single_Write(HMC5883L_Addr,0x02,0x00); //! M) E3 c( S1 O. t3 p" F
- Delayms(10);2 Y" A+ D. A0 @9 q
; A. z. B! B- B! | e( d& x- BUF[1]=Single_Read(HMC5883L_Addr,0x03);//OUT_X_L_A5 B" W$ {- O8 \# O' \
- BUF[2]=Single_Read(HMC5883L_Addr,0x04);//OUT_X_H_A
) ]+ v6 S( w# Z: z - 2 y$ t5 t1 n' F: N1 n- {
- BUF[3]=Single_Read(HMC5883L_Addr,0x07);//OUT_Y_L_A
- b5 z& A( ?' d6 B+ F - BUF[4]=Single_Read(HMC5883L_Addr,0x08);//OUT_Y_H_A( u; q4 S( i" C9 ^$ ^/ _. C
- . b: I; p' E" H) W; f
- x=(BUF[1] << 8) | BUF[2]; //Combine MSB and LSB of X Data output register7 p5 k+ \- e; \# @4 M
- y=(BUF[3] << 8) | BUF[4]; //Combine MSB and LSB of Z Data output register
$ H1 i+ l# v7 q3 G- s1 b - - R9 H9 G" l7 A
- if(x>0x7fff)x-=0xffff; 6 [5 C+ R w/ z
- if(y>0x7fff)y-=0xffff; 3 m" p c4 G" Z, z
- angle= atan2(y,x) * (180 / 3.14159265) + 180; // angle in degrees
$ R8 X7 C/ {3 q$ \4 C - }, [' U) {6 m$ |( ~4 q% \
- //****************************************
* \4 _9 U. M+ q8 Y5 R5 Y& ~/ ~7 D - void read_ADXL345(void)2 e9 t7 z" J8 _$ i
- {4 S: \: p+ ^4 P
- BUF[0]=Single_Read(ADXL345_Addr,0x32);//OUT_X_L_A+ p2 B( O- h- B+ c
- BUF[1]=Single_Read(ADXL345_Addr,0x33);//OUT_X_H_A+ Y! _/ J+ x) M8 b( e% m
# l9 W% L, i) j2 q+ o8 J- o- BUF[2]=Single_Read(ADXL345_Addr,0x34);//OUT_Y_L_A2 \! s3 x% Z" Z) V! B% ~% _- r
- BUF[3]=Single_Read(ADXL345_Addr,0x35);//OUT_Y_H_A
) r h: L7 q+ A6 p% Y# p
; v* D+ g& Q8 V2 Z9 i& H, k- BUF[4]=Single_Read(ADXL345_Addr,0x36);//OUT_Z_L_A0 v9 P2 ]5 O V
- BUF[5]=Single_Read(ADXL345_Addr,0x37);//OUT_Z_H_A
. M1 ?$ f: y1 y7 s: d7 v - 3 O, M9 r1 ~$ b
- A_X=(BUF[1]<<8)+BUF[0]; //合成数据 1 d- W' U8 r8 W0 A4 I, u) O2 d
- A_Y=(BUF[3]<<8)+BUF[2]; //合成数据
; s- a2 z! p0 V - A_Z=(BUF[5]<<8)+BUF[4]; //合成数据" [ U% S/ [! f
- }
) l# V0 v& o0 q) F, p - //*****************************************
7 {& v2 ?9 o" @3 B( {, J+ s - void read_BMP085(void)% q% [+ \' ~& H2 t
- {0 l3 r8 `/ Y, X% Z; c6 h, {2 a
- 5 C. j+ ^( Y3 y3 L
- long ut;; N( e6 _0 F# h5 N0 F X. b: i
- long up;
7 P' e9 |) \' T. r8 e- @1 n: r: K0 q - long x1, x2, b5, b6, x3, b3, p;1 D; e% t4 x( g0 S' y4 B4 n1 e/ B
- unsigned long b4, b7;: U) |* g Q5 a/ G. h$ r
7 p0 p9 @: I7 N0 n- ut = bmp085ReadTemp(); // 读取温度
' B5 \- h6 B- p/ i4 f, w6 y. ? - // ut = bmp085ReadTemp(); // 读取温度9 B* @% B9 ~( y9 K% R# z
- up = bmp085ReadPressure(); // 读取压强+ `5 z; X8 e1 [
- // up = bmp085ReadPressure(); // 读取压强
% N" p2 G& j9 M/ z- ` - x1 = ((long)ut - ac6) * ac5 >> 15;
+ `, i4 e- ^+ U3 p - x2 = ((long) mc << 11) / (x1 + md);8 J$ ^) F2 o+ {* g2 A' `2 {' f; {
- b5 = x1 + x2;
/ F, f3 p% d3 r# G$ L7 k( ^ - temperature = (b5 + 8) >> 4;
# _) q- d T/ q. S u. |, Q4 h1 g: O - : M7 ?2 m! o/ X
- //****************
( G6 }4 `3 A3 [9 Q
" b6 {) d5 ?- ]2 ]* ^% r- b6 = b5 - 4000;
* B# x) ~- ?+ Y! S - x1 = (b2 * (b6 * b6 >> 12)) >> 11;
# u' j: }* E9 V7 ?( S2 | - x2 = ac2 * b6 >> 11;
4 t, k- Y0 K( J! I - x3 = x1 + x2;5 y' i+ S' l% {1 T. {
- b3 = (((long)ac1 * 4 + x3) + 2)/4;
3 Z8 Y* I0 V+ u( D' p1 e" u9 U) j2 M; D - x1 = ac3 * b6 >> 13;0 b# k& [: J4 w
- x2 = (b1 * (b6 * b6 >> 12)) >> 16;) B' z# ]6 h2 e- m
- x3 = ((x1 + x2) + 2) >> 2;
; H$ E1 z% e+ K$ \) d# M: l% T - b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;9 e" ?! ]2 x3 f% m5 K1 L
- b7 = ((unsigned long) up - b3) * (50000 >> OSS);
# D: j% o" x$ X: a - if( b7 < 0x80000000)
6 I9 M) m& o6 j5 u" M1 j! a - p = (b7 * 2) / b4 ;
2 L/ s- r0 f2 N( w( H - else " U( W3 t/ p2 Z, O8 A" R0 T
- p = (b7 / b4) * 2;
B+ A. E [& e - x1 = (p >> 8) * (p >> 8);- o$ j& \- x( _3 o9 h
- x1 = (x1 * 3038) >> 16;
) U2 h, [5 M* H( `$ u' K# i - x2 = (-7357 * p) >> 16;1 T! I- c6 U x5 w, V6 `) R# T- j
- pressure = p + ((x1 + x2 + 3791) >> 4);
: L7 l+ ]3 i+ Z9 _5 d; Z; x9 I7 b - }
, `* P! Z+ ~- u3 F - //***************************
M/ n. d' W3 x# A: s" G0 u - void Init_ADXL345(void)
, G" B* r7 C" E0 E, j5 j( ~& Z0 P* p - {2 B2 F: a% c& _3 u" U6 l
- Single_Write(ADXL345_Addr,0x31,0x0B); //测量范围,正负16g,13位模式# M5 q3 Z9 ~: ~) Z
- // Single_Write(ADXL345_Addr,0x2C,0x0e); //速率设定为100hz 参考pdf13页
! J% z! X9 K0 d( k7 a ?7 H" } - Single_Write(ADXL345_Addr,0x2D,0x08); //选择电源模式 参考pdf24页7 G8 R, g0 L3 V2 C7 E7 S) f4 H- @
- Single_Write(ADXL345_Addr,0x2E,0x80); //使能 DATA_READY 中断
M6 D9 k2 `6 \ - // Single_Write(ADXL345_Addr,0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页. c7 O: T+ g7 S. a Q/ S) d
- // Single_Write(ADXL345_Addr,0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页2 }; i* I; O- e! p- q9 ?' q3 h
- // Single_Write(ADXL345_Addr,0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页
( H. x" b$ k- G - }; {2 [' e/ |9 B2 ^
- //****************************
4 h% n* B- @5 }5 E" V! q$ ]0 v - void Init_BMP085(void) E) K( M2 G2 k( w7 `
- {
% ^$ e4 R4 x. z) G5 W7 U+ b - ac1 = Single_Read(BMP085_Addr,0xAA);8 X8 {9 v1 u$ h( V; I* b' \
- ac1 = (ac1<<8)|Single_Read(BMP085_Addr,0xAB);
6 y8 m& \ [0 n9 S - ! x f+ y9 i* l- V+ Z8 u1 M7 ?
- ac2 = Single_Read(BMP085_Addr,0xAC);0 L4 A ~% @% I# x% I8 a/ W7 S
- ac2 = (ac2<<8)| Single_Read(BMP085_Addr,0xAD);
! N4 C9 |3 R. L3 ]# o
b' w9 I7 \6 n W7 D4 W; G- ac3 = Single_Read(BMP085_Addr,0xAE);+ \2 D$ t" \. g; c8 g$ T- d2 Q
- ac3 = (ac3<<8)| Single_Read(BMP085_Addr,0xAF);
' _* e4 ~* T% X$ D: q9 N1 p N8 X - , t# l) F1 c, F( u
- ac4 = Single_Read(BMP085_Addr,0xB0);
5 W, E4 j) S* O% T% k, R3 n - ac4 = (ac4<<8)| Single_Read(BMP085_Addr,0xB1);
, H" C! d# f) [$ I5 ^. Z3 ^ - : z7 V9 T7 O4 L8 \
- ac5 = Single_Read(BMP085_Addr,0xB2);3 f; W1 s3 k- y) K+ @
- ac5 = (ac5<<8)| Single_Read(BMP085_Addr,0xB3);" m! _( m- }1 D. c! }8 h
- % _" W9 s5 b( y! f* U/ D- g0 k
- ac6 = Single_Read(BMP085_Addr,0xB4);
' K) I0 s* p# E" s4 ^ - ac6 = (ac6<<8)| Single_Read(BMP085_Addr,0xB5);+ H; x1 z0 `$ Q& `+ G
9 E& I& K3 I* y8 K- b1 = Single_Read(BMP085_Addr,0xB6);
4 G, R. ?& ~% ^9 Q- C - b1 = (b1<<8)| Single_Read(BMP085_Addr,0xB7);! b) ~& r+ t3 c. |0 X
. |; g3 e3 B- Q- p7 |6 d- b2 = Single_Read(BMP085_Addr,0xB8);
8 t# Z2 z% A# p: }1 o - b2 = (b2<<8)| Single_Read(BMP085_Addr,0xB9);
% ^2 V' K6 x% j8 y3 Y! v - ' j7 T0 O" B- Y0 m3 h/ _
- mb = Single_Read(BMP085_Addr,0xBA);
& u" t8 k. ]6 W% [0 s$ {0 O - mb = (mb<<8)| Single_Read(BMP085_Addr,0xBB);7 n( a$ Y4 u$ t4 _) u1 `0 z& d
7 J# `' p9 f3 q0 x( z2 Q7 y- mc = Single_Read(BMP085_Addr,0xBC);& R4 L( Q! O% ^( {: B
- mc = (mc<<8)| Single_Read(BMP085_Addr,0xBD);
. ~$ O# k% N& [ m5 I
6 X2 ?/ a1 u) b3 H" ]- md = Single_Read(BMP085_Addr,0xBE);
. P2 o/ Y" s5 L2 N/ z - md = (md<<8)| Single_Read(BMP085_Addr,0xBF);1 o D& Z! Q# p( r& R! ]8 U4 ^
, ~. o( K+ y8 R2 i5 X- }
% ^* U( D9 s1 X8 X3 V - //****************************
2 Q; t# E1 x, J, H - void Init_HMC5883L(void)
l6 I' K/ m. O0 {" {# ^% C - {
3 n$ H) E* R+ R) E3 J/ Y4 v - Single_Write(HMC5883L_Addr,0x00,0x14); // ], @ C8 H$ h3 A- Z9 w8 h: H% @
- Single_Write(HMC5883L_Addr,0x02,0x00); //, i( A/ J+ n4 W+ T
- }
F% J1 @5 a [3 K" L) m - //*****************************************4 L3 r3 Y! E- r c, N2 p* k$ G
- . l! |' L$ F8 f) o, E& A# U
- //************初始化L3G4200D*********************************" y d+ k: `1 X/ b3 |! X1 H- J
- void Init_L3G4200D(void)* M* Y- U9 _+ G1 i6 Y; ]9 Q$ I0 A
- {0 O7 C5 N; l! B% Z
- Single_Write(L3G4200_Addr,CTRL_REG1, 0x0f);$ v5 E9 @7 U# u! r. U) y" x
- Single_Write(L3G4200_Addr,CTRL_REG2, 0x00);
# X$ `& W% A! S% Y - Single_Write(L3G4200_Addr,CTRL_REG3, 0x08);: C: `7 a N4 I; z/ r3 w
- Single_Write(L3G4200_Addr,CTRL_REG4, 0x30); //+-2000dps
5 h& y6 T1 C* F3 B, C - Single_Write(L3G4200_Addr,CTRL_REG5, 0x00);. D! S+ D& L3 B& A" z5 h1 E9 y
- }
/ w/ l" f0 T8 k/ l% f - //******读取L3G4200D数据****************************************) m4 a/ v% ?3 Y: f0 |
- void read_L3G4200D(void)
& Z! }. h3 m6 S7 p, R - {, Y0 X4 ^ e! P% t" L
- BUF[0]=Single_Read(L3G4200_Addr,OUT_X_L);
" u/ S' i8 f! _: j3 {' T0 m - BUF[1]=Single_Read(L3G4200_Addr,OUT_X_H);' J' s1 b- M' G7 \
- T_X= (BUF[1]<<8)|BUF[0];
. [: Q% f+ A) D; h6 _8 Q: F - 5 ~+ X& U0 d1 V/ X2 G6 J& E
' a' D# f! B3 w! ~
! j, T1 N& {: g- BUF[2]=Single_Read(L3G4200_Addr,OUT_Y_L);, D1 m2 n: U! Y1 |3 J- h/ e( p* D
- BUF[3]=Single_Read(L3G4200_Addr,OUT_Y_H);
0 u3 O9 M! H. p# M( l - T_Y= (BUF[3]<<8)|BUF[2];4 P) D; |3 Y9 b" N* n& e8 Q& n
- ! L" `0 s. x& e. H+ Z" v1 e
- , c8 `; H3 e5 L9 o- O
- BUF[4]=Single_Read(L3G4200_Addr,OUT_Z_L);
& Y* p V3 v7 @' q k - BUF[5]=Single_Read(L3G4200_Addr,OUT_Z_H);
# t( W- C; @" B; W$ a - T_Z= (BUF[5]<<8)|BUF[4];9 o `* ^4 r& o! T& T( u
/ W6 R* ]8 z0 L% H1 u+ x$ i- }
# o( c6 Q8 }% G! D6 y - % Y/ F1 B/ U2 i; ^) g# R( Q
- //******************ADXL345计算倾斜角度************2 M4 i. `- r2 J5 F
- void adxl345_angle(void)
/ R. U7 A' H) [* {0 ]! R - {5 J6 t- p1 e; i3 j) ]2 S
- 1 l& y$ ], {9 E% b% v
- data_xyz[0]=A_X; //合成数据 : N/ Y$ c0 V1 Z: w& k! ^; y
- data_xyz[1]=A_Y; //合成数据
. f9 V3 l! Z) o* |8 c( v1 T - data_xyz[2]=A_Z; //合成数据 2 c6 R2 O+ w! o G: U2 e
- 7 e7 O1 S( R" D$ W; d$ p6 @
- //分别是加速度X,Y,Z的原始数据,10位的
( o3 H G" F3 G$ _ t - Q=(float)data_xyz[0]*3.9;
' t9 t7 p6 E/ N& F2 e% Q8 b - T=(float)data_xyz[1]*3.9;
' W3 p8 s' H, [) i7 x T/ O - K=(float)data_xyz[2]*3.9;
+ i8 E. }3 C, B, n - Q=-Q; v' k6 w% O& x2 ^! M
- 5 t. y' Q; \" h0 c' u
- Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180); //X轴角度值5 E' Z4 y+ h \+ `
- Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180); //Y轴角度值, x* A( b9 I: D% o
- //conversion(Pitch); //需要显示时候请更换6 w' f8 {: N3 N' G$ d) u n
- conversion(Roll);
+ X/ z$ Y( q7 U4 y. W1 n - USART2_SendData(' '); - ^& c& C+ G0 Q. K
- USART2_SendData(' '); 8 l+ F! g/ A1 r2 J# t$ n/ b7 D
- USART2_SendData(bai);
% Q3 N/ E3 U9 U% `" f- ^# H - USART2_SendData(shi); : I7 A) X% w+ H, [, s; ?
- USART2_SendData(ge);. f7 m8 v: C- l9 c2 B0 E8 Y, w
- }
" _; ]4 P6 y8 L7 e& N
1 [/ I9 L% g+ Y& C/ c, E- int main(void)+ c- P- L2 v4 `3 P1 y) w& C' n
- {/ a# P- I5 s! m x
- DEBUG_USART_Config();+ L$ L! [# j9 R6 [( y9 y" j* v$ b
- Init_HMC5883L(); l: M& k& r# A
- Init_ADXL345();8 Q: i8 d' h' [! B
- Init_BMP085();2 [1 d# n6 l8 ^3 x- W- d
- Init_L3G4200D();
4 S" s2 k! W" I. R) |" U3 i1 J: i -
, ^: Z1 _5 k3 {( O2 U - while(1)- B- E' p% X& W+ @5 X6 d5 g" _
- {: `5 c0 H( Q W
- read_HMC5883L();# G; `4 D" e# b p1 }3 e
- Send_HMC5883L();. I ? a+ P8 E
- read_ADXL345();
6 i# ~1 F, K. ] - Send_ADXL345();# K, N) }5 a! {9 {) a0 A
- read_L3G4200D(); r" S# m R. \
- Send_L3G4200D();/ j3 D4 D ^! |* D
- read_BMP085(); ) M, Z" W3 n" F6 z7 m! o
- Send_BMP085();
5 _4 x1 T2 k) b0 ?! ^; g/ I4 D* B - Delayms(20);
8 x6 J# u* J0 U/ y+ l9 ~% d - }
6 C! |7 N+ f$ w& S5 d+ A - }
/ d/ {) D5 c, M: ~: F- L5 t - ///*************结束***************// L2 Z3 C. j! r, t: q8 J
- % 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 {
|