美文网首页
EC11使用原理简介以及LL库源码

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

作者: 火红色祥云 | 来源:发表于2020-11-22 09:46 被阅读0次

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

    image.png

    上图总结起来简单来说就是两种情况
    一:当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配置为边沿触发,即(上升/下降沿均触发)


      image.png
    在这里插入图片描述
    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 顺时针\r\n");
                }
                else
                {
                    printf("1-0 逆时针\r\n");
                }
            }
            else
            {
                if(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_6))
                {
                    printf("0-1 逆时针\r\n");
                }
                else
                {
                    printf("0-0 顺时针\r\n");
                }
            }
        /* 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 顺时针\r\n");
                }
                else
                {
                    printf("1-0 逆时针\r\n");
                }
            }
    //      else
    //      {
    //          if(LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_6))
    //          {
    //              printf("0-1 逆时针\r\n");
    //          }
    //          else
    //          {
    //              printf("0-0 顺时针\r\n");
    //          }
    //      }
        /* USER CODE END LL_EXTI_LINE_6 */
      }
      /* USER CODE BEGIN EXTI9_5_IRQn 1 */
    
      /* USER CODE END EXTI9_5_IRQn 1 */
    }
    

    相关文章

      网友评论

          本文标题:EC11使用原理简介以及LL库源码

          本文链接:https://www.haomeiwen.com/subject/upreiktx.html