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
",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
自行输入方波的周期,在串口调试软件上便能看到你输入的周期