美文网首页
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