打印
[STM32F2]

PWM输入脉宽检测的问题

[复制链接]
1387|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的脉冲怎么可能检测不出来呢;
楼主再好好验证下;

使用特权

评论回复
5
muzx|  楼主 | 2015-6-3 08:29 | 只看该作者
示波器信号验证没有问题。这个问题最奇怪的是短脉冲小到一定程度,才会出现问题。

使用特权

评论回复
6
muzx|  楼主 | 2015-6-3 08:43 | 只看该作者
mmuuss586 发表于 2015-6-3 08:27
你前面1us和5us的脉冲能检测到,后面的5us的脉冲怎么可能检测不出来呢;
楼主再好好验证下;

代码不改,调整图中短脉冲的宽度到小于700ns时,宽脉冲的TIM_GetCapture1读到的宽度就错误了。

DS1Z_QuickPrint1.png (37.32 KB )

DS1Z_QuickPrint1.png

使用特权

评论回复
7
muzx|  楼主 | 2015-6-3 10:52 | 只看该作者
找到问题原因了。因为是脉冲的上升沿触发中断,当脉冲时间太短时,中断还没来得及读走TIM_GetCapture1时,脉宽寄存器就被下一个短脉冲更新了。

使用特权

评论回复
8
muzx|  楼主 | 2015-6-3 10:57 | 只看该作者
配置改为下降沿触发中断TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
脉宽计算改为TIM_GetCapture2(TIM4)-TIM_GetCapture1(TIM4);

使用特权

评论回复
9
mmuuss586| | 2015-6-3 12:23 | 只看该作者

解决了就好,不过这么短时间的脉冲,关键程序还是操作寄存器;
缩短中断程序代码量;

使用特权

评论回复
10
13028866875| | 2015-6-10 08:53 | 只看该作者

使用特权

评论回复
11
仙人球W| | 2015-6-10 10:51 | 只看该作者

使用特权

评论回复
12
wowow| | 2015-6-10 15:25 | 只看该作者
如果脉冲频率过快可以考虑用DMA+环形缓冲区,就不怕覆盖了。

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝