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

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

[复制链接]
zero99 发布时间:2016-6-16 17:18
     总的来说,STM32F429i这块板子上的外围器件并不算多,主要的就是VGA TFT,另外,还有就是USB、SDRAM、按键以及今天要体验的陀螺仪。
     MEMS是微机电系统的意思,这个东西可以说给我们的生活带来了很大的变化,就比如最常见的手机,现今的手机都离不开它,没有哪个智能手机敢不用它。
今天要介绍的陀螺仪在手机中也有他的身影,在手机中它一般用于拍照防抖功能,短时间的离线导航等。
     陀螺仪的作用可大了,小到你的手机,再到飞机、舰船,再到导弹、火箭,这些东西没一个离得开它,不对,有一个能不用,就是你的手机,除了你的手机没一个离得开它。
     板子上的陀螺仪芯片型号为L3GD20,搜了一下,这是ST自家的一款传感器。这款传感器有spi和i2c两种接口可用,我们看看它在板子上的电路图不难发现,他的两种接口我们都能用,但显然ST的意图是让我们用SPI接口。
41.jpg
     看看他的庐山真面目:
42.jpg
     在官方的例程里,有个简单的小例子,我们来看看:其名字为“MEMS_Example”。
     关于这款芯片的手册在ST的官网及其他许多网站都有,大家可自行下载。
   43.jpg
     先大概浏览了一下程序,发现例程里边貌似只有两个轴的,先编译下载验证一下:
果然,程序少一个轴向的。
程序大概意思就是,把板子往前滚,则显示向前的箭头;往后滚,则显示向下的箭头;往左滚,则显示向左的箭头;往右滚,则显示向右的箭头。
如下图:
44.jpg     45.jpg   
46.jpg
47.jpg
     然而板子在板子所在的平面旋转却无反应,所用陀螺仪分明是三轴的,可是程序却只用了其中的两轴,略微有点缺憾吧,于是我把第三轴方向加了上去,及Z轴。
     修改后,在原基础上,当板子绕板子顺时针和逆时针分别旋转时,用屏幕显示出来。如下图:
48.jpg
51.jpg

下面是部分代码:
if(Xval>Yval)
        {
                if(Xval>Zval)
                        max_of_xyz = 1;
                else
                        max_of_xyz = 3;
        }
        else
        {
                if(Yval>Zval)
                        max_of_xyz = 2;
                else
                        max_of_xyz = 3;
        }
        //max_of_xyz = 3;

        if(max_of_xyz==3)
        {
                if ((int16_t)Buffer[2] > 40)
                {
                        LCD_Clear(LCD_COLOR_WHITE);
                        LCD_SetTextColor(LCD_COLOR_BLUE);
                        //LCD_DrawFullRect(100, 40, 40, 120);
                        //LCD_FillTriangle(50, 190, 120, 160, 160, 310);
                        LCD_DrawCircle(120, 160, 90);
                        LCD_DrawCircle(120, 160, 91);
                        LCD_DrawCircle(120, 160, 92);
                        LCD_FillTriangle(120,105,105, 251,  241,  261);
                        Delay(50);
                }
                if ((int16_t)Buffer[2] < -40)
                {
                        LCD_Clear(LCD_COLOR_WHITE);
                        LCD_SetTextColor(LCD_COLOR_BLUE);
                        //LCD_DrawFullRect(100, 40, 40, 120);
                        //LCD_FillTriangle(50, 190, 120, 160, 160, 310);
                        LCD_DrawCircle(120, 160, 90);
                        LCD_DrawCircle(120, 160, 91);
                        LCD_DrawCircle(120, 160, 92);
                        LCD_FillTriangle(120,135,135, 251,  241,  261);
                        Delay(50);
                }
        }
        
  if (max_of_xyz == 1)
  {
    if ((int16_t)Buffer[0] > 40)
    {
      /* Clear the LCD */
      LCD_Clear(LCD_COLOR_WHITE);
      LCD_SetTextColor(LCD_COLOR_MAGENTA);
      LCD_DrawFullRect(100, 40, 40, 120);
      LCD_FillTriangle(50, 190, 120, 160, 160, 310);
      Delay(50);
    }
    if ((int16_t)Buffer[0] < -40)
    {
      /* Clear the LCD */
      LCD_Clear(LCD_COLOR_WHITE);
      LCD_SetTextColor(LCD_COLOR_RED);
      LCD_DrawFullRect(100, 160, 40, 120);
      LCD_FillTriangle(50, 190, 120, 160, 160, 10);
      Delay(50);
    }
  }
  if(max_of_xyz == 2)
  {
    if ((int16_t)Buffer[1] < -40)
    {
      /* Clear the LCD */
      LCD_Clear(LCD_COLOR_WHITE);
      LCD_SetTextColor(LCD_COLOR_GREEN);
      LCD_DrawFullRect(120, 140, 100, 40);
      LCD_FillTriangle(120, 120, 5, 60, 260, 160);      
      Delay(50);
    }
    if ((int16_t)Buffer[1] > 40)
    {      
      /* Clear the LCD */
      LCD_Clear(LCD_COLOR_WHITE);
      LCD_SetTextColor(LCD_COLOR_BLUE);
      LCD_DrawFullRect(20, 140, 100, 40);
      LCD_FillTriangle(120, 120, 235, 60, 260, 160);
      Delay(50);
    }
  }
}

为了尽量减少改动,没有switch case ,不知道用了效率会不会更好。
当然,陀螺仪的作用可远不止如此。

收藏 1 评论0 发布时间:2016-6-16 17:18

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版