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 顺时针\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 */
}
posted @ 2020-11-15 11:28  火红色祥云  阅读(155)  评论(0编辑  收藏  举报