stm32F4 pwm输入捕获约2MHz的高频信号?

stm32F4 pwm输入捕获约2MHz的高频信号?,stm32,stm32f4discovery,stm32f4,Stm32,Stm32f4discovery,Stm32f4,我想测量PWM信号的频率。为此,我使用了STM-F401RE及其定时器输入捕获功能 问题是: 输入信号具有相当高的频率(约2MHz),并且 STM-F401RE控制器只有80MHz时钟 因此,当使用中断例程计算输入信号上升沿的数量时,它会遗漏许多上升沿(取决于输入信号的频率)。当使用示波器并切换I/O引脚时,我发现当频率低于400kHz时,它只能捕获所有上升沿 问题是:如何克服这个问题?或者是否有其他方法测量高频输入pwm信号 谢谢您需要将计时器设置为PWM输入,而不是捕获输入(例如,TIM

我想测量PWM信号的频率。为此,我使用了STM-F401RE及其定时器输入捕获功能

问题是:

  • 输入信号具有相当高的频率(约2MHz),并且
  • STM-F401RE控制器只有80MHz时钟
因此,当使用中断例程计算输入信号上升沿的数量时,它会遗漏许多上升沿(取决于输入信号的频率)。当使用示波器并切换I/O引脚时,我发现当频率低于400kHz时,它只能捕获所有上升沿

问题是:如何克服这个问题?或者是否有其他方法测量高频输入pwm信号


谢谢

您需要将计时器设置为PWM输入,而不是捕获输入(例如,TIM1可以完成)。这样,将使用两个通道(但您只有一个物理连接)。基本上,第一个通道会给你周期,第二个通道会给你脉冲。计数器会自动重置

init函数:

void tim_init()
{
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_IC_InitTypeDef sConfigIC;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 65535;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  HAL_TIM_IC_Init(&htim1);

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  sSlaveConfig.InputTrigger = TIM_TS_TI2FP2;
  sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sSlaveConfig.TriggerPrescaler = TIM_ICPSC_DIV1;
  sSlaveConfig.TriggerFilter = 0;
  HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig);

  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
  sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1);

  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_2);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);

  //Enable interrupt
  HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2);
  HAL_TIM_IC_Start(&htim1, TIM_CHANNEL_1);
}
和中断处理程序

void tim_irq()
{
    period = HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_2);
    pulse = HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_1);

    //First irq to be ignored
}

您可以计算代码在中断中的周期,并为中断延迟(10-20?)添加额外的周期。然后你可以看到你的最大捕获频率是多少。我打赌它将接近400Khz


我认为,如果STM-F401以80Mhz的频率运行,这是不可能做到的。

如果硬件中有计数器,请以固定的间隔监控其计数。您好,在我的中断程序中,只有一个变量在递增
void HAL_TIM_IC_CaptureCallback(*htim){edgeCounter++}
。我让程序运行大约100ms,然后根据
edgeCounter
的数量计算频率。它能够感知2.9MHz的频率,但在5kHz左右总是存在不确定性。正如我从代码中看到的,检测到的边的数量有很大的变化。在216MHz运行的STM32F7上使用TIM2/TIM5和这种方法,我能够测量从几Hz到几MHz的PWM信号。谢谢你分享这个代码!