高级会员

- 积分
- 664
- 金钱
- 664
- 注册时间
- 2019-1-30
- 在线时间
- 111 小时
|
20金钱
本帖最后由 zhangxiaolin 于 2019-12-4 18:16 编辑
TIM_GetCapture1函数的意义时当捕获成功时得到计数器的值,根据设定的定时器的分频系数得到定时器的周期。定时器的周期*TIM_GetCapture1的返回值 = 捕获到的完整的高(低)电平的持续时间。但是换算得到结果同已知的高电平时间相差好多。现在粘贴部分代码如下,求大神指导。
- 定时器初始化
- void TIM1_Configure(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_ICInitTypeDef TIM1_ICInitStructure;
- /* TIM1 clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
- TIM_DeInit(TIM1);
- TIM_TimeBaseStructure.TIM_Period = 9999; // 设置计数器值 1MHz/(9999+1)=100HZ 10ms
- TIM_TimeBaseStructure.TIM_Prescaler = 71; //设置预分配频 72M/(71+1)=1MHz,1us
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
- /* Input Mode configuration: Channel1 */
- TIM1_ICInitStructure.TIM_Channel = TIM_Channel_1; //
- TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
- TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //
- TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //
- TIM1_ICInitStructure.TIM_ICFilter = 0x00;//
- TIM_ICInit(TIM1, &TIM1_ICInitStructure);
- // TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //
- // TIM_ARRPreloadConfig(TIM1, ENABLE);
-
- TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE);//使能捕获中断
- TIM_Cmd(TIM1, ENABLE); // TIM1 ENABLE counter
- }
复制代码 void TIM1_CC_IRQHandler(void)
{
if((TIM1CH1_CAPTURE_STA&0X80)==0) // {
if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)// {
if(TIM1CH1_CAPTURE_STA&0X40) //
{
TIM1CH1_CAPTURE_STA|=0X80; //
TIM1CH1_CAPTURE_VAL=TIM_GetCapture1(TIM1);
TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Rising); //
}
else //
{
TIM1CH1_CAPTURE_STA=0;
TIM1CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM1,0);
TIM1CH1_CAPTURE_STA|=0X40;
TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Falling);
}
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1); //Çå3yÖD¶Ï±ê־λ
}
疑惑点时,当完成一次捕获中断时,根据TIM1CH1_CAPTURE_VAL=TIM_GetCapture1(TIM1);得到的TIM1CH1_CAPTURE_VAL值 ,TIM1CH1_CAPTURE_VAL*定时器的计数周期 = 高电平的脉宽。但是这个计算出来的值同已知的高电平的脉宽差值会很大。主要是TIM1CH1_CAPTURE_VAL这个值的问题。这个值貌似不能反映定时器高电平的时间,不解为什么?
求各位大神指点一下。
|
最佳答案
查看完整内容[请看2#楼]
TIM1CH1_CAPTURE_VAL这个值是可以反应捕捉到的高电平的脉宽,但是这个值貌似不能通过DEBUG单步调试,因为单步调试第二次再得到这个值的时候,这个值可能会变的超级大,这是不正确的。
|