如题,由于项
目需求不得已使用高级定时器tim10但发现使用tim10无法获取编码器的值
这是初始化函数
void ENCODER_Init_TIM10(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure={0}; TIM_ICInitTypeDef TIM_ICInitStructure={0}; GPIO_InitTypeDef GPIO_InitStructure={0}; // NVIC_InitTypeDef NVIC_InitStructure={0}; RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM10 | RCC_APB2Periph_GPIOB, ENABLE); //使能定时器10,PB端口的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO复用功能模块时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x1; // 预分频器 // TIM_TimeBaseStructure.TIM_Period = 2500-1; //设定计数器自动重装值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数 TIM_TimeBaseInit(TIM10, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct的参数初始化定时 器TIM10 TIM_EncoderInterfaceConfig(TIM10, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //使用编码器模式3 TIM_ICStructInit(&TIM_ICInitStructure); //把TIM_ICInitStruct 中的每一个参数按缺省值填入 TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//|TIM_Channel_2 TIM_ICInitStructure.TIM_ICFilter = 10; //设置滤波器长度 TIM_ICInit(TIM10, &TIM_ICInitStructure); // NVIC_InitStructure.NVIC_IRQChannel = TIM10_UP_IRQn; // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; // NVIC_Init(&NVIC_InitStructure); // TIM_ITConfig(TIM10, TIM_IT_CC1, ENABLE); TIM_ITConfig(TIM10, TIM_IT_Update, ENABLE); TIM_ClearFlag(TIM10, TIM_FLAG_Update); //清除TIM的更新标志位 TIM_SetCounter(TIM10, 0); TIM_Cmd(TIM10, ENABLE); }
这是中断函数:
int circle_count=0;//全局变量-圈数 void TIM10_UP_IRQHandler(void) { circle_count=1; if(TIM_GetITStatus(TIM10,TIM_IT_Update)==SET) { TIM_ClearITPendingBit(TIM10,TIM_IT_Update); // if((TIM10->CTLR1>>4 & 0x01)==0) //DIR==0 // circle_count++; // else if((TIM10->CTLR1>>4 & 0x01)==1)//DIR==1 // circle_count--; } }
这是头文件:
#ifndef DRIVE_ENCODER_ENCODER_H_ #define DRIVE_ENCODER_ENCODER_H_ #include "ch32v30x.h" extern int circle_count; void ENCODER_Init(void);//初始化 void ENCODER_Init_TIM8(void);//初始化 void ENCODER_Init_TIM10(void);//初始化 void TIM10_UP_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); #endif /* DRIVE_ENCODER_ENCODER_C_ */
这是主函数:
int volatile Encoder; int main(void) { Delay_Init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Led_Init(); ENCODER_Init_TIM10(); Encoder=1; while(1){ GPIO_ResetBits(GPIOE, GPIO_Pin_4); GPIO_SetBits(GPIOE, GPIO_Pin_5); GPIO_ResetBits(GPIOE, GPIO_Pin_6); Encoder=TIM_GetCounter(TIM10);//当前角度 TIM_SetCounter(TIM10, 0); Delay_Ms(500); GPIO_SetBits(GPIOE, GPIO_Pin_4); GPIO_ResetBits(GPIOE, GPIO_Pin_5); GPIO_SetBits(GPIOE, GPIO_Pin_6); Encoder=TIM_GetCounter(TIM10);//当前角度 TIM_SetCounter(TIM10, 0); Delay_Ms(500); } }
监听的是“Encoder”的值发现为0,检查后发现寄存器为0;
热门产品 :
CH32L103: 32位PDUSB低功耗单片机