使用STM32和PWM实现方波输出,并通过定时器输入捕获模式测量周期(cubeMX keil配置)

前言:本文章用cubeMX和keil来进行代码编写,实现STM32的相应功能

本文章使用的STM32核心板是STM32H743VIT6,如果使用的是其他的核心板操作过程类似,可以尝试使用此教程。

1.cubeMX的配置

1.1打开cubemx 界面

(1)首先点击左侧的Timers

 (2)选择一个定时器配置PWM

我选择的是TIM5,如上图

点击TIM5

Mode的配置如下 :

注意选择一个通道 并设置成“PWM Generation CH2”

我选择的是channel2

下方配置如下:

再点击NVIC Settings,并勾选对勾,如下

(3)选择另一个定时器配置输入捕获模式 

我选择的是TIM4

点击TIM4

Mode的配置如下:

选择一个通道并设置成“Input Capture direct mode”

这里我选择的是channel2

下方配置如下

 再点击NVIC Settings,并勾选对勾,如下

到这里,全部配置就结束了 ,点击生成代码

2.定时器输入捕获模式的讲解 

对此我通俗的介绍一下我对定时器捕获模式的理解:

一.首先,在“1”处 设置为上升沿捕获,这么做目的是为了检测到即将到来的上升

二.然后,在“2”处 他检测到了波的上升,捕获此状态并记录此时计时器的值

三.接下来 在“3”处设置为下降沿捕获,这么做目的是为了检测到即将到来的下降

四.之后  在“4”处  他检测到了波的下降,捕获此状态并记录此时计时器的值

五.计算时间,两次计数器的值之差就是这个高电平的脉宽, 进而可以得出高电平时间

 

3.代码编写

 

在main.c文件中编写

 首先定义变量

/* USER CODE BEGIN PTD */
uint32_t capture_cnt=0;      //状态的标志
uint32_t capture_Buf[4]={0};  //数组用来把值存在里面
float high_time=0;            //高电平的时间
float low_time=0;             //低电平的时间
float period_time=0;          //周期
/* USER CODE END PTD */

第二步,开启PWM

 

 /* USER CODE BEGIN 2 */
                                 
HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_2);  //开启PWM  

  /* USER CODE END 2 */

之后,在while(0)中写下代码

while (1)
  {
		if(capture_cnt==0)
{
		capture_cnt++;
	__HAL_TIM_SET_CAPTUREPOLARITY(&htim4,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);                 //设置成上升沿捕获
		HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2);	      //开启输入捕获
		break;
}
else    if(capture_cnt==4)
{
		high_time = capture_Buf[1]- capture_Buf[0];       //计算高电平时间
		low_time=		capture_Buf[2]- capture_Buf[1];   //计算低电平时间
		period_time=	capture_Buf[2]- capture_Buf[0];     //计算周期
		high_time=high_time*1;
		low_time=low_time*1;
		period_time=period_time*1;
	
	printf("period_time=%.2f\r\n",period_time);           //计算周期
		capture_cnt = 0;                                  //清空标志位
		break;
}
				
	}

 下方添加中断回调函数

/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)   //中断回调函数
{
	
	if(TIM4 == htim->Instance)
	{
		if(capture_cnt==1)
{
				capture_Buf[0] = HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_2);                       //高电平捕获,记录此时的值
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim4,TIM_CHANNEL_2,TIM_ICPOLARITY_FALLING);             //设置成下降沿捕获
				capture_cnt++;
				break;
}
 else	    if(capture_cnt==2)
{
				capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_2);                       //低电平捕获,记录此时的值
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);  //设置上升沿捕获
				capture_cnt++; 
}
 else       if(capture_cnt==3)
{
		    capture_cnt++;
			  capture_Buf[2] = HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_2);                       //高电平捕获,记录此时的值
			  HAL_TIM_IC_Stop_IT(&htim4,TIM_CHANNEL_2);                                               //停止捕获
		break;
}
		}
	
	}
	
}
/* USER CODE END 4 */

之后连接单片机和烧录器,烧录即可

4.结果实现

TTL串口将电脑和单片机相连,打开串口调试软件,

同时打开仪器设备信号源,信号源两条线一条接到TIM4 channel2对应的引脚,另一条接到GND

自行输入方波的周期,在串口调试软件上便能看到你输入的周期 

 

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32和PWM实现方波输出,并通过定时器输入捕获模式测量周期(cubeMX keil配置)

发表评论