STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)

这篇具有很好参考价值的文章主要介绍了STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

1.cubeMX的配置

1.1打开cubemx 界面

(1)首先点击左侧的Timers

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

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

我选择的是TIM5,如上图

点击TIM5

Mode的配置如下 :

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

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

我选择的是channel2

下方配置如下:

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

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

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

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

我选择的是TIM4

点击TIM4

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

Mode的配置如下:

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

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

这里我选择的是channel2

下方配置如下

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

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

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

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

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

pwm输入捕获要怎么配置?,stm32,嵌入式硬件,单片机

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

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

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

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

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

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

 文章来源地址https://www.toymoban.com/news/detail-827823.html

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

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

 

到了这里,关于STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F1定时器-PWM输出

    STM32 PWM工作过程 ARR寄存器决定PWM周期,CCR寄存器决定占空比 通道1为例 的PWM输出电路图 CCR1:捕获比较(值)寄存器(x =1,2,3,4):设置比较值。 CCMR1:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】 或者PWM模式2【111】 CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平

    2024年02月09日
    浏览(37)
  • STM32(7)-定时器输出PWM的原理分析

    概念+代码 OC(Output Compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的前3个通道额外拥有死区生成和互补输出的功

    2024年02月04日
    浏览(27)
  • STM32使用CubeMx配置定时器输出PWM

            项目中经常使用到STM32来输出PWM,每次配置过后过不了多久就会忘记,稍微需要对配置做出修改时都要翻很久的手册,所以决定结合实例把PWM配置的详细步骤记录下来,这样在下次配置时可以很快的捡起来。         本文档的行文结构如下,首先,说明实际需

    2024年02月03日
    浏览(34)
  • STM32使用高级定时器输出互补pwm波

    最近做的一个项目用到stm32,网上查了很多资料,也踩了很多坑,这里记录一下配置的步骤和说明 硬件使用的是stm32h750vbt6; 软件用到了stm32cubemx和keil5; 打开Debug模式方便调试,可以忽略,不影响代码运行 在用cube配置时钟源时,有下面三个选项 Disable(禁用) BYPASS Clock Sou

    2024年02月16日
    浏览(22)
  • stm32定时器输出pwm&IO口模拟pwm——呼吸灯

    什么是pwm波?pwm就是脉冲宽度调制,就是占空比可变的脉冲波形,通过改变占空比,输出不同的pwm波,就能实现许多有趣的功能,比如说我们生活中常见的呼吸灯就是通过这样实现的。接下来我们就以呼吸灯为例,学习stm32通过定时器输出pwm波和io口模拟输出pwm波。 控制方式就

    2024年01月18日
    浏览(27)
  • STM32高级定时器输出指定数量PWM(STM32CubeMx配置)

    高级定时器中有一个重复计数器,本实验输出指定个数PWM就是利用了重复计数器的特性,先来看看重复计数器的特性是什么: 计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件 这是什么意思呢,这里举个例子比如说我设定重复计数器的

    2024年02月02日
    浏览(41)
  • STM32笔记——定时器输出比较功能(产生PWM波)

    目录 一、概述 二、PWM简单介绍  三、通用定时器输出比较 3.1 输出比较简介 3.2 输出比较通道 3.3 产生PWM的过程 四、实验硬件介绍及PWM模块程序 4.1 舵机简介 4.2 直流电机及驱动芯片TB6612  4.3 PWM模块驱动程序         主要介绍通用定时器输出比较功能,在GPIO口输出PWM来控

    2024年02月13日
    浏览(17)
  • STM32TIM定时器PWM输出比较(适用于通用,高级定时器)

    在定时器中我们最常用的功能就是输出PWM,大多是用在电机控制方面,目前网络上相关资料也有很多,但是,很多不利于我们“现搜现用”我这里不是说我写的有多好,而是你搜索到此类文章时大部分是急于解决目前的问题,一段相关代码和讲解就行,当然不是学习背后的原

    2024年01月25日
    浏览(27)
  • STM32实战-高级定时器带死区的互补PWM输出

    前言: 平时我们设计点击驱动电路时,一般会采用npn和pnp三极管,来控制电机的导通和关闭,但是三级管内部自带电容,断电后不会立马断掉,会经过很小的一段时间才会放电完毕,这时候要留有死区给电容放电,这就有了互补pwm波。   同时,当电机出现故障,如果利用软

    2024年02月08日
    浏览(20)
  • stm32f407单一定时器输出四路PWM波

    最近在玩遥控器多路pwm捕获,顺带着写了一下pwm波输出的代码,下面我来说一下407板子输出pwm波的具体配置及函数说明。 输出效果如下。PS:因为我的分析仪只能接一个,就只看一路的输出 1、开启时钟及定时器引脚复用 在输出PWM波时要开启定时器时钟及GPIO时钟,本例以TI

    2024年02月12日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包