【STM32】HAL库输入捕获测频率

系列文章目录

【STM32】HAL库 新建MDK工程
【STM32】HAL库 串口轮询发送
【STM32】HAL库 定时器中断
【STM32】HAL库 PWM驱动LED呼吸灯
【STM32】HAL库 定时器外部时钟


前言

使用测频法和测周法,测出信号的频率

一、测周法与测频法

测频法

在一段时间T内,计数上升沿的次数N
fx = N / T

测周法

在两个上升沿内,计数上升沿的次数N
fx = fc / N

两者优略

频率高时,适合用测频法
频率低时,适合用测周法
测周法只需要一个定时器,测频法需要两个

二、STM32CubeMX设置——测周法

在这里插入图片描述

设置PWM输出,频率为72Mhz / 720 / 100 = 1000Hz
CCR设为50

在这里插入图片描述

在这里插入图片描述

设置定时器为输入捕获模式,fc = 72MHz / 72 = 1MHz
fx = 10000000 / N

三、代码——测周法

  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  HAL_TIM_IC_Start(&htim3, TIM_CHANNEL_1);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		printf("Freq:%dHz",1000000 / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1) + 1));
		HAL_Delay(500);
  }
  /* USER CODE END 3 */

四、STM32CubeMX设置——测频率法

在这里插入图片描述
定时器4用于开启一段时间T的中断
T=720000000 / 7200 / 1000 = 0.1s = 100ms
在这里插入图片描述
开启外部时钟,用于计数N

五、代码——测频法

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
__HAL_TIM_CLEAR_FLAG(&htim1, TIM_SR_UIF);
HAL_TIM_Base_Start(&htim1);
HAL_TIM_Base_Start_IT(&htim4);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		 static uint16_t HisCount,CurCount;
   		HisCount = CurCount;
		CurCount = __HAL_TIM_GetCounter(&htim1);
		Count = CurCount - HisCount;
}
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		printf("Freq:%dHz",Count *10);
		HAL_Delay(500);
  }
  /* USER CODE END 3 */
<think>好的,我现在要解决用户的问题:如何使用STM32HAL实现PWM输入捕获频率。首先,我需要回忆一下STM32输入捕获功能,特别是PWM输入模式的相关知识。 根据用户提供的引用,比如引用[2]和[3],提到PWM输入模式和输入捕获模式的区别。PWM输入模式需要两个通道,可以同时频率和占空比,而普通的输入捕获模式可能只能频率或者需要其他方法。但用户的问题是关于PWM输入捕获频率,所以可能需要使用PWM输入模式。 首先,我需要确定使用哪个定时器。STM32的某些定时器支持PWM输入模式,通常是高级定时器如TIM1或TIM8,或者通用定时器。比如在引用[3]中提到的例子是TIM2,但可能用户的情况不同,需要具体配置。 接下来,配置步骤。根据引用[3],使用CubeMX配置时,需要开启定时器,并设置成PWM输入模式。具体来说,选择TIMx的通道1或通道2,然后配置为输入捕获模式,并启用相应的从模式,比如复位模式。 然后,在HAL中,输入捕获通常涉及中断或DMA。但根据引用[2],PWM输入模式可能占用两个通道,比如TI1和TI2,其中一个是直接,另一个是间接。这时候,定时器会自动将第二个通道配置为从模式,用于捕获周期和占空比。 配置完成后,需要编写中断处理函数,或者在主程序中读取捕获值。比如,当捕获到上升沿和下降沿时,计算时间差,从而得到周期和占空比。 另外,需要注意定时器的时钟频率和分频系数,以确保量的精度。例如,如果定时器时钟是84MHz,分频设为84-1,那么每个计数是1微秒,可以量更宽范围的频率。 可能还需要考虑溢出处理,当信号周期超过定时器的自动重装载值时,如何处理多次溢出的情况,这时候需要记录溢出次数,结合当前的计数值来计算总时间。 现在,我需要将这些步骤整理成一个清晰的教程,包括CubeMX配置和代码实现部分。同时,要确保代码示例正确,使用HAL的函数,比如HAL_TIM_IC_Start_IT()来启动输入捕获中断,以及在中断回调函数中处理捕获事件。 可能还需要提到,在PWM输入模式下,定时器会自动将两个通道配置为捕获不同的边沿,例如通道1捕获上升沿,通道2捕获下降沿,或者相反。然后通过读取两个通道的捕获值来计算周期和占空比。 最后,生成相关问题,比如如何量占空比,或者如何处理高频信号等,参考用户提供的示例中的问题结构。</think>### STM32 HAL PWM输入捕获频教程 #### 一、原理说明 PWM输入捕获模式利用定时器的从模式自动复位计数器,可同时捕获周期和占空比。该模式需要**两个输入通道**(如TIMx_CH1和TIMx_CH2),分别捕获上升沿与下降沿[^3]。频率的核心是获取PWM周期值$T$,通过公式$f=1/T$计算频率[^2]。 #### 二、CubeMX配置步骤 1. **选择定时器**:选择支持PWM输入模式的定时器(如TIM2) 2. **配置通道**: - 通道1设为`Input Capture direct mode`(直接捕获模式) - 通道2设为`Input Capture indirect mode`(间接捕获模式) 3. **从模式设置**: - 触发源选择`TI1FP1` - 从模式选择`Reset Mode`(计数器自动复位) 4. **参数设置**: - 预分频器(Prescaler):根据时钟频率调整(例如84MHz时钟,分频84-1→1us计数周期) - 自动重装载值设为最大(0xFFFF) - 捕获边沿:通道1上升沿,通道2下降沿 #### 三、代码实现 ```c // 1. 启动捕获 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); // 2. 中断回调函数 uint32_t period = 0; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { period = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); // 读取周期值 __HAL_TIM_SET_COUNTER(htim, 0); // 重置计数器 } } // 3. 计算频率 float get_frequency(void) { return (1.0 / (period * 0.000001)); // 假设分频后计数周期为1us } ``` #### 四、关键细节 1. **自动复位机制**:当检到上升沿时,计数器自动清零,此时通道2捕获的值为完整周期$T$[^3] 2. **抗抖动处理**:可添加软件滤波(配置输入滤波寄存器TIMx_CCMR1的IC1F位) 3. **高频信号处理**:若周期值超过自动重装载值,需启用溢出中断进行计数扩展
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youuuuvvu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值