EC11使用原理简介以及LL库源码
0积分源码链接
EC11波形原理解析图:
上图总结起来简单来说就是两种情况
一:当A下降沿触发之后,判断如果A=0;B=0;则为顺时针;如果A=0 ;B=1 则为逆时针
二:当A上升沿触发之后,判断如果A=1;B=1;则为顺时针;如果A=1 ;B=0 则为逆时针
接下来就很简单了,就是在外部中断函数中进行简单的if else判断:
程序设计思路:
- 我用的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. @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 */
}
- 但是现在旋转一次会触发两次,所以我用的时候把其中一种情况注释掉了,这样的
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 */
}