常用函数
1 | void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); |
定时器编码器接口配置
编码器接口测速
Encoder.c
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | void Encoder_Init(void){ //开启时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3是APB1的外设 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使用TIM3的通道1,引脚是PA6 //配置GPIO GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//ARR,这里最好设置大一些,防止溢出,这里给最大值 TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//PSC,这个值决定测周法的标准频率fc,根据信号频率分布范围调整 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); //初始化输入捕获单元 TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择通道 TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//极性选择,代表不反向 TIM_ICInit(TIM3,&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//选择通道 TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//极性选择,代表不反向 TIM_ICInit(TIM3,&TIM_ICInitStructure); TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); TIM_Cmd(TIM3,ENABLE);} int16_t Encoder_Get(void){ int16_t Temp; Temp = TIM_GetCounter(TIM3); TIM_SetCounter(TIM3,0); return Temp;} |
main.c
123456789101112131415161718192021222324252627282930 | uint16_t Num;int16_t Speed;int main(void){ OLED_Init(); Timer_Init(); Encoder_Init(); OLED_ShowString(1,1,"CNT:"); while(1) { OLED_ShowSignedNum(1,5,Speed,5); }} void TIM2_IRQHandler(void){ if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET) { Speed = Encoder_Get(); TIM_ClearITPendingBit(TIM2,TIM_IT_Update); }} |