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

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

[复制链接]
zero99 发布时间:2016-6-16 17:18
     总的来说,STM32F429i这块板子上的外围器件并不算多,主要的就是VGA TFT,另外,还有就是USB、SDRAM、按键以及今天要体验的陀螺仪。
  J8 g8 A) w- b9 z6 `     MEMS是微机电系统的意思,这个东西可以说给我们的生活带来了很大的变化,就比如最常见的手机,现今的手机都离不开它,没有哪个智能手机敢不用它。
$ u& D$ a+ d9 E# t6 ^今天要介绍的陀螺仪在手机中也有他的身影,在手机中它一般用于拍照防抖功能,短时间的离线导航等。
0 m+ g, |0 z% k) ^     陀螺仪的作用可大了,小到你的手机,再到飞机、舰船,再到导弹、火箭,这些东西没一个离得开它,不对,有一个能不用,就是你的手机,除了你的手机没一个离得开它。
  D0 X6 _1 v5 S' F: {- @! J     板子上的陀螺仪芯片型号为L3GD20,搜了一下,这是ST自家的一款传感器。这款传感器有spi和i2c两种接口可用,我们看看它在板子上的电路图不难发现,他的两种接口我们都能用,但显然ST的意图是让我们用SPI接口。
8 [0 P" a" o" A8 q$ j 41.jpg $ h6 L, C* ~+ |1 V, ?
     看看他的庐山真面目:7 L( l, @3 u8 t4 {% u
42.jpg & O! P  t; e! `( b4 u
     在官方的例程里,有个简单的小例子,我们来看看:其名字为“MEMS_Example”。
  w( `& k) S/ }) j- b% c     关于这款芯片的手册在ST的官网及其他许多网站都有,大家可自行下载。8 j$ `/ a' P! i  C/ c  Y% X, a
   43.jpg
3 E1 D7 V0 c) k$ r" F& w     先大概浏览了一下程序,发现例程里边貌似只有两个轴的,先编译下载验证一下:# s& @* p; ]8 I" s3 `+ q
果然,程序少一个轴向的。8 t( N' u- D; r! B& q: g* J7 ]
程序大概意思就是,把板子往前滚,则显示向前的箭头;往后滚,则显示向下的箭头;往左滚,则显示向左的箭头;往右滚,则显示向右的箭头。
, D) J: i2 T; _# o3 T如下图:/ u$ k. v7 T  u! Q  u; B; N
44.jpg     45.jpg   
0 z# ~& a7 m4 e! h% V 46.jpg $ q& x$ C( y' N. _+ X) X/ K' d
47.jpg ( e7 L' w5 b- A  q# |
     然而板子在板子所在的平面旋转却无反应,所用陀螺仪分明是三轴的,可是程序却只用了其中的两轴,略微有点缺憾吧,于是我把第三轴方向加了上去,及Z轴。
# B! ~9 O$ c* F3 K7 Q0 j1 j     修改后,在原基础上,当板子绕板子顺时针和逆时针分别旋转时,用屏幕显示出来。如下图:6 X+ L# C( _/ _  B  i& C
48.jpg 3 Y' ~4 e$ y' j* }$ }  Q
51.jpg , s; j8 w" Y- {% F, i

$ I) f+ `# X3 |- B- }8 D2 ?; w下面是部分代码:
& }8 y' K9 A# Pif(Xval>Yval)* @# b8 X/ D- ^  F0 p" o
        {0 z+ ]% D* @$ D& n( q+ o  f, }
                if(Xval>Zval)
' ~3 Q+ G: i" B2 t# t& k! @9 @$ d                        max_of_xyz = 1;& v: v- j+ Z: j+ K" u
                else
: C+ i! z. Z3 b7 a: N) d; z                        max_of_xyz = 3;
% q' `+ E, S$ V3 W3 n& ?: i        }
3 u  g3 @6 z( t# f7 k% a4 T        else
0 C8 V0 q3 H! Y- e        {
) ^" s" k* V. d' h5 z% N/ Z' D                if(Yval>Zval)
* E" b7 E& r- ~& b                        max_of_xyz = 2;
* Y3 s- q1 z& |" Q1 {                else3 f/ ^. D' H6 v, j
                        max_of_xyz = 3;" y+ Q, K; o: I, w& ^" p
        }
" G0 h, [' z- T+ q        //max_of_xyz = 3;7 C! z  O) r  _) O' k4 ^$ C& Z
5 B% p2 e- V/ K5 V1 V- S- ^
        if(max_of_xyz==3)
: A6 {0 C3 z2 n6 V) p" B) L9 q& L        {
6 H3 M: a! X( T. r; }1 M                if ((int16_t)Buffer[2] > 40)3 o3 l6 u2 }! B. q; |
                {
% u' C" b8 Z' y, C                        LCD_Clear(LCD_COLOR_WHITE);( @* V0 c: k; z8 M- `" O
                        LCD_SetTextColor(LCD_COLOR_BLUE);1 o: B, O- T) F9 E7 b
                        //LCD_DrawFullRect(100, 40, 40, 120);
2 c- Y& z3 E! W$ d$ V5 d2 l" w/ w                        //LCD_FillTriangle(50, 190, 120, 160, 160, 310);1 j" v. G. |+ u# A8 S+ ]
                        LCD_DrawCircle(120, 160, 90);
9 {& b& ?* J6 E2 w$ M% ]' Q: l5 m                        LCD_DrawCircle(120, 160, 91);1 T7 `3 f7 O* d' g
                        LCD_DrawCircle(120, 160, 92);: j2 }5 [7 l1 p2 f
                        LCD_FillTriangle(120,105,105, 251,  241,  261);
9 d1 C, v6 y4 q                        Delay(50);/ t, h% l! ?8 _9 k: V! D
                }8 F, C* v% f7 \. P
                if ((int16_t)Buffer[2] < -40)5 `1 z; {  T% `7 e  @& V) H- P  \7 I: J
                {4 g' y2 a+ M( o5 S
                        LCD_Clear(LCD_COLOR_WHITE);5 v9 ^6 g# k" d: K
                        LCD_SetTextColor(LCD_COLOR_BLUE);
& U8 W6 p) ~; ~+ S# t4 h! l                        //LCD_DrawFullRect(100, 40, 40, 120);
! t( V3 B$ ~$ m) e$ U/ W9 U( {' i                        //LCD_FillTriangle(50, 190, 120, 160, 160, 310);
0 |8 W. g/ c% K( M' I2 e                        LCD_DrawCircle(120, 160, 90);
* T0 K+ Y( o7 t$ x* ^, @8 k                        LCD_DrawCircle(120, 160, 91);
" X7 ^  k! K! b( }9 K, q                        LCD_DrawCircle(120, 160, 92);1 Q$ e5 J) B/ H2 x1 ^
                        LCD_FillTriangle(120,135,135, 251,  241,  261);
$ f9 k$ K2 C; F- v& J; F: [, k                        Delay(50);
$ M, ~  t) w1 E# b                }: K. s" x& F$ Y. I0 u/ S5 i
        }6 n- l% b$ p# g9 i
        
/ z: @5 J2 T* f7 i, u  if (max_of_xyz == 1)
6 S/ @& j0 C! f* g/ i  {
! O/ v5 @2 ~' |/ o+ U2 V    if ((int16_t)Buffer[0] > 40)
( G6 c2 N: i* D    {
1 d* @6 t0 x. D: H& q* q+ \      /* Clear the LCD */; D& A9 T2 w5 Y5 P, w6 u, W
      LCD_Clear(LCD_COLOR_WHITE);
0 F$ m" b' [& q7 U3 M: {4 v      LCD_SetTextColor(LCD_COLOR_MAGENTA);9 L/ F- I3 ~4 ^; c' Y, z0 U3 X$ ?
      LCD_DrawFullRect(100, 40, 40, 120);
5 h0 t' V5 e+ K, D      LCD_FillTriangle(50, 190, 120, 160, 160, 310);
0 y! _* e5 k- @) l' r5 M( v0 X      Delay(50);! e- L  O( b4 G) r! e; V
    }/ P& n' i1 V! T
    if ((int16_t)Buffer[0] < -40)  {0 g8 M# o1 M: C) E( l7 N0 v) M% T
    {
$ @" U- ^  @* \( m: @% y      /* Clear the LCD */9 `# u4 h) J, ^: C' q, l4 h! k
      LCD_Clear(LCD_COLOR_WHITE);" I/ q7 w5 W/ K' ]
      LCD_SetTextColor(LCD_COLOR_RED);
* D: g1 N( P, K1 ]  }3 s' r      LCD_DrawFullRect(100, 160, 40, 120);8 j- ]! x- b0 H0 B' q2 k
      LCD_FillTriangle(50, 190, 120, 160, 160, 10);
) M" c, s7 Z+ Q" U      Delay(50);; @8 H  n9 l8 Z
    }& m4 R: k5 J6 E" b6 U/ ~% r+ ^: r! y
  }
' ]9 B+ j& I. V, [& o: ^  if(max_of_xyz == 2)
, {( v' ~0 b3 T6 P+ U  M  {
7 K8 k6 k( h4 T: r1 P! [  s    if ((int16_t)Buffer[1] < -40)
6 \4 V  U0 v2 B% p$ [. a% d    {
; Z  \1 ^# z+ S8 s( x      /* Clear the LCD */
6 @# A# ]  e$ I. O5 A. s( F      LCD_Clear(LCD_COLOR_WHITE);
* L% o' k: t+ M- n3 {      LCD_SetTextColor(LCD_COLOR_GREEN);
+ b  t4 N8 h& o* y  d6 i; L" H      LCD_DrawFullRect(120, 140, 100, 40);
8 @# j, n  i7 O$ ^6 ?  V      LCD_FillTriangle(120, 120, 5, 60, 260, 160);      ) j/ s) K& H, c; ?4 \1 p* Y5 r
      Delay(50);
0 p: G0 j6 Z0 S. x) y% D6 ]    }* e/ S  x1 R' L) g5 v( Q
    if ((int16_t)Buffer[1] > 40)
* y% }3 J( N5 Z5 `+ c/ b0 O( N    {      ) `) ?$ P) f& S9 p5 d6 H
      /* Clear the LCD */   G+ Y4 O* y0 n8 L. F* l" R) C( @
      LCD_Clear(LCD_COLOR_WHITE);) |4 v1 m7 S( b. x. y7 ~1 u$ a
      LCD_SetTextColor(LCD_COLOR_BLUE);
5 g4 Z/ E- x1 L3 L7 Z      LCD_DrawFullRect(20, 140, 100, 40);) W# C  u6 ?: ^: O1 `
      LCD_FillTriangle(120, 120, 235, 60, 260, 160);
1 D% q- {# {$ t" l1 s      Delay(50);
  b2 R! k3 P. y) {    }
; y% G0 v3 _: n' C. u0 w  } , X4 U5 {4 S+ h- f
}! z3 n, [4 c/ b" Z7 [6 W

- B$ V% |/ S: S/ s# ^( v为了尽量减少改动,没有switch case ,不知道用了效率会不会更好。
. i  [$ X, \- Z7 v% M0 w当然,陀螺仪的作用可远不止如此。  _5 i- u( b' e3 p! t

, r1 O; @: W$ x# C1 k
收藏 1 评论0 发布时间:2016-6-16 17:18

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版