2942|0

9790

帖子

24

TA的资源

版主

楼主
 

LSM6DSL 6D位置检测 STM32L4R5 [复制链接]

 使用STMems_Standard_C_drivers库
程序参考了STM32CubeExpansion MEMS-XT1的LSM6DSL_6DOrientation
STMems_Standard_C_drivers库中没找到操读取LSM6DSL_D6D_SRC(0x1D)寄存器的函数
自己添加了下边这个
  1. int32_t lsm6dsl_d6d_orientation_get(lsm6dsl_ctx_t *ctx,
  2.                                    lsm6dsl_d6d_orientation_t *val)
  3. {
  4.   
  5.   lsm6dsl_reg_t reg;
  6.   int32_t ret;
  7.   ret = lsm6dsl_read_reg(ctx, LSM6DSL_D6D_SRC,
  8.                            ®.byte, 1);
  9.   if(ret == 0){
  10.     val->xl = reg.d6d_src.xl;
  11.     val->xh = reg.d6d_src.xh;
  12.     val->yl = reg.d6d_src.yl;
  13.     val->yh = reg.d6d_src.yh;
  14.     val->zl = reg.d6d_src.zl;
  15.     val->zh = reg.d6d_src.zh;
  16.   }
  17.   return ret;
  18. }
复制代码

配置好Output Data Rate、full scale后通过lsm6dsl_pin_int1_route_set(&dev_ctx,lsm6dsl_int1_route);函数使能6D中断
设置阈值为60度lsm6dsl_6d_threshold_set(&dev_ctx, LSM6DSL_DEG_60);
循环检测INT1中断,有中断时读取LSM6DSL_D6D_SRC寄存器lsm6dsl_d6d_orientation_get(&dev_ctx,&lsm6dsl_d6d_orientation);
再将位置通过串口输出
  1. /**
  2. * @brief  Send actual 6D orientation to UART
  3. * @param  None
  4. * @retval None
  5. */
  6. static void lsm6dsl_6d_send_orientation(void)
  7. {  
  8.   lsm6dsl_d6d_orientation_t lsm6dsl_d6d_orientation;
  9.   lsm6dsl_d6d_orientation_get(&dev_ctx,&lsm6dsl_d6d_orientation);
  10.   if (lsm6dsl_d6d_orientation.xl == 0 && lsm6dsl_d6d_orientation.yl == 0 && lsm6dsl_d6d_orientation.zl == 0 && lsm6dsl_d6d_orientation.xh == 0 && lsm6dsl_d6d_orientation.yh == 1 && lsm6dsl_d6d_orientation.zh == 0)
  11.   {
  12.     snprintf(data_out, MAX_BUF_SIZE, "\r\n  ________________  " \
  13.              "\r\n |                | " \
  14.              "\r\n |  *             | " \
  15.              "\r\n |                | " \
  16.              "\r\n |                | " \
  17.              "\r\n |                | " \
  18.              "\r\n |                | " \
  19.              "\r\n |________________| \r\n");
  20.   }

  21.   else if (lsm6dsl_d6d_orientation.xl == 1 && lsm6dsl_d6d_orientation.yl == 0 && lsm6dsl_d6d_orientation.zl == 0 && lsm6dsl_d6d_orientation.xh == 0 && lsm6dsl_d6d_orientation.yh == 0 && lsm6dsl_d6d_orientation.zh == 0)
  22.   {
  23.     snprintf(data_out, MAX_BUF_SIZE, "\r\n  ________________  " \
  24.              "\r\n |                | " \
  25.              "\r\n |             *  | " \
  26.              "\r\n |                | " \
  27.              "\r\n |                | " \
  28.              "\r\n |                | " \
  29.              "\r\n |                | " \
  30.              "\r\n |________________| \r\n");
  31.   }

  32.   else if (lsm6dsl_d6d_orientation.xl == 0 && lsm6dsl_d6d_orientation.yl == 0 && lsm6dsl_d6d_orientation.zl == 0 && lsm6dsl_d6d_orientation.xh == 1 && lsm6dsl_d6d_orientation.yh == 0 && lsm6dsl_d6d_orientation.zh == 0)
  33.   {
  34.     snprintf(data_out, MAX_BUF_SIZE, "\r\n  ________________  " \
  35.              "\r\n |                | " \
  36.              "\r\n |                | " \
  37.              "\r\n |                | " \
  38.              "\r\n |                | " \
  39.              "\r\n |                | " \
  40.              "\r\n |  *             | " \
  41.              "\r\n |________________| \r\n");
  42.   }

  43.   else if (lsm6dsl_d6d_orientation.xl == 0 && lsm6dsl_d6d_orientation.yl == 1 && lsm6dsl_d6d_orientation.zl == 0 && lsm6dsl_d6d_orientation.xh == 0 && lsm6dsl_d6d_orientation.yh == 0 && lsm6dsl_d6d_orientation.zh == 0)
  44.   {
  45.     snprintf(data_out, MAX_BUF_SIZE, "\r\n  ________________  " \
  46.              "\r\n |                | " \
  47.              "\r\n |                | " \
  48.              "\r\n |                | " \
  49.              "\r\n |                | " \
  50.              "\r\n |                | " \
  51.              "\r\n |             *  | " \
  52.              "\r\n |________________| \r\n");
  53.   }

  54.   else if (lsm6dsl_d6d_orientation.xl == 0 && lsm6dsl_d6d_orientation.yl == 0 && lsm6dsl_d6d_orientation.zl == 0 && lsm6dsl_d6d_orientation.xh == 0 && lsm6dsl_d6d_orientation.yh == 0 && lsm6dsl_d6d_orientation.zh == 1)
  55.   {
  56.     snprintf(data_out, MAX_BUF_SIZE, "\r\n  __*_____________  " \
  57.              "\r\n |________________| \r\n");
  58.   }

  59.   else if (lsm6dsl_d6d_orientation.xl == 0 && lsm6dsl_d6d_orientation.yl == 0 && lsm6dsl_d6d_orientation.zl == 1 && lsm6dsl_d6d_orientation.xh == 0 && lsm6dsl_d6d_orientation.yh == 0 && lsm6dsl_d6d_orientation.zh == 0)
  60.   {
  61.     snprintf(data_out, MAX_BUF_SIZE, "\r\n  ________________  " \
  62.              "\r\n |________________| " \
  63.              "\r\n    *               \r\n");
  64.   }

  65.   else
  66.   {
  67.     snprintf(data_out, MAX_BUF_SIZE, "None of the 6D orientation axes is set in LSM6DSL - accelerometer.\r\n");
  68.   }

  69.   tx_com((uint8_t*)data_out, strlen(data_out));
  70. }
  71. void lsm6dsl_6d_orientation(void)
  72. {  
  73.   /*
  74.    *  Initialize mems driver interface
  75.    */
  76.   dev_ctx.write_reg = platform_write;
  77.   dev_ctx.read_reg = platform_read;
  78.   dev_ctx.handle = &hi2c1;  

  79.   /*
  80.    *  Check device ID
  81.    */
  82.   whoamI = 0;
  83.   lsm6dsl_device_id_get(&dev_ctx, &whoamI);
  84.   if ( whoamI != LSM6DSL_ID )
  85.     while(1); /*manage here device not found */
  86.   /*
  87.    *  Restore default configuration
  88.    */
  89.   lsm6dsl_reset_set(&dev_ctx, PROPERTY_ENABLE);
  90.   do {
  91.     lsm6dsl_reset_get(&dev_ctx, &rst);
  92.   } while (rst);
  93.   /*
  94.    *  Enable Block Data Update
  95.    */
  96.   lsm6dsl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
  97.   /*
  98.    * Set Output Data Rate
  99.    */
  100.   lsm6dsl_xl_data_rate_set(&dev_ctx, LSM6DSL_XL_ODR_416Hz);
  101.   /*
  102.    * Set full scale
  103.    */  
  104.   lsm6dsl_xl_full_scale_set(&dev_ctx, LSM6DSL_2g);
  105.   /*
  106.    * 中断
  107.    */  
  108.   lsm6dsl_int1_route_t lsm6dsl_int1_route;
  109.   lsm6dsl_int1_route.int1_6d = 1;
  110.   lsm6dsl_pin_int1_route_set(&dev_ctx,lsm6dsl_int1_route);
  111.   /*
  112.    * 6d
  113.    */  
  114.   lsm6dsl_6d_threshold_set(&dev_ctx, LSM6DSL_DEG_60);
  115.   while(1)
  116.   {
  117.     if(int1_flag == 1)
  118.     {
  119.       int1_flag = 0;
  120.       lsm6dsl_6d_send_orientation();
  121.     }
  122.   }
  123. }
复制代码




工程文件:
stm32l4r5 6d_orientation.rar (16 MB, 下载次数: 35)



点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表