STM32+PWM+输入捕获测频

外部时钟,主频64M

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

STM32+PWM+输入捕获测频_第1张图片

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

 STM32+PWM+输入捕获测频_第2张图片

 STM32+PWM+输入捕获测频_第3张图片

 串口STM32+PWM+输入捕获测频_第4张图片

/* 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。

STM32+PWM+输入捕获测频_第5张图片

你可能感兴趣的:(stm32,单片机,嵌入式硬件)