cube配置定时器ETR2模式测频实验

一、设计方案:

1、STM32F1系列共有8个定时器,选取两个通用定时器进行配置;
2、一个定时器用作1S定时,一个配置为外部时钟模式2;
3、ETR2模式下会对信号上升沿进行计数。

1、通用定时器框图:cube配置定时器ETR2模式测频实验_第1张图片

2、具体配置及原理:

(1)、配置TIM4为ETR2模式,选择极性,触发控制器进行计数,CNT值满后进入定时器中断溢出。因为计数器只有16位,记65536次便会溢出,在中断服务函数中定义一个变量对溢出值进行储存,大大增加了测频的上限。
(2)、配置TIM5定时1S进入中断,在中断中对数据进行处理打印。

3、cubeMX配置

cube配置定时器ETR2模式测频实验_第2张图片
cube配置定时器ETR2模式测频实验_第3张图片
cube配置定时器ETR2模式测频实验_第4张图片
cube配置定时器ETR2模式测频实验_第5张图片
cube配置定时器ETR2模式测频实验_第6张图片

二、程序代码

    HAL_TIM_Base_Start(&htim4); //main.c中开启定时器及中断
	HAL_TIM_Base_Start(&htim5);
	HAL_TIM_Base_Start_IT(&htim4);	
	HAL_TIM_Base_Start_IT(&htim5);
	
	void TIM4_IRQHandler(void)
    {
	  /* USER CODE BEGIN TIM4_IRQn 0 */
	
	  /* USER CODE END TIM4_IRQn 0 */
	  HAL_TIM_IRQHandler(&htim4);
	  /* USER CODE BEGIN TIM4_IRQn 1 */
	  __HAL_TIM_CLEAR_FLAG(&htim4,TIM_FLAG_UPDATE); //清除更新中断标志位
	
				count_x ++ ;  						//计数器溢出后变量进行自加
	
	  /* USER CODE END TIM4_IRQn 1 */
	}
	void TIM5_IRQHandler(void)
	{
	  /* USER CODE BEGIN TIM5_IRQn 0 */
	
	  /* USER CODE END TIM5_IRQn 0 */
		HAL_TIM_IRQHandler(&htim5);
	  /* USER CODE BEGIN TIM5_IRQn 1 */
		__HAL_TIM_CLEAR_FLAG(&htim5,TIM_FLAG_UPDATE);
	
	  	count_ms = TIM4->CNT;                       //读取计数器未溢出数
		count_s = count_x*65536 + count_ms;			//溢出数*65536+未溢出数
		count_c = count_s+(count_s*0.00137);        //数据修正
		printf("%d HZ \r\n ",count_c);	            //打印数据
	
		count_x=0;
		TIM4->CNT=0;
	
	  /* USER CODE END TIM5_IRQn 1 */
	}

三、测试结果

cube配置定时器ETR2模式测频实验_第7张图片
身边条件有限,最大只测到5MHz,故目前来看测量范围在1HZ到5MHz都较为准确,测量误差值最大为0.02%。

若有概念错误或陈述不清处,请指正。。

你可能感兴趣的:(STM32)