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

基于STM32F4开发板的MEMS三轴陀螺仪的方案

[复制链接]
zero99 发布时间:2016-6-16 17:18
     总的来说,STM32F429i这块板子上的外围器件并不算多,主要的就是VGA TFT,另外,还有就是USB、SDRAM、按键以及今天要体验的陀螺仪。5 E. {; N* M  @
     MEMS是微机电系统的意思,这个东西可以说给我们的生活带来了很大的变化,就比如最常见的手机,现今的手机都离不开它,没有哪个智能手机敢不用它。
6 b, b8 h6 u; D9 q- R' n9 z6 K: K今天要介绍的陀螺仪在手机中也有他的身影,在手机中它一般用于拍照防抖功能,短时间的离线导航等。0 {: X9 R' l* R6 {
     陀螺仪的作用可大了,小到你的手机,再到飞机、舰船,再到导弹、火箭,这些东西没一个离得开它,不对,有一个能不用,就是你的手机,除了你的手机没一个离得开它。, p9 r, x( H$ m0 ^4 {3 N5 ~; O
     板子上的陀螺仪芯片型号为L3GD20,搜了一下,这是ST自家的一款传感器。这款传感器有spi和i2c两种接口可用,我们看看它在板子上的电路图不难发现,他的两种接口我们都能用,但显然ST的意图是让我们用SPI接口。
- X& q6 V  U7 n( Q- I; a 41.jpg
6 h0 w6 g9 N% `1 r! n- N     看看他的庐山真面目:
$ m; T, u* Q3 W8 a3 W1 Z 42.jpg 9 i. W# V) s3 n. Y
     在官方的例程里,有个简单的小例子,我们来看看:其名字为“MEMS_Example”。% K. r& o% t5 U0 O6 @
     关于这款芯片的手册在ST的官网及其他许多网站都有,大家可自行下载。4 M$ X% k! }8 {
   43.jpg / E) j9 p- q+ a
     先大概浏览了一下程序,发现例程里边貌似只有两个轴的,先编译下载验证一下:1 [6 b9 b/ O3 s: I7 g9 {+ U
果然,程序少一个轴向的。
7 p: @9 e4 ?# T; r& Z程序大概意思就是,把板子往前滚,则显示向前的箭头;往后滚,则显示向下的箭头;往左滚,则显示向左的箭头;往右滚,则显示向右的箭头。# T: a  D' r7 S
如下图:
: @* h. q" ]3 k! J 44.jpg     45.jpg   
( |" x6 D$ `$ Z7 _4 d9 p% C3 E: `0 {# [ 46.jpg # f0 f1 u0 ^' ]2 N9 }; I5 r
47.jpg
$ t2 r' k) s# x" P) P: O% U     然而板子在板子所在的平面旋转却无反应,所用陀螺仪分明是三轴的,可是程序却只用了其中的两轴,略微有点缺憾吧,于是我把第三轴方向加了上去,及Z轴。
/ R& [6 X  `" b     修改后,在原基础上,当板子绕板子顺时针和逆时针分别旋转时,用屏幕显示出来。如下图:
; i: W# `5 L9 V6 v+ j 48.jpg
+ R; c. z" e/ J) P 51.jpg 0 _; Y! Z, f* T$ }  c7 _
! ]. Z" {1 P% {* t
下面是部分代码:
' H9 d! P1 N' b) @if(Xval>Yval)! M  E, C. t1 j9 @% N! D2 J. |, l
        {' A4 j0 E+ w9 U- H- J# p
                if(Xval>Zval)
; Q5 {# j- t  O6 F                        max_of_xyz = 1;4 C/ ^8 i. d, p7 q# u
                else/ u3 {/ Z9 @. A4 ]( O8 [
                        max_of_xyz = 3;) L  b; f! S- {: U* L# e& l
        }
  P) ?# Y* S# |0 p6 p4 a+ o- P1 w5 a        else
; G9 c/ X% B* p, q/ r        {
" p2 P6 _: B" S! W4 f                if(Yval>Zval): [5 s. m" q2 h/ `. ?# a
                        max_of_xyz = 2;4 Q, l/ g' N: k  ?9 t
                else
$ j( A7 w8 Z, N                        max_of_xyz = 3;
; U  e! B+ G# o2 p  S  L        }" ?* Y$ M9 M+ x; ^2 |, S
        //max_of_xyz = 3;
  u) u7 h- G: m
' w9 b% A4 x! d# I. c% x        if(max_of_xyz==3)+ y, }2 n  N4 E9 G* p$ W" K
        {: Z/ X% E% C# s6 ?9 w
                if ((int16_t)Buffer[2] > 40)
; r& n$ ~2 u3 s' a# t0 C% J                {7 w: X4 u/ T0 d$ `3 \9 ^
                        LCD_Clear(LCD_COLOR_WHITE);$ [+ H; u- b5 X! B: j1 H  y8 Y
                        LCD_SetTextColor(LCD_COLOR_BLUE);4 f% h0 @3 p1 q$ k( o
                        //LCD_DrawFullRect(100, 40, 40, 120);
9 _7 \  ^) p5 |* D                        //LCD_FillTriangle(50, 190, 120, 160, 160, 310);  j: f  W2 e& N+ M5 o: m2 O4 G
                        LCD_DrawCircle(120, 160, 90);' D( x/ P4 i" \2 F% n
                        LCD_DrawCircle(120, 160, 91);
. r5 H* @% w6 O3 U8 B                        LCD_DrawCircle(120, 160, 92);
$ B& B1 e4 \/ z; L' K% H- @                        LCD_FillTriangle(120,105,105, 251,  241,  261);
' f# {+ s( I1 f( h$ C) _  i* c                        Delay(50);
, y  G# e. U7 R. B, z+ J$ l                }$ {6 M  z& F3 w6 o
                if ((int16_t)Buffer[2] < -40)
7 X# a# D1 [9 l* Z2 H) G                {6 e( c# a  u4 c4 s4 u
                        LCD_Clear(LCD_COLOR_WHITE);+ K: C2 O. J. G9 }! z) Z  o
                        LCD_SetTextColor(LCD_COLOR_BLUE);2 {( w: w# o2 d+ E7 }
                        //LCD_DrawFullRect(100, 40, 40, 120);8 E- W6 L1 S# D, o# T* O. W
                        //LCD_FillTriangle(50, 190, 120, 160, 160, 310);
4 d) M9 P) v& y, x' H                        LCD_DrawCircle(120, 160, 90);. D2 q* [% q" J8 A  u
                        LCD_DrawCircle(120, 160, 91);
: J8 f- k; N# w( b8 }) x5 d# m1 ^                        LCD_DrawCircle(120, 160, 92);
; t, [6 P4 @+ f# ]1 S' J0 j                        LCD_FillTriangle(120,135,135, 251,  241,  261);; U" J9 J; m% d; h8 h1 {
                        Delay(50);
  _2 p# c" X+ n6 C/ q                }
, Z- `. A, H5 i6 Z' Z$ a        }
: G. l2 z) X1 P9 u" W- T/ b7 n        
) q1 F+ h( x- V' k  if (max_of_xyz == 1)
% C9 U# k% J) }1 [( i: }+ k, w  {* z4 L$ D6 o5 H' H
    if ((int16_t)Buffer[0] > 40)$ s# m" x/ I. T; T, _
    {
0 z1 U3 G/ K' u  x  a& [      /* Clear the LCD */
. m' V: w! n& k- o- c6 }      LCD_Clear(LCD_COLOR_WHITE);" M6 U) U0 ]3 j
      LCD_SetTextColor(LCD_COLOR_MAGENTA);5 T$ d2 J1 }  E# j/ M! E
      LCD_DrawFullRect(100, 40, 40, 120);
( x& |& T( t5 X$ x8 Q8 D      LCD_FillTriangle(50, 190, 120, 160, 160, 310);  V& Q" W8 {8 G% B, d: ^
      Delay(50);9 ?8 L. j2 K' _8 k
    }
. x7 U8 e8 t* k    if ((int16_t)Buffer[0] < -40)
* S2 M  m: h7 c6 ?' t5 {8 C* I7 g    {& y' V7 g) u$ z
      /* Clear the LCD */
9 F* j" V0 j4 }, J* o: H* Z      LCD_Clear(LCD_COLOR_WHITE);
7 h( n# n, e! c3 N5 |: ]      LCD_SetTextColor(LCD_COLOR_RED);
$ |/ y, u+ n" s6 q4 f$ i      LCD_DrawFullRect(100, 160, 40, 120);
# w; Q) x9 M/ R8 g      LCD_FillTriangle(50, 190, 120, 160, 160, 10);
7 X, j- w/ E4 w$ v$ i1 d# X' f      Delay(50);3 Q6 Z  M" s9 F- Z+ u& ?$ w
    }! J1 f8 I# T3 j' G' p# W$ _- W
  }
6 ]1 B, S) Z* i" u( x! {5 u# D% t: K  if(max_of_xyz == 2)  q) W+ x' R  [" C& f# J$ L
  {
5 N+ Y  g% \! \    if ((int16_t)Buffer[1] < -40)  q$ o) v: i+ q
    {
; g+ T% G# T8 `/ B8 p7 |# _/ ^      /* Clear the LCD */. N+ ^" D- R) w1 L- u) D" n
      LCD_Clear(LCD_COLOR_WHITE);7 d  j3 \8 D- g+ ?2 M9 S. t
      LCD_SetTextColor(LCD_COLOR_GREEN);
% a0 [. K9 l2 G' H3 w      LCD_DrawFullRect(120, 140, 100, 40);/ g0 O. ~& p) X
      LCD_FillTriangle(120, 120, 5, 60, 260, 160);      5 }8 J3 A$ I0 T$ X
      Delay(50);# @+ w! D: R; {- @( n2 H( W5 L
    }/ ?2 g. r% b& p0 O! u1 j7 i
    if ((int16_t)Buffer[1] > 40)* s% F; X3 Z5 o, a
    {      $ h; T$ M( R# y* F
      /* Clear the LCD */ ) S5 ^# X4 M# m1 E2 p) F3 d+ |( _
      LCD_Clear(LCD_COLOR_WHITE);
+ X9 j% p: O( t# u  }1 c- E+ f5 m      LCD_SetTextColor(LCD_COLOR_BLUE);
+ C( @1 n6 b3 w7 K5 ~8 r; D      LCD_DrawFullRect(20, 140, 100, 40);8 {2 E! G4 C# S: I! m- b  ^
      LCD_FillTriangle(120, 120, 235, 60, 260, 160);' i3 \& R) Z  F6 R" T
      Delay(50);+ F! o4 S! q( Y6 I
    } ; e  o3 {& ]6 w, O/ I5 |
  } : `& }0 C( j0 n( t! N: L5 z9 Z
}& w' c  J4 |. i: c7 R5 u

3 q, }% o5 n# g  _# T! Y/ r为了尽量减少改动,没有switch case ,不知道用了效率会不会更好。
- q. V# z' l* j% C( p3 U# G1 M当然,陀螺仪的作用可远不止如此。
, w+ d9 a( s8 r
* W9 F8 c, E& B6 c5 F8 Y* B' e
赞 收藏 1 评论0 发布时间:2016-6-16 17:18

举报

0个回答

所属标签

相似技术帖

官网相关资源

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