OpenEdv-开源电子网

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

TIM定时器中的编码器模式,配置成功后的疑惑

[复制链接]

16

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2011-10-1
在线时间
0 小时
发表于 2014-12-28 22:10:16 | 显示全部楼层 |阅读模式
5金钱
我是测量编码器的脉冲数,程序执行成功了,但是有些疑惑未能解决。
这是我配置的一段关键步骤,
[mw_shl_code=c,true]TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge); //配置TIM3为编码器模式,CI C2直接映射到TI1 TI2 ,上升沿 下降沿 同时检测 TIM_ICInitStructure.TIM_Channel = TIM_Channel_1|TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM_ICInitStructure.TIM_ICFilter = 0x06;//配置输入滤波器为6 TIM_ICInit(TIM3, &TIM_ICInitStructure);[/mw_shl_code]
问题1:配置完第一句后,下面这几句
[mw_shl_code=c,true]TIM_ICInitStructure.TIM_Channel = TIM_Channel_1|TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 [/mw_shl_code]
还有必要加吗,为什么?
问题2:程序配置完后,运行10ms后我的脉冲数是354个。我尝试去掉问题1中的这几句后,检测数变成了-354,就是计数器向下计数345,原因是什么?
问题3:最初的程序
是TI1和TI2上升沿,下降沿同时检测的结果,但是当我把第一句的两个极性
[mw_shl_code=c,true]TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge[/mw_shl_code]
改为
[mw_shl_code=c,true]TIM_ICPolarity_Rising,TIM_ICPolarity_Rising[/mw_shl_code]
后,按说应该变成只在TI1和TI2的上升沿检测,同样时间的计数值应该减半的,但是最后数值变为-354,就是计数器向下计数354,这是为什么?
问题4:问题3出现后,我有吧
[mw_shl_code=c,true]TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; [/mw_shl_code]
改成了
[mw_shl_code=c,true]TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; [/mw_shl_code]
以确保跟第一句保持一致,但计数值有变成354,依然没有减半,
很是迷茫,望大神能请教一二。。。

最佳答案

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

问题1:后面可加可不加,如果需要使用滤波器便需要加上。 问题2:这个应该和配置时基结构体中的周期有关系吧 问题3:在极性选择中好像只有TIM_ICPolarity_Rising和TIM_ICPolarity_Falling,没有TIM_ICPolarity_BothEdge。 下面是 TIM_EncoderInterfaceConfig()函数的说明部分:[/backcolor] [mw_shl_code=c,true]/** * @brief Configures the TIMx Encoder Interface. * @param TIMx: where x can be 1, 2, 3, 4, 5 or ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2017-7-22
在线时间
12 小时
发表于 2014-12-28 22:10:17 | 显示全部楼层
本帖最后由 晓元无悔 于 2018-11-18 18:48 编辑

问题1:后面可加可不加,如果需要使用滤波器便需要加上。
问题2:这个应该和配置时基结构体中的周期有关系吧
问题3:在极性选择中好像只有TIM_ICPolarity_Rising和TIM_ICPolarity_Falling,没有TIM_ICPolarity_BothEdge。
下面是 TIM_EncoderInterfaceConfig()函数的说明部分:
[mw_shl_code=c,true]/**
  * @brief  Configures the TIMx Encoder Interface.
  * @param  TIMx: where x can be  1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
  * @param  TIM_EncoderMode: specifies the TIMx Encoder Mode.
  *   This parameter can be one of the following values:
  *     @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level.
  *     @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level.
  *     @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending
  *                                on the level of the other input.
  * @param  TIM_IC1Polarity: specifies the IC1 Polarity
  *   This parameter can be one of the following values:
  *     @arg TIM_ICPolarity_Falling: IC Falling edge.
  *     @arg TIM_ICPolarity_Rising: IC Rising edge.
  * @param  TIM_IC2Polarity: specifies the IC2 Polarity
  *   This parameter can be one of the following values:
  *     @arg TIM_ICPolarity_Falling: IC Falling edge.
  *     @arg TIM_ICPolarity_Rising: IC Rising edge.
  * @retval None
  */
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
                                uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)[/mw_shl_code]

TIM_ICPolarity_Rising和TIM_ICPolarity_Falling实际上是配置的TIMx_CCER(捕获/输出使能寄存器)的CC1P位,是配置不反相和反相的,和编码器脉冲信号的上升沿和下降沿没有关系。
下面两图是手册中对这部分的说明:


捕获比较通道.jpg

cc1p.jpg
编码器模式下可以配置TIM_EncoderMode_TI1和TIM_EncoderMode_TI2和TIM_EncoderMode_TI12实现在TI1的上/下边沿或TI2的上/下边沿或TI1的上/下边沿和TI2的上/下边沿实现脉冲计数。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-12-28 22:40:32 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-1-7
在线时间
13 小时
发表于 2017-2-20 13:21:32 | 显示全部楼层
帮顶,求解释
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2017-7-29
在线时间
2 小时
发表于 2017-8-6 20:55:37 | 显示全部楼层
1.      针对问题一,对TIM_ICInitStructure的配置和对TIM_EncoderInterfaceConfig函数的使用实际上是冲突的,两个语句中的极性的设置是重复 的。按照上面的问题,你对TIM_ICInitStructure的配置在TIM_EncoderInterfaceConfig函数设置后面,所以说不管你在函数中规定什么极性,在后面的结构体配置中又被修改了。所以说你可以把TIM_EncoderInterfaceConfig函数放在后面。
2.      TIM_ICPolarity_BothEdge这个双极性检测实际上不能达到效果,这个的效果和TIM_ICPolarity_Falling是一样的。大家可以看看固件库手册上并没有这个双极性检测的定义。大家也可以实验一下。
3.      大家可以看一下STM32中文参考手册273页的编码器接口模式讲解,哪个地方讲的比较清楚,通过寄存器也能够看到极性检测的真正原理是反相与不反相的问题。我本人猜测,STM32只能被下降沿触发,那么如何能够对上升沿触发呢,就是通过对波形的反相,反相后上升沿变为下降沿,下降沿变为上升沿,如此即可。那里面也没有提到这个双触发的问题,所以我觉得这个地方可能是固件库的一个小失误。
4.      以上观点纯属本人自我猜测,觉得有道理可采纳
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-9-21
在线时间
17 小时
发表于 2018-2-2 14:41:31 | 显示全部楼层
能把你的TIM定时器中的编码器模式程序发给来看看嘛 QQ:516480517
你的有计编码器转的圈数吗
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-29
在线时间
2 小时
发表于 2018-2-5 15:01:23 | 显示全部楼层
觉感123 发表于 2018-2-2 14:41
能把你的TIM定时器中的编码器模式程序发给来看看嘛 QQ:516480517
你的有计编码器转的圈数吗

你收到了吗,可以给我一份吗,qq:517470045
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-9-21
在线时间
17 小时
发表于 2018-2-5 21:23:14 | 显示全部楼层
简单  你可以直接试试
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-5-10
在线时间
0 小时
发表于 2019-5-10 12:43:04 | 显示全部楼层
齐森茂 发表于 2018-2-5 15:01
你收到了吗,可以给我一份吗,qq:517470045

你好~~方便给我发一份嘛? 694264649
回复

使用道具 举报

6

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2019-7-13
在线时间
63 小时
发表于 2021-1-9 15:37:36 | 显示全部楼层
对于极性的设置不能达到编码器四倍频的设置,只能达到2倍频的设置
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 21:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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