OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4114|回复: 2

求助:F407通用定时器开启编码器模式,溢出中断之后发生异变

[复制链接]

2

主题

6

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-8-26
在线时间
4 小时
发表于 2017-3-1 17:16:40 | 显示全部楼层 |阅读模式
5金钱
求助诸位大神!鄙人采用STM32F407VET6的TIM2,3,4,5的CH1和CH2来对用于电机的增量光电编码器进行测速。每次芯片复位初始化之后,在定时器中断未发生的时候(向上向下均未溢出过的情况下),TIMX->CNT的数值都还算正常。在发生中断之后,原本转一圈计数2000次变成了转好几圈计数也不过100次的情况,非常奇怪!四个定时器的效果都是这样。
以下是鄙人的初始化程序,以TIM2为例:

[mw_shl_code=c,true]RCC->APB1ENR|=1<<0;
                RCC->AHB1ENR|=1<<0;
                RCC->AHB1ENR|=1<<1;
                GPIO_Set(GPIOA,PIN15,
                                GPIO_MODE_AF,GPIO_OTYPE_OD,
                                GPIO_SPEED_50M,GPIO_PUPD_NONE);
                GPIO_AF_Set(GPIOA,15,1);
                GPIO_Set(GPIOB,PIN3,
                                GPIO_MODE_AF,GPIO_OTYPE_OD,
                                GPIO_SPEED_50M,GPIO_PUPD_NONE);
                GPIO_AF_Set(GPIOB,3,1);//Set CH1 CH2
               
                TIM2->DIER|=1<<0;        //Enable Interrupt
                TIM2->DIER|=1<<6;         //Tigger Interrupt
               
                TIM2->ARR=1999;       
                TIM2->PSC=41;

                TIM2->CR1&=~(3<<8);        //Keep Original Frequency
                TIM2->CR1&=~(3<<5);        //Align to Sides
               
                TIM2->CCMR1|=1<<0;        //CC1S Project IC1 to TI1
                TIM2->CCMR1|=1<<8;        //CC2S Project IC2 to TI2
               
                TIM2->CCER&=0XFF55; //Trigger at Upper Impulse
               
                TIM2->CCMR1|=3<<4;        //IC1F FILTER MODE 0011
                TIM2->CCMR1|=3<<12;        //IC2F FILTER MODE 0011
               
                TIM2->SMCR|=3<<0;        //Encoder Mode
               
                TIM2->CNT=1000;        //Start to Count from the number
               
                TIM2->CR1|=1<<0;        //Enable Timer
               
                MY_NVIC_Init(0,2,TIM2_IRQn,2);[/mw_shl_code]




然后这是中断函数:

[mw_shl_code=c,true]void TIM2_IRQHandler(void)//Encoder 1
{
        if(TIM2->SR&0X0001)
        {
                if (Encoder_Status&(1<<0))
                {
                        if (TIM2->CNT>=Encoder_Start[0])
                        {
                                Encoder_Cycle_Raw[0]--;
                        }
                        else
                        {
                                Encoder_Cycle_Raw[0]++;
                        }
                }                       
        }
        TIM2->SR&=~(1<<0);
}[/mw_shl_code]

由于项目急着要用,时间相对较为紧急,恳请诸位大神求助!另如果有高人有寄存器版本的亲测可用的F4的编码器模式初始话函数能够分享,鄙人将不胜感激!

另如果有其他要补充的信息,请随时留言!

谢谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-1 21:24:29 | 显示全部楼层
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-8-26
在线时间
4 小时
 楼主| 发表于 2017-3-2 07:35:50 | 显示全部楼层
自己顶一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 08:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表