STM32+PWM+输入捕获测频

外部时钟,主频64M

定时器1 通道1发出PWM波 频率1K

 定时器2 通道1输入捕获,上升沿触发

 

 

 串口

/* USER CODE BEGIN 0 */
uint32_t time_up_num=0;//上升沿计数
float time_frequency;//频率
/* USER CODE END 0 */

 初始换打开定时器

/* USER CODE BEGIN 2 */
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
	__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 300);
	HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断
	HAL_Delay(100);
  /* USER CODE END 2 */

 回调函数

/* USER CODE BEGIN 4 */
// 捕获中断回调函数,每次捕获到信号就会进入这个回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	// 判断是否是定时器2的外部捕获口1
	if(htim->Instance == TIM2)
	{
		if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1 )
		{
			time_up_num = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); // 读取捕获计数,这个时间即为上升沿持续的时间
			__HAL_TIM_SET_COUNTER(&htim2, 0); // 计数清零,从头开始计
		}
	}
}
/* USER CODE END 4 */

计算频率打印,若是想改变频率可设定定时器的计数

__HAL_TIM_SET_AUTORELOAD(&htim1, 499);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		time_frequency=1000000/time_up_num;//频率
		printf("frequency=%.2f\r\n",time_frequency);
		HAL_Delay(500);
//		__HAL_TIM_SET_AUTORELOAD(&htim1, 499);

  }

 前两个是频率为1KHz,后面修改了PWM的频率,即频率为2KHz。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值