旋转编码器中断方式实现计数
旋转编码器正转两路信号相位关系
旋转编码器反转两路信号相位关系
↓↓↓↓利用中断方式实现编码器计数↓↓↓↓↓
int32_t EncoderNum=0;
/*初始化PA0,PA1,PA4,打开EXTI中断*/
void Encoder_GPIO_Init(void )
{
/*PA0=S1,PA1=S2,PA4=KEY*/
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_Init_Struct;
GPIO_Init_Struct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4;
GPIO_Init_Struct.Mode = GPIO_MODE_IT_FALLING;
GPIO_Init_Struct.Pull = GPIO_NOPULL;
GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOA,&GPIO_Init_Struct);
/*设置中断优先级,并使能中断*/
HAL_NVIC_SetPriority(EXTI0_IRQn,3,3);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_SetPriority(EXTI1_IRQn,3,3);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_SetPriority(EXTI4_IRQn,2,3);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}
/*EXTI中断回调函数*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)EncoderNum++;
printf("EncoderNum=%d\n",EncoderNum);
}
if(GPIO_Pin == GPIO_PIN_1)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)EncoderNum--;
printf("EncoderNum=%d\n",EncoderNum);
}
if(GPIO_Pin == GPIO_PIN_4)
{
EncoderNum=0;
printf("EncoderNum=%d\n",EncoderNum);
}
}
编码器正转与反转两路信号相位不同,由此实现计数值增减,KEY信号归零计数值,结果如下图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用