EC1102编码器图
EC1102编码器原理图
1:编码器中添加了两个上拉电阻,所以在软件配置中,配置下拉有效。
EC1102编码器资料手册
2:在EC1102编码器资料手册中,工作电压是1.5V以下有效,3.5V以上是无效,在这里需要注意延时消抖,1-3ms,在这里设置1ms。
好了原理已经知道,直接上代码
1:初始化
void EnCoder() //编码器 { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA\ |RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD; GPIO_Init(GPIOC,&GPIO_InitStructure); NVIC_InitStruct.NVIC_IRQChannel =EXTI3_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =3; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&NVIC_InitStruct); NVIC_InitStruct.NVIC_IRQChannel =EXTI9_5_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =3; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStruct); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource7); EXTI_InitStruct.EXTI_Line =EXTI_Line7; EXTI_InitStruct.EXTI_LineCmd =ENABLE; EXTI_InitStruct.EXTI_Mode =EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger =EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStruct); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3); EXTI_InitStruct.EXTI_Line =EXTI_Line3; EXTI_InitStruct.EXTI_LineCmd =ENABLE; EXTI_InitStruct.EXTI_Mode =EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger =EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStruct); }
2:中断配置
#define alv GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7) #define blv GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3) volatile uint32_t encoder_left_ENABLE = 0; volatile uint32_t encoder_right_ENABLE = 0; uint32_t time_A=0,time_B = 0; //左边 void EXTI3_IRQHandler(void) { Delay_ms(1); if (blv==0) { if(alv==0) { encoder_left_ENABLE=1; encoder_right_ENABLE=0; if(Buzzer_Stup) Buzzer_Time_ms=20; EC11_Time_B=0; } } EXTI_ClearITPendingBit(EXTI_Line3); } //右边 void EXTI9_5_IRQHandler(void) { Delay_ms(1); if (alv==0) { if(blv==0) { encoder_left_ENABLE=0; encoder_right_ENABLE=1; if(Buzzer_Stup) Buzzer_Time_ms=20; EC11_Time_A=0; } } EXTI_ClearITPendingBit(EXTI_Line7); }