OpenEdv-开源电子网

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

板子是STM32F407,使用TIM5的正交编码器模式无法正确读取。

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-7
在线时间
5 小时
发表于 2016-8-9 23:16:20 | 显示全部楼层 |阅读模式
1金钱
同样的一段代码,把TIM5换成TIM3,并且使用PA6,PA7,就可以正确读取编码器脉冲个数,而改成TIM5读出来的数就很混乱没有规律。我知道TIM5是32位的,我把void ENCODER1_Init(u16 arr,u16 psc)改成void ENCODER1_Init(u32 arr,u16 psc),并且在初始化的时候将ARR赋值0xffffffff,结果还是一样。所以请大家帮我看看,是不是我配置TIM5编码器模式的时候漏了什么呀?谢谢帮忙,纠结了好久了。

void ENCODER1_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;
        TIM_ICInitTypeDef TIM_ICInitStruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  ///使能TIM3时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
       
        //GPIOA0初始化设置
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用模式
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//上拉
       GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);//将GPIOA0引脚复用映射到TIM3
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);//将GPIOA1引脚复用映射到TIM3
       
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInitStructure.TIM_Period=arr;   //自动重装载值
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置分频系数
        TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//初始化时钟
         
         //Set TIM3 and TIM4 to the ecoder mode
        TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
        //配置编码器模式为定时器在TI1和TI2边沿同时计数,且CH1和CH2都为下降沿计数模式
       
        //初始化TIM3输入捕获参数
        TIM_ICInitStruct.TIM_Channel=TIM_Channel_1; //选择通道1     
        //TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Falling; //下降沿捕获
        TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI; //IC1映射到TI1上
        //TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;  //配置输入分频,不分频
        //TIM_ICInitStruct.TIM_ICFilter=0X00;//配置输入滤波器 不滤波
        TIM_ICInit(TIM5,&TIM_ICInitStruct);
       
        TIM_ICInitStruct.TIM_Channel=TIM_Channel_2; //选择通道1     
        //TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Falling; //下降沿捕获
       TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI; //IC2映射到TI2上
       TIM_ICInit(TIM5,&TIM_ICInitStruct);       

        //配置TIM5的中断优先级
        NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;//选择TIM5中断
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//开启TIM5中断允许
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//相应优先级为2
        NVIC_Init(&NVIC_InitStructure);//初始化TIM3中断
       
        TIM_ClearFlag(TIM5, TIM_FLAG_Update);
        TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//允许TIM3更新中断
       
        TIM_SetCounter(TIM5,0x8000);
       
        TIM_Cmd(TIM5,ENABLE);//使能定时器3
       
}

最佳答案

查看完整内容[请看2#楼]

兄弟,我也遇到了,不知道是不是跟PA0引脚有关系,我也是读取不到,其他定时器都可以读取编码器数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-5-12
在线时间
9 小时
发表于 2016-8-9 23:16:21 | 显示全部楼层
兄弟,我也遇到了,不知道是不是跟PA0引脚有关系,我也是读取不到,其他定时器都可以读取编码器数
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-7
在线时间
5 小时
 楼主| 发表于 2016-8-9 23:29:26 | 显示全部楼层
召唤原子哥,求助啊%>_<%
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-8-17 19:59:18 | 显示全部楼层
没搞过编码器啊,帮顶。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-7
在线时间
5 小时
 楼主| 发表于 2016-8-22 00:37:25 | 显示全部楼层
Mlover 发表于 2016-8-17 18:08
兄弟,我也遇到了,不知道是不是跟PA0引脚有关系,我也是读取不到,其他定时器都可以读取编码器数

我用的是STM32F4探索者开发板,同样的程序,用PA0和PA1作为输入就是检测不到正确数值,用其他端口就好了,不知道这是不是板子设计的问题。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-5-12
在线时间
9 小时
发表于 2016-8-24 17:49:26 | 显示全部楼层
我发现读数大约是真实值的一半,PA1引脚不能检测,PA0可以检测,我用的也是探索者F4
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2015-12-20
在线时间
46 小时
发表于 2019-2-11 23:19:22 | 显示全部楼层
我也是,用 TIM3和TIM5去采集编码器的值,只有TIM3有数,TIM5没有数据,找不到原因
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2019-1-18
在线时间
14 小时
发表于 2019-2-23 14:52:59 | 显示全部楼层
TM32F4探索者开发板,我也是遇到了,TIM2和TIM5都是用的PA0和PA1引脚,在采集的时候,TIM2->CR1寄存器上的DIR位一直跳动,编码器还没开始转动,测试一圈,测试结果不正确,改成TIM3即可,请求原子哥介入答复下!?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-7-16
在线时间
3 小时
发表于 2019-8-14 21:57:01 | 显示全部楼层
就是开发板的问题,STM32F407探索者板子,TIM5使用编码器模式的时候A0,A1不能正常读取编码器数据,我使用最小系统板子就能用,所以肯定是开发板的问题,至于为什么,有空再弄弄。
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-4-11
在线时间
15 小时
发表于 2019-8-15 16:08:20 | 显示全部楼层
换成高级计时器呗,我用407的芯片,自己画的板子,都没问题
别开中断,编码器模式不是计时器模式,只读数
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-12-17
在线时间
7 小时
发表于 2020-3-23 15:39:13 | 显示全部楼层
把P10的跳帽拔掉就可以了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-12-29
在线时间
7 小时
发表于 2020-4-9 20:16:39 | 显示全部楼层
我最近也遇到这个问题,昨晚通宵弄了一个晚上,发现主要是PA0或者PA1其中有一个引脚没有捕获到编码器的输出,于是就一个引脚一个引脚的测,
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);//将GPIOA0引脚复用映射到TIM5
GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);//将GPIOA1引脚复用映射到TIM5
这两句,注释掉PA0的复用,转动轮子,发现编码器输出的值在0,1之间跳动,根据编码器的计数方式,如图,发现其中有一路没有脉冲时,计数器上下跳变;而注释掉PA1的复用,编码器输出全0。 QQ图片20200409201033.png
依此推测确实是PA0没有正确捕获到编码器的输出。然后我用的是原子的STM32F407ZGT6核心板,PA0外接了按键WK_UP,我把按键取掉,重新测试就好了。希望能帮到看到的兄弟。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-2 18:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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