STM32CubeMx配置定时器输入捕获测量PWM频率以及占空比

该博客介绍了如何使用STM32的TIM3通过输入捕获方式测量外部PWM波的频率和占空比。通过配置外部晶振、时钟频率、定时器及通道,设置上升沿触发定时器复位,捕获上升沿和下降沿,从而计算周期和占空比。在中断回调函数中更新计数,并在主函数中输出结果。实际应用中应注意预分频系数的选择以确保测量精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先选择外部晶振:

配置时钟频率:

选择使用的定时器:

根据内部原理图:

这里以TIM_CH1为例,当从CH1输入一个PWM波,通过输入滤波后将会产生两路信号:tim_ti1fp1 & tim_ti1fp2,分别送至tim_ic1 & tim_ic2,也就是说一个TI信号将会被映射成两路的IC信号,所以可以通过进行边沿检测来测量PWM的频率以及占空比。

具体步骤如下:

1、设置定时器Slave Mode为Reset Mode,也就是当检测到上升沿时,定时器复位;

2、PWM由CH1进入,触发源设置为TI1FP1,并设置IC1为上升沿捕获

3、当第一次捕获到上升沿时,定时器复位,计数寄存器CNT清零;

4、当IC2捕获到下降沿时,计数器CNT的值将会被存到捕获寄存器CCR2中;

5、当IC1再次捕获到上升沿时,计数器CNT的值将会被存到捕获寄存器CCR1中,同时将定时器复位;

因此,CCR1的值就是周期,CCR2的值就是占空比。

配置如下:

通道1设置为直接模式,通道2设置为间接模式。

 最终计算得到的频率值 = 分频后得到的时钟频率 / 上升沿个数 

                                          = ( 定时器时钟频率 / 预分频系数 )/ 上升沿个数 

最终计算的到的占空比 = 下降沿个数 / 上升沿个数;

值得注意的是:要明确输入PWM波的大致范围,因为需要根据PWM波范围来确定预分频系数;比如说输入一个频率大概为50Hz,占空比为10%的PWM波,需要将预分频系数稍微设置大一些;(这是因为:定时器所能测量到的最小频率 = 定时器频率 / ( 预分频系数 * 自动重载值 ),而因为ARR(Auto-Reload-Register)是一个十六位寄存器,其最大值为65536,所以当需要测量的频率值较小时,必须要将预分频系数设为较大值)

以本次使用定时器TIM3为例,其时钟频率已配置为84MHz,再配置PSC(Prescaler)为(8400-1),因此,最终频率 = ( 84000000 / 8400 )/  PWM_RisingCount;

参数配置:

再打开定时器中断:

 配置NVIC(Nested Vector Interrupt Controller):

 代码:

1、全局变量以及主函数

/* USER CODE BEGIN 0 */
uint16_t PWM_RisingCount;
uint16_t PWM_FallingCount;
float duty;
/* USER CODE END 0 */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      //每1秒输出一次
	  HAL_Delay(1000);
      //这里的10000就是由定时器频率84000000/预分频系数8400 得到
	  printf("PWM_Frequency = %d \r\n",(uint16_t)10000/PWM_RisingCount);
	  printf("PWM_Duty = %.2f %% \r\n",duty * 100);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 2、输入捕获中断回调函数

/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)    
    //注意这里为HAL_TIM_ACTIVE_CHANNEL_1而不是TIM_CHANNEL_1
	{
		PWM_RisingCount = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);
		duty = (float)PWM_FallingCount / PWM_RisingCount;
	}
	if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
	{
		PWM_FallingCount = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
	}
}
/* USER CODE END 4 */

最终结果如下:

(输入为另一块STM32产生的PWM波,频率为50Hz,占空比为5%,可以看到有些许误差,这是因为没有进行滤波的缘故)

<think>好的,我现在要帮用户解决如何使用STM32CubeMX配置STM32F407的PWM占空比的问题。首先,我得回忆一下之前学过的STM32CubeMX的知识和相关引用内容。用户提供的引用里有几个关于PWM配置的教程,我需要结合这些信息来构建回答。 首先,用户需要的是配置占空比的步骤,而占空比PWM中涉及定时器的自动重装载值(ARR)和捕获比较寄存器(CCR)。根据引用[3]提到的,系统时钟配置到168MHz,这可能影响定时器的时钟频率,进而影响PWM频率。所以步骤里应该包括时钟配置的部分。 接下来,定时器配置。引用[2]和[3]都提到使用CubeMX配置定时器的模式为PWM模式,所以需要指导用户选择正确的定时器和通道,设置预分频器(PSC)和ARR值。ARR决定了PWM的周期,而CCR对应占空比。这里需要详细说明如何计算这些值。 然后,生成代码的部分,引用[1]指出HAL库的函数可以减少CPU负担,所以需要提到HAL_TIM_PWM_Start函数来启动PWM,以及使用__HAL_TIM_SET_COMPARE来动态调整占空比。 用户可能还会关心如何验证配置是否正确,比如用示波器检查波形,或者通过LED亮度变化来观察。这部分可以作为验证步骤加入。 最后,生成相关问题的时候,需要考虑用户可能遇到的后续问题,比如调整频率、多通道配置、与中断或DMA结合使用,以及故障排除。引用[4]提到了DMA的使用,可能可以作为相关问题之一。 需要确保回答结构清晰,分步骤讲解,并且引用正确的参考资料。同时,避免使用专业术语过多,保持语言易懂。检查是否有遗漏的步骤,比如GPIO的配置或者NVIC设置,但根据引用内容,可能这些在CubeMX中自动完成,所以可以简要提及。 现在整理一下思路,分成几个步骤:系统时钟配置定时器参数设置、生成代码、占空比调整和验证。每个步骤引用对应的参考资料,并在最后添加相关问题。</think>### STM32F407使用STM32CubeMX配置PWM占空比教程 #### 一、系统时钟配置 1. 打开STM32CubeMX,选择STM32F407型号芯片 2. 配置RCC时钟源:`HSE(外部高速时钟)`选择Crystal/Ceramic Resonator[^3] 3. 在Clock Configuration界面将主频配置为168MHz(系统时钟树参数根据参考[3]设置) #### 二、定时器参数设置 1. 选择支持PWM定时器(如TIM1/TIM3等) 2. 配置定时器模式为`PWM Generation CHx` 3. 关键参数设置: - **Prescaler(预分频器)**:决定定时器时钟频率,例如设置`PSC=83`时,定时器时钟=168MHz/(83+1)=2MHz - **Counter Period(ARR)**:设置自动重装载值,如设为`1999`则PWM周期为$(1999+1)/2MHz=1ms$(对应1kHz频率) - **Pulse(CCR)**:初始占空比设置,如设为`1000`则初始占空比$D=1000/2000=50\%$ #### 三、生成代码与占空比调整 1. 生成MDK-ARM/IAR工程代码 2. 在用户代码中添加: ```c HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 启动PWM输出[^1] __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, new_CCR); // 动态修改占空比 ``` 3. 占空比计算公式: $$ D = \frac{CCR}{ARR + 1} \times 100\% $$ 其中ARR对应Counter Period值,CCR对应Pulse值 #### 四、验证配置 1. 使用示波器测量对应引脚波形 2. 或连接LED观察亮度变化(占空比与亮度成正比)
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值