stm2TIMx的捕获预分频问题

zhpuffin   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个事件触发一次捕获。

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

回复评论 (9)

你希望得到什么效果?

                                  
点赞  2009-2-11 08:11

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

                                 有合适的端口对输入信号预分频再捕获吗?
点赞  2009-2-11 18:14

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

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

输入信号的频率是多少?方波还是其它波形?
点赞  2009-2-11 18:37

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

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

点赞  2009-2-12 19:10

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

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

预分频还这么难理解吗?

按照说明,比如设置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);
点赞  2009-2-13 19:48

旧事重提

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

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

鉴于版主对此问题重视,特意重提。
点赞  2009-3-22 13:36

谢谢楼主旧事重提

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

#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]位。
点赞  2009-3-22 15:37

看看

                                  
点赞  2009-5-23 15:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复