打印

stm2 TIMx的捕获预分频问题

[复制链接]
4190|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蒸钱会|  楼主 | 2009-2-10 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原文参考英文版页313/679,页/524中文

Bits 3:2 IC1PSC: Input Capture 1 Prescaler.
This bit-field defines the ratio of the prescaler acting on CC1 input (IC1).
The prescaler is reset as soon as CC1E=’0’ (TIMx_CCER register).
00: no prescaler, capture is done each time an edge is detected on the capture input.
01: capture is done once every 2 events.
10: capture is done once every 4 events.
11: capture is done once every 8 events.

IC1PSC[1:0]:输入/捕获1预分频器
这2位定义了CC1输入(IC1)的预分频系数。
一旦CC1E=0(TIMx_CCER寄存器中),则预分频器复位。
00:无预分频器,捕获输入口上检测到的每一个边沿都触发一次捕获;
01:每2个事件触发一次捕获;
10:每4个事件触发一次捕获;
11:每8个事件触发一次捕获。

按照此说明,捕获输入有预分频功能,但设置多次怎么还是无效?

沙发
香水城| | 2009-2-11 08:11 | 只看该作者

你希望得到什么效果?

使用特权

评论回复
板凳
蒸钱会|  楼主 | 2009-2-11 18:14 | 只看该作者

目的对输入信号分频后捕获,因为输入信号频率较高

有合适的端口对输入信号预分频再捕获吗?

使用特权

评论回复
地板
香水城| | 2009-2-11 18:37 | 只看该作者

你是不是说,不管预分频系数是多少,效果都一样?

请把你的程序贴出来,我这里测试一下。

输入信号的频率是多少?方波还是其它波形?

使用特权

评论回复
5
蒸钱会|  楼主 | 2009-2-12 19:10 | 只看该作者

不管预分频系数是多少,效果都一样

计数(ch1输入)预分频没错,捕获就是没分频,从2到8结果一样,在我用的这个硬件版本可能是个Bug,也可能设置顺序不对,但也查不出错在哪.脉冲没问题,200Khz到30khz,标准5V方波。其实用到的俩个TIMx捕获都无预分频功能,真是见鬼了。

使用特权

评论回复
6
香水城| | 2009-2-12 19:12 | 只看该作者

请把你的程序贴出来,我这里测试一下

另外你说“其实用到的俩个TIMx捕获都无预分频功能”,这是什么意思?没有预分频功能怎么能有效果?

使用特权

评论回复
7
蒸钱会|  楼主 | 2009-2-13 19:48 | 只看该作者

预分频还这么难理解吗?

按照说明,比如设置TIMx CCMR1的D[3:2]=1(IC1PSC,2分频),实际却是一分频,即输入无分频功能,设为其他值也一样.TIMx的例子内有捕获的例子(1分频,可以设为多分频),各位可以测试.

我的程序见笑了,不值一提.我已经用笨法--外加分频来解决.难道没人用这个功能吗?我会一直关注它这个功能的,只要有时间.


例子中见:


  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
//将TIM_ICPSC_DIV1改为如下值可以测试捕获的预分频功能(TI2FP2)
//#define TIM_CKD_DIV1                       ((u16)0x0000)
//#define TIM_CKD_DIV2                       ((u16)0x0100)
//#define TIM_CKD_DIV4                       ((u16)0x0200)
  TIM_ICInitStructure.TIM_ICFilter = 0x0;

  TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);

  /* Select the TIM2 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);

  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);

  /* TIM enable counter */
  TIM_Cmd(TIM2, ENABLE);

  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);

使用特权

评论回复
8
蒸钱会|  楼主 | 2009-3-22 13:36 | 只看该作者

旧事重提

其实,自己的理解,这个问题到此为止已经说的明白不过了。按照ST手册说明(见前面引用说明,原文参考英文版页313/679,页/524中文),M32各定时器不但对外计数有预分频功能,对外捕获也有预分频功能(Ti1~4输入口)。对外计数预分频功能正常,而捕获预分频无效(怎么设置都是一分频),这就是我要说的。大家可以测试ST提供的一个捕获例子,见目录内的..TIMPWM_Input内的例子,此例给的是一分频,可以将分频因子修改测试,见前面所述。

个人认为这是个硬件bug(也许自己用法不对,如果有人能弄出来,愿意拜师求教),因为手册说明有此功能,实际整不出来。个人程序为无驱动库程序,并非独闯,已经仔细拜读驱动库及其例子。

鉴于版主对此问题重视,特意重提。

使用特权

评论回复
9
香水城| | 2009-3-22 15:37 | 只看该作者

谢谢楼主旧事重提

通过仔细检查库函数,我怀疑是头文件中的常数定义错误,请试试把这几个常数定义修改如下:

#define TIM_CKD_DIV1    ((u16)0x0000)
#define TIM_CKD_DIV2    ((u16)0x0004) // Old value ((u16)0x0100)
#define TIM_CKD_DIV4    ((u16)0x0008) // Old value ((u16)0x0200)
#define TIM_CKD_DIV8    ((u16)0x000C)

或者在调用完TIM_PWMIConfig()之后,直接对TIM2_CCMR1操作修改它的IC2PSC[1:0]位。

使用特权

评论回复
10
pb486| | 2009-5-23 15:10 | 只看该作者

看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

54

帖子

0

粉丝