【STM32】HAL库 STM32G474定时器输入捕获获取频率和占空比 IDE(STM32CubeIDE)

一.输入捕获概念

输入捕获模式可以用来测量脉冲宽度或者测量频率。

二.基于NUCLEO-G474RE开发板新建工程

2.1 打开 STM32CubeMX 软件,新建工程.

我这里选择的是我的开发板
我手里有开发板所以选择基于开发板。

2.2 选择开发板(芯片)

我这里选择的是我的开发板NUCLEO-G474RE,少去一些步骤。
在这里插入图片描述

2.3 配置TIM1

配置TIM1产生100kHz的PWM,对应管脚PC0。
F= Tclk/[(psc+1) * (cnt+1)] = 170MHz/[1*1700] = 100kHz。

在这里插入图片描述

2.4 配置TIM2

参考自数据手册 PWM input mode

在这里插入图片描述
输入捕获的配置
在这里插入图片描述

2.5配置一下时钟树.

在这里插入图片描述

2.6生成代码.

在这里插入图片描述
在这里插入图片描述

三.编写代码

  1. 定义变量
/* USER CODE BEGIN PV */

uint16_t PRE1=1700;
uint16_t CMP1=500;
uint32_t capture_Buf[4] = {0};   //存放计数
uint32_t capture_Buf1[4] = {0};   //存放计数
uint8_t capture_Cnt = 0;    //状标志位
float duty_cycle;  //占空
uint32_t frequency;  //频率

/* USER CODE END PV */
  1. 开启定时器TIM1和TIM2
  /* USER CODE BEGIN 2 */
  
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动频率捕获(上升沿捕获)
  HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); //启动频率捕获(下降沿捕获)
  
  /* USER CODE END 2 */
  1. while 循环中调节TIM1 PWM的频率和占空比
/* USER CODE BEGIN 3 */

  	//TIM1->PSC=0;
	TIM1->ARR=PRE1-1;
	TIM1->CCR1=CMP1-1;
  1. 核心代码(中断回调函数)
/* USER CODE BEGIN 4 */

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{

	// 获取频率
				if(TIM2==htim->Instance)
				{
				 if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1 )
				  {
				    if(capture_Cnt == 0)
				    {
				      /* Get the 1st Input Capture value */
				    	 //capture_Buf[0] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);

				    	 assert_param(IS_TIM_CC1_INSTANCE(htim2->Instance));
				    	 capture_Buf[0] =  htim->Instance->CCR1;
				    	 capture_Buf1[0] =  htim->Instance->CCR2;
				    	 capture_Cnt = 1;
				    }
				    else if(capture_Cnt == 1)
				    {
				      /* Get the 2nd Input Capture value */
				    	// capture_Buf[2] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
				    	 assert_param(IS_TIM_CC1_INSTANCE(htim2->Instance));
				    	 capture_Buf[2] =  htim->Instance->CCR1;
				    	 capture_Buf1[2] =  htim->Instance->CCR2;
				    	 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动频率捕获
				      /* Capture computation */
				      if (capture_Buf[2] > capture_Buf[0])
				      {
				        capture_Buf[3] = (capture_Buf[2] - capture_Buf[0]);
				        capture_Buf1[3] = (capture_Buf1[2] - capture_Buf[0]);
				      }
				      else if (capture_Buf[2] < capture_Buf[0])
				      {
				        /* 0xFFFF is max TIM1_CCRx value */
				        capture_Buf[3] = ((0xFFFF - capture_Buf[0]) + capture_Buf[1]) + 1;
				        capture_Buf1[3] = ((0xFFFF - capture_Buf[0]) + capture_Buf1[1]) + 1;
				      }
				      else
				      {
				        /* If capture values are equal, we have reached the limit of frequency
				           measures */
				        Error_Handler();
				      }

				      /* Frequency computation: for this example TIMx (TIM1) is clocked by
				         APB2Clk */
				      frequency = HAL_RCC_GetPCLK2Freq() / capture_Buf[3];
				      duty_cycle=capture_Buf1[3]*100/capture_Buf[3];
				      capture_Cnt = 0;
				    }
				  }

				}
}

/* USER CODE END 4 */

四.调试结果

这里就没有使用串口打印出来了,如果想打印出来请参考串口printf。
在这里插入图片描述
思考🤔:在没有信号输入到时候咋个处理???

  • 2
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
STM32G070是STMicroelectronics推出的一款32位微控制器系列产品,支持多种功能和接口,具有较高的性能和灵活性。CubeIDE是用于开发STM32芯片的集成开发环境,可提供丰富的代码生成和调试工具。 PWM(脉冲宽度调制)是一种常用的数字信号产生技术,可以通过调整脉冲的高电平时间和低电平时间,来控制输出信号的平均电平。它在许多应用中用于控制电机的转速、LED的亮度等。 DMA(直接内存访问)是一种高效的数据传输方法,它可以在不需要CPU干预的情况下,直接在外设和内存之间进行数据的传输,提高了系统的效率。 互补输出是指两个输出信号的相位差为180度,一般用于控制电机的正反转。在STM32G070中,可以通过使用PWM和DMA来实现互补输出。 首先,我们可以使用CubeIDE来配置PWM输出。通过配置TIM(定时器)的通道和周期,我们可以设置PWM的频率占空比。在通道配置中,我们可以选择使用互补模式,使得两个通道的输出相位差为180度。 接下来,我们可以使用DMA来实现对PWM的互补输出的控制。通过配置DMA通道和源目的地址,我们可以实现从内存中读取数据,并将其传输到PWM的CCR(通道比较寄存器)中,从而控制输出信号的占空比。通过配置DMA的循环模式,我们可以实现自动循环传输数据,从而实现连续的PWM输出。 总结来说,通过在STM32G070中使用CubeIDE来配置PWM和DMA,我们可以实现互补输出。PWM可以控制输出信号的频率占空比,而DMA可以实现高效的数据传输,从而提高系统的性能和效率。这对于控制电机的正反转等应用非常有用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

藤一泓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值