初级会员

- 积分
- 119
- 金钱
- 119
- 注册时间
- 2017-12-14
- 在线时间
- 18 小时
|
22金钱
最近在调试编码器,通过32上的编码器模式统计每圈的脉冲数量(分辨率),编码器的型号上说是2500的,但是在测试的时候脉冲的数量和2500有很大的差别。
中断是通过编码器上面的Z相的调零信号触发外部中断。
下面是编码器模式的初始化程序
- void TIM4_EncoderInit(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);//使能TIM4时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIO时钟
- //GPIO初始化 连接编码器的A、B两相
- GPIO_Init(GPIOB ,6 , GPI_FLOAT , LOW);
- GPIO_Init(GPIOB ,7 , GPI_FLOAT , LOW);
- //将外设NVIC的寄存器设置为默认值
- TIM_DeInit(TIM4);
- //将时基设置的结构体设置为默认值
- TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
- //设定计数器重装值
- TIM_TimeBaseStructure.TIM_Period = arr;
- //TIM时钟预分频值
- TIM_TimeBaseStructure.TIM_Prescaler = psc;
- //设置时钟分割 T_dts = T_ck_int
- TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;
- //TIM向上计数
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- //时基初始化
- TIM_TimeBaseInit(TIM4 ,&TIM_TimeBaseStructure);
- //编码器模式设置和计数器模式设置
- TIM_EncoderInterfaceConfig(TIM4 , TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);
- //将结构体中的内容按默认值输入
- TIM_ICStructInit(&TIM_ICInitStructure);
- //选择输入比较滤波器
- TIM_ICInitStructure.TIM_ICFilter = 6;
- //将TIM_ICInitStructure中的指定参数初始化TIM3
- TIM_ICInit(TIM4, &TIM_ICInitStructure);
- //计数初值为0
- TIM4->CNT = 0; //计数初值为0
- }
下面是中断处理的程序
- void EXTI3_IRQHandler(void)
- {
- int i=0; //记录计数器的值
- TIM_Cmd(TIM4,DISABLE); //停止计数器计数
- if(EXTI_GetITStatus(EXTI_Line3) != RESET) //检查是否发生中断
- {
- printf("进入中断\r\n");
- i=TIM4->CNT; //计数器的值
- printf(" 脉冲数:%d \r\n",i/4); //输出脉冲数
- delay_ms(100);
- TIM4->CNT = 0; //计数器初值重置为0
- TIM_Cmd(TIM4,ENABLE); //开启计数器计数
- EXTI_ClearITPendingBit(EXTI_Line3); //清除中断线上的中断标志位
- }
- }
下面是主程序的代码
- int main(void)
- {
- delay_init(SYSCLK_FREQ_72); //延时初始化
- EXTI_Key_Config(); //外部中断初始化
- UARTx_Config(); //串口初始化
- TIM4_EncoderInit(65535,0); //定时器编码器模式初始化
- TIM_Cmd(TIM4,ENABLE); //开启计数器
- while(1)
- {
- }
- }
测试的时候脉冲的数量一直不稳定

|
最佳答案
查看完整内容[请看2#楼]
解决了,将编码器模式设置那段代码按照官方参考手册改成寄存器设置的
[*] TIM4->CCMR1 |= 1
|