[STM32F2] PWM输入脉宽检测的问题

[复制链接]
1770|11
 楼主| muzx 发表于 2015-6-2 19:40 | 显示全部楼层 |阅读模式
信号发生器间隔发送1us和5us的脉冲,stm32可以正确检测到所有的脉冲宽度。但当把1us的脉冲宽度减少到700ns时,5us和700ns的脉冲宽度都检测为700ns了,有遇到过这个问题的吗?
airwill 发表于 2015-6-3 08:01 | 显示全部楼层
不应该出现这样的问题, 定时器的脉冲检测功能不用怀疑. 值得怀疑的是你的设置, 还有你的信号. 用示波器验证吧.
 楼主| muzx 发表于 2015-6-3 08:27 | 显示全部楼层
airwill 发表于 2015-6-3 08:01
不应该出现这样的问题, 定时器的脉冲检测功能不用怀疑. 值得怀疑的是你的设置, 还有你的信号. 用示波器验证 ...

{
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        TIM_ICInitTypeDef  TIM_ICInitStructure;



  /* TIM4 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  /* GPIOB clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  
  /* TIM4 chennel2 configuration : PB.07 */
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  /* Connect TIM pin to AF2 */
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);

  /* Enable the TIM4 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  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_ICInitStructure.TIM_ICFilter = 0x0;


  TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);

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

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
  TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);

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

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

}
mmuuss586 发表于 2015-6-3 08:27 | 显示全部楼层
你前面1us和5us的脉冲能检测到,后面的5us的脉冲怎么可能检测不出来呢;
楼主再好好验证下;

 楼主| muzx 发表于 2015-6-3 08:29 | 显示全部楼层
示波器信号验证没有问题。这个问题最奇怪的是短脉冲小到一定程度,才会出现问题。
 楼主| muzx 发表于 2015-6-3 08:43 | 显示全部楼层
mmuuss586 发表于 2015-6-3 08:27
你前面1us和5us的脉冲能检测到,后面的5us的脉冲怎么可能检测不出来呢;
楼主再好好验证下;

代码不改,调整图中短脉冲的宽度到小于700ns时,宽脉冲的TIM_GetCapture1读到的宽度就错误了。
DS1Z_QuickPrint1.png
 楼主| muzx 发表于 2015-6-3 10:52 | 显示全部楼层
找到问题原因了。因为是脉冲的上升沿触发中断,当脉冲时间太短时,中断还没来得及读走TIM_GetCapture1时,脉宽寄存器就被下一个短脉冲更新了。
 楼主| muzx 发表于 2015-6-3 10:57 | 显示全部楼层
配置改为下降沿触发中断TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
脉宽计算改为TIM_GetCapture2(TIM4)-TIM_GetCapture1(TIM4);
mmuuss586 发表于 2015-6-3 12:23 | 显示全部楼层

解决了就好,不过这么短时间的脉冲,关键程序还是操作寄存器;
缩短中断程序代码量;
13028866875 发表于 2015-6-10 08:53 | 显示全部楼层
仙人球W 发表于 2015-6-10 10:51 | 显示全部楼层
wowow 发表于 2015-6-10 15:25 | 显示全部楼层
如果脉冲频率过快可以考虑用DMA+环形缓冲区,就不怕覆盖了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部