在STM32的進階定時器和一般定時器中有Encoder interface mode(編碼器介面),TI1和TI2分別對應TIM_CH1 和TIM_CH2 通道。
一、計數規則如下:
表55的是編碼器不同的訊號下計數方向。
1.僅在TI1邊沿計數:上升沿觸發時,若對應TI2為低電平,則計數器向下計數;對應為高電平,則向上計數。如圖2.在○1和○2處,TI1的上升沿對應TI2為低電平,所以計數器向上計數;同樣的,在○3處則相反。
2.在TI1和TI2邊沿計數:若TI1、TI2上升沿捕捉時,TI1上升邊沿對應TI2位於低電平,則向上計數;TI2上升邊沿對應TI1高電平,向上計數,所以為雙倍。
二、功能配置
1.設定I/O口(啟動時鐘,工作在定時器模式下,無上拉)
2.配置定時器(選擇編碼器介面模式)
void Encoder_Config(){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOE,&GPIO_InitStructure); GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); TIM_DeInit(TIM1); TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //單倍模式 TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 500*4; //計數周期 TIM_TimeBaseStructure.TIM_Prescaler = 0; //時鐘分頻 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 0; //濾波,0表示不濾波 TIM_ICInit(TIM1,&TIM_ICInitStructure); TIM_EncoderInterfaceConfig(TIM1,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); //設定定時器工作在編碼器介面模式。 TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); TIM_ClearITPendingBit(TIM1,TIM_IT_Update); TIM_ClearFlag(TIM1,TIM_FLAG_Update); TIM_SetCounter(TIM1,0); //設定計數初值 TIM_Cmd(TIM1,ENABLE); }
實驗中採用的是E6A2-cwz5c編碼器,解析度為500/r, 定時器為TI1和TI2雙邊沿計數,最終計數始終保持為2000,理論值應為1000。如果有實驗通過的,還請告知原因,灰常感謝。