使用stm32定时器的门控模式捕获外部脉冲个数(测频)

1.硬件信息

使用的是STM32F103ZET6芯片,使用STM32CUBEIDE进行配置。

2.软件配置

这里使用到了两个定时器:通用定时器TIM3和通用定时器TIM4,TIM3用于定时产生1s周期的信号,TIM4用于捕获外部脉冲进行计数。系统时钟为72Mhz。TIM3为主模式,TIM4为从模式。

TIM3具体配置如图所示:分频系数为7200,也就是周期为0.01us,计数周期为10000,所以总的定时时长为1s.

这里选择TIM3的CH1作为输出,该输出作为TIM4的触发源,TIM4选择外部触发的脉冲作为TIM4的时钟源进行计数。TIM3必须要有一个通道输出信号!!!

TIM4的具体配置如图:选择TIM4模式为门控模式(也可以为触发模式),

因为TIM3和TIM4的内部连接关系如图所示:

所以选择ITR1作为触发源。选择ETR2即外部触发脚作为时钟源,将信号发生器的管脚连接到ETR2。

3.程序代码

创建局部变量Counter,对外部输入的脉冲进行计数。在main.c中,主要程序为:

uint16_t Counter;

  HAL_TIM_Base_Start_IT(&htim3);//开启定时器3 
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);//TIM3 CH1输出PWM
  HAL_TIM_SlaveConfigSynchro(&htim4, TIM_SLAVEMODE_GATED);//配置TIM4从模式为门控模式
  HAL_TIM_Base_Start(&htim4);//开启定时器4

在stm32xxx.it.c文件中,声明在main.c的变量Counter和TIM4

extern TIM_HandleTypeDef htim4;
extern uint16_t Counter;

在it.c文件的中断响应函数  TIM3_IRQHandler的程序为:

     

void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */
	HAL_TIM_Base_Stop_IT(&htim3);//停止定时器3中断
	HAL_TIM_Base_Stop(&htim4);//停止TIM4计数
	Counter=__HAL_TIM_GET_COUNTER(&htim4);//读取Counter的值,即外部脉冲个数


 //TIM_ClearITPendingBit(TIM3, TIM_IT_UPDATE);
  /* USER CODE END TIM3_IRQn 0 */
  HAL_TIM_IRQHandler(&htim3);
  /* USER CODE BEGIN TIM3_IRQn 1 */

  /* USER CODE END TIM3_IRQn 1 */
}

在Counter=__HAL_TIM_GET_COUNTER(&htim4)处设置断点,即可读取到外部输入的脉冲个数。

测频原理参考文章:用STM32定时器测量信号频率——测频法和测周法[原创cnblogs.com/helesheng] - helesheng - 博客园

这里使用TIM3产生的信号作为标准信号,选择TIM4外部输入信号作为被测信号。根据被测信号和标准信号频率的关系:可知当标准信号fc1为1时,Counter值应为被测信号频率。

使用信号发生器进行验证:当信号发生器的频率为1000HZ时,读取到的Counter值如图所示:为1000,说明该方法可行。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值