stm32F4 pwm 输入捕捉高频信号约。 2兆赫?
Posted
技术标签:
【中文标题】stm32F4 pwm 输入捕捉高频信号约。 2兆赫?【英文标题】:stm32F4 pwm input capture of high frequency signal approx. 2MHz? 【发布时间】:2017-05-06 20:35:54 【问题描述】:我想测量 PWM 信号的频率。为此,我使用了 STM-F401RE 及其 Timer_Input_Capture 函数。
问题是:
输入信号具有相当高的频率(约 2MHz),并且, STM-F401RE 控制器只有 80MHz 时钟因此,当使用中断程序计算输入信号的上升沿数时,它会错过许多上升沿(取决于输入信号的频率)。在使用示波器并切换 I/O 引脚时,我看到它只能在频率低于 400kHz 时捕获所有上升沿。
问题是:如何克服这个问题?还是有其他方法可以测量高频输入 pwm 信号?
谢谢
【问题讨论】:
如果您的硬件中有计数器,请以固定的时间间隔监控其计数。 【参考方案1】:您需要将定时器设置为 PWM 输入而不是捕获输入(例如 TIM1 可以做到)。这样,使用了 2 个通道(但您只有一个物理连接)。基本上,第一个通道会给你周期,第二个通道会给你脉搏。计数器会自动重置。
初始化函数:
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
【讨论】:
在运行频率为 216MHz 的 STM32F7 上使用 TIM2/TIM5 和这种方法,我能够测量从几赫兹到几MHz 的 PWM 信号。感谢您分享此代码!【参考方案2】:您可以计算代码在中断中占用的周期,并添加额外的中断延迟周期(10-20 ?)。然后你可以看到你的最大捕获频率是多少。我敢打赌它会接近 400Khz。
我认为 STM-F401RE 以 80Mhz 运行是无法做到这一点的。
【讨论】:
嗨,在我的中断例程中,只有一个变量被递增。void HAL_TIM_IC_CaptureCallback( *htim) edgeCounter++;
我认为这样做不需要太多周期。我让程序运行大约100ms,然后根据edgeCounter
的数量计算频率。它能够感应到 2.9MHz 的频率,但在 5kHz 左右总是存在不确定性。正如我从代码中看到的,检测到的边缘的数量有很大的变化。以上是关于stm32F4 pwm 输入捕捉高频信号约。 2兆赫?的主要内容,如果未能解决你的问题,请参考以下文章
stm32f429用它的tim口能输出100MHZ的pwm信号吗