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

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

 

  • 15
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在STM32上生成方波,可以使用定时器模块。以下是在Keil环境下使用STM32定时器模块生成方波的步骤: 1. 打开Keil,并创建一个新项目。 2. 选择STM32的芯片型号,并设置时钟频率等参数。 3. 在Keil的Project窗口中右键单击“Source Group 1”,并选择“New Item”。 4. 在弹出的“Add New Item”窗口中选择“C Source File”,并命名为“main.c”。 5. 在main.c文件中添加以下代码: ```c #include "stm32f10x.h" int main(void) { // 初始化GPIO口 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化定时器 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; // 定时器周期为1000 TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 时钟分频为7200 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 启动定时器 TIM_Cmd(TIM2, ENABLE); while(1) { // 将GPIO口输出设置为定时器计数器的值 GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(TIM2->CNT & 0x01)); } } ``` 6. 编译并下载代码到STM32芯片中。 7. 将PA0引脚接到示波器上,可以看到输出方波信号。在本例中,方波频率为1kHz,占空比为50%。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值