原文参考英文版页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个事件触发一次捕获。
按照此说明,捕获输入有预分频功能,但设置多次怎么还是无效?
目的对输入信号分频后捕获,因为输入信号频率较高
有合适的端口对输入信号预分频再捕获吗?
你是不是说,不管预分频系数是多少,效果都一样?
请把你的程序贴出来,我这里测试一下。
输入信号的频率是多少?方波还是其它波形?
不管预分频系数是多少,效果都一样
计数(ch1输入)预分频没错,捕获就是没分频,从2到8结果一样,在我用的这个硬件版本可能是个Bug,也可能设置顺序不对,但也查不出错在哪.脉冲没问题,200Khz到30khz,标准5V方波。其实用到的俩个TIMx捕获都无预分频功能,真是见鬼了。
请把你的程序贴出来,我这里测试一下
另外你说“其实用到的俩个TIMx捕获都无预分频功能”,这是什么意思?没有预分频功能怎么能有效果?
预分频还这么难理解吗?
按照说明,比如设置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);
旧事重提
其实,自己的理解,这个问题到此为止已经说的明白不过了。按照ST手册说明(见前面引用说明,原文参考英文版页313/679,页/524中文),M32各定时器不但对外计数有预分频功能,对外捕获也有预分频功能(Ti1~4输入口)。对外计数预分频功能正常,而捕获预分频无效(怎么设置都是一分频),这就是我要说的。大家可以测试ST提供的一个捕获例子,见目录内的..TIMPWM_Input内的例子,此例给的是一分频,可以将分频因子修改测试,见前面所述。
个人认为这是个硬件bug(也许自己用法不对,如果有人能弄出来,愿意拜师求教),因为手册说明有此功能,实际整不出来。个人程序为无驱动库程序,并非独闯,已经仔细拜读驱动库及其例子。
鉴于版主对此问题重视,特意重提。
谢谢楼主旧事重提
通过仔细检查库函数,我怀疑是头文件中的常数定义错误,请试试把这几个常数定义修改如下:
#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]位。