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

bie*_*nle 3 stm32 stm32f4discovery stm32f4

我想测量PWM信号的频率.为此,我使用STM-F401RE及其Timer_Input_Capture函数.

问题是:

  • 输入信号具有相当高的频率(约2MHz),
  • STM-F401RE控制器只有80MHz时钟

因此,当使用中断程序计算输入信号的上升沿数时,它会错过许多上升沿(取决于输入信号的频率).当使用示波器并切换I/O引脚时,我发现它只能在频率低于400kHz时捕获所有上升沿.

问题是:如何克服这个问题?还是有另一种方法来测量高频输入pwm信号?

谢谢

Gui*_*hel 7

您需要将定时器设置为PWM输入而不是捕获输入(例如,TIM1可以执行此操作).这样,使用了2个通道(但您只有一个物理连接).基本上,第一个通道将为您提供周期,第二个通道将为您提供脉冲.计数器会自动重置.

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);
}
Run Code Online (Sandbox Code Playgroud)

和中断处理程序

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

    //First irq to be ignored
}
Run Code Online (Sandbox Code Playgroud)