• EC11使用原理简介以及LL库源码


    0积分源码链接
    EC11波形原理解析图:

    在这里插入图片描述

    上图总结起来简单来说就是两种情况
    一:当A下降沿触发之后,判断如果A=0;B=0;则为顺时针;如果A=0 ;B=1 则为逆时针
    二:当A上升沿触发之后,判断如果A=1;B=1;则为顺时针;如果A=1 ;B=0 则为逆时针

    接下来就很简单了,就是在外部中断函数中进行简单的if else判断:
    程序设计思路:

    1. 我用的PB6与PB7,我用PB6当做A端子,PB7当做B端子,把PB6配置为边沿触发,即(上升/下降沿均触发)

    在这里插入图片描述

    void MX_GPIO_Init(void)
    {
    
      LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
      LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */
      LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD);
      LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
      LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
    
      /**/
      LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTB, LL_GPIO_AF_EXTI_LINE6);
    
      /**/
      EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_6;
      EXTI_InitStruct.LineCommand = ENABLE;
      EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
      EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
      LL_EXTI_Init(&EXTI_InitStruct);
    
      /**/
      LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_6, LL_GPIO_MODE_FLOATING);
    
      /**/
      GPIO_InitStruct.Pin = LL_GPIO_PIN_7;
      GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
      LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
      /* EXTI interrupt init*/
      NVIC_SetPriority(EXTI9_5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),2, 2));
      NVIC_EnableIRQ(EXTI9_5_IRQn);
    
    }
    
    1. 然后在外部中断服务函数中进行简单的判断即可:
    /**
     1. @brief This function handles EXTI line[9:5] interrupts.
      */
    void EXTI9_5_IRQHandler(void)
    {
      /* USER CODE BEGIN EXTI9_5_IRQn 0 */
    
      /* USER CODE END EXTI9_5_IRQn 0 */
      if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_6) != RESET)
      {
        LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
        /* USER CODE BEGIN LL_EXTI_LINE_6 */
        if(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_7))
    		{
    			if(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_6))
    			{
    				printf("1-1 顺时针
    ");
    			}
    			else
    			{
    				printf("1-0 逆时针
    ");
    			}
    		}
    		else
    		{
    			if(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_6))
    			{
    				printf("0-1 逆时针
    ");
    			}
    			else
    			{
    				printf("0-0 顺时针
    ");
    			}
    		}
        /* USER CODE END LL_EXTI_LINE_6 */
      }
      /* USER CODE BEGIN EXTI9_5_IRQn 1 */
    
      /* USER CODE END EXTI9_5_IRQn 1 */
    }
    
    1. 但是现在旋转一次会触发两次,所以我用的时候把其中一种情况注释掉了,这样的
    void EXTI9_5_IRQHandler(void)
    {
      /* USER CODE BEGIN EXTI9_5_IRQn 0 */
    
      /* USER CODE END EXTI9_5_IRQn 0 */
      if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_6) != RESET)
      {
        LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
        /* USER CODE BEGIN LL_EXTI_LINE_6 */
    		/*
    		一:当A下降沿触发之后,判断如果A=0;B=0;则为顺时针;如果A=0 ;B=1 则为逆时针
    		二:当A上升沿触发之后,判断如果A=1;B=1;则为顺时针;如果A=1 ;B=0 则为逆时针
    		*/
        if(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_7))
    		{
    			if(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_6))
    			{
    				printf("1-1 顺时针
    ");
    			}
    			else
    			{
    				printf("1-0 逆时针
    ");
    			}
    		}
    //		else
    //		{
    //			if(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_6))
    //			{
    //				printf("0-1 逆时针
    ");
    //			}
    //			else
    //			{
    //				printf("0-0 顺时针
    ");
    //			}
    //		}
        /* USER CODE END LL_EXTI_LINE_6 */
      }
      /* USER CODE BEGIN EXTI9_5_IRQn 1 */
    
      /* USER CODE END EXTI9_5_IRQn 1 */
    }
    
  • 相关阅读:
    试题 历届试题 国王的烦恼
    试题 历届试题 九宫重排
    试题 历届试题 网络寻路
    试题 历届试题 危险系数
    试题 历届试题 横向打印二叉树
    试题 历届试题 幸运数
    试题 历届试题 大臣的旅费
    试题 历届试题 连号区间数
    Linux多进行之fork
    linux C语言getopt()函数的使用
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018356.html
Copyright © 2020-2023  润新知