2841|0

932

帖子

3

TA的资源

纯净的硅(中级)

楼主
 

基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之七LSM6DSO点击测试 [复制链接]

 

    今天继续进行LSM6DSO的点击测试,按照范例,启动单片机后,按动用户按钮,依次进入单击状态、双击状态和停止状态,在单击状态时,敲击开发板,程序能识别,在双击状态时必须双击开发板程序才能识别,在停止状态时不识别敲击。为了让测试更直观,我添加了一个变量来记录敲击次数,并显示在屏幕的右下角。切换状态时,计数值清零。

    下图为测试过程:

    这是进入等待用户按键状态的界面:

    按下用户按键,依次进入单击状态、双击状态和停止状态:

    下面是单击计数:

    下面是双击计数:

    下面是添加了LCD显示代码的函数:


/**
  * [url=home.php?mod=space&uid=159083]@brief[/url]  Process of the LSM6DSO Single and Double Tap Detection application
  * @retval None
  */
void MX_IKS01A3_LSM6DSO_SingleDoubleTap_Process(void)
{
  IKS01A3_MOTION_SENSOR_Event_Status_t status;

  if (PushButtonDetected != 0U)
  {
    /* Debouncing */
    HAL_Delay(50);

    /* Wait until the button is released */
    while ((BSP_PB_GetState( BUTTON_KEY ) == PushButtonState));

    /* Debouncing */
    HAL_Delay(50);

    /* Reset Interrupt flag */
    PushButtonDetected = 0;

    /* Enable/Disable single and double tap detection */
    if (mode == MODE_DEFAULT)
    {
      SingleTapModeRequest = 1;
        LCD_clear_line(5);
		LCD_write_BG(0,4,(uint8_t *)"现在可以单击");
		count = 0;
    }
    else if (mode == MODE_SINGLE_TAP)
    {
      DoubleTapModeRequest = 1;
		LCD_clear_line(5);
		LCD_write_BG(0,4,(uint8_t *)"现在可以双击");
        count = 0;
    }
    else
    {
      DefaultModeRequest = 1;
		LCD_clear_line(5);
		LCD_write_BG(0,4,(uint8_t *)"停止接收点击");
        count = 0;
    }
  }

  if (MemsEventDetected != 0U)
  {
    MemsEventDetected = 0;

    if (mode == MODE_SINGLE_TAP)
    {
      if (IKS01A3_MOTION_SENSOR_Get_Event_Status(IKS01A3_LSM6DSO_0, &status) != BSP_ERROR_NONE)
      {
        Error_Handler();
      }
      LCD_write_BG(0,4,(uint8_t *)"收到单击信号");
	  count++;
	  LCD_write_value(72,5,2,0,0,count);
	  
      if (status.TapStatus != 0U)
      {
        BSP_LED_On(LED2);
        HAL_Delay(SINGLE_TAP_INDICATION_DELAY);
        BSP_LED_Off(LED2);
        HAL_Delay(INDICATION_WAIT_DELAY);
      }
    }
    else if (mode == MODE_DOUBLE_TAP)
    {
      if (IKS01A3_MOTION_SENSOR_Get_Event_Status(IKS01A3_LSM6DSO_0, &status) != BSP_ERROR_NONE)
      {
        Error_Handler();
      }
      LCD_write_BG(0,4,(uint8_t *)"收到双击信号");
 	  count++;
	  LCD_write_value(72,5,2,0,0,count);
	  
      if (status.DoubleTapStatus != 0U)
      {
        BSP_LED_On(LED2);
        HAL_Delay(DOUBLE_TAP_INDICATION_DELAY);
        BSP_LED_Off(LED2);
        HAL_Delay(INDICATION_WAIT_DELAY);
        BSP_LED_On(LED2);
        HAL_Delay(DOUBLE_TAP_INDICATION_DELAY);
        BSP_LED_Off(LED2);
        HAL_Delay(INDICATION_WAIT_DELAY);
      }
    }
    else
    {
      /* Do nothing */
    }
  }

  if (SingleTapModeRequest != 0U)
  {
    if (IKS01A3_MOTION_SENSOR_Enable_Single_Tap_Detection(IKS01A3_LSM6DSO_0, IKS01A3_MOTION_SENSOR_INT1_PIN) != BSP_ERROR_NONE)
    {
      Error_Handler();
    }

    mode = MODE_SINGLE_TAP;
    SingleTapModeRequest = 0;
  }

  if (DoubleTapModeRequest != 0U)
  {
    if (IKS01A3_MOTION_SENSOR_Disable_Single_Tap_Detection(IKS01A3_LSM6DSO_0) != BSP_ERROR_NONE)
    {
      Error_Handler();
    }

    if (IKS01A3_MOTION_SENSOR_Enable_Double_Tap_Detection(IKS01A3_LSM6DSO_0, IKS01A3_MOTION_SENSOR_INT1_PIN) != BSP_ERROR_NONE)
    {
      Error_Handler();
    }

    mode = MODE_DOUBLE_TAP;
    DoubleTapModeRequest = 0;
  }

  if (DefaultModeRequest != 0U)
  {
    if (IKS01A3_MOTION_SENSOR_Disable_Double_Tap_Detection(IKS01A3_LSM6DSO_0) != BSP_ERROR_NONE)
    {
      Error_Handler();
    }

    mode = MODE_DEFAULT;
    DefaultModeRequest = 0;
  }
}




此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处
 

点赞 关注
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表