STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

这篇具有很好参考价值的文章主要介绍了STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期



本篇博客以STM32F103C8为例,其他系列MCU可能稍有不同,但原理一样。

相关链接博文:

  • STM32CubeMX | STM32使用HAL库实现定时器PWM输出
  • STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量

1、介绍

以前写过一篇博文,介绍的是如何使用定时器的输入捕获功能测量脉冲的宽度以及周期,适合测量某个脉冲或者测量按键按下时候的保持时间(见上面链接博客),不适合测量连续输出的脉冲场景。

STM32的定时器还存在一个PWM输入模式,只要将未知PWM波接入到定时器输入模式的引脚上,会自动算出占空比和周期,相当于示波器探针了。


2、STM32CubeMX配置

2.1 基本配置

使用的是STM32F103C8,时钟配置到72M主频:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量
使能串口1,用于调试打印:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量

2.2 PWM输出配置

想要测试PWM输入功能对不对,那么首先要让定时器生成一路用于测试的PWM脉冲,这里我利用TIM4的通道2输出一个10KHz、占空比50%的PWM波,PWM输出到PB6引脚上:

定时器分频系数设置为72,72MHz/72=1MHz的计数频率,重载值设置为100,则1MHz/100=10KHz的计数频率。

因为将重载设置为了100,设置脉冲0~100的范围就正好是占空比0%至100%。

Pulse设置的是有效电平的时间,

将Pulse设置为50,有效时间正好占用一半,此时的占空时间也就是50,占空比就为50/100=0.5=50%

如果将脉冲设置为80,那么有效时间是80,占空时间就是20,占空比就为20/100=0.2=20%

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量

2.3 PWM输入捕获配置

将TIM2配置为PWM输入模式,我是使用的PWM输入通道2,也就是PA1引脚。

PWM输入模式开启后,会使用到通道一和通道2,一路用于捕获上升沿、一路用于捕获下降沿,这里要注意!

设置为72分频得到1MHz的计数频率,TIM2计一个数就是1us,这样设置比较好计算。

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量

使能TIM2的全局中断:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量

生成代码即可~!


3、程序修改和测试

uint32_t uiDutyCycle;
uint32_t uiCycle;
uint32_t uiFrequency;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == htim2.Instance)
	{
		switch(htim->Channel)
		{
			case HAL_TIM_ACTIVE_CHANNEL_1:
				uiDutyCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);      /* 占空比 */
				break;
			case HAL_TIM_ACTIVE_CHANNEL_2:
				uiCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);          /* 周期 */
				break;
			default:break;
		}
	}
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM2_Init();
    MX_USART1_UART_Init();
    MX_TIM4_Init();

    HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);   /* 使能定时器4通道1输出PWM波 */
	
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);  /* 使能定时器2通道1的PWM输入捕获 */
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);  /* 使能定时器2通道2的PWM输入捕获 */

    while(1)
    {
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
		HAL_Delay(500);
		uiFrequency = 1000000 / uiCycle;
		printf("占空:%dus    周期:%dus    频率:%dHz    \r\n", uiDutyCycle, uiCycle, uiFrequency);
    }
}

int fputc(int ch, FILE* fp)
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
	return ch;
}

先用示波器接到PB6引脚上,看看TIM4输出的10KHz对不对:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量

验证后没问题,然后将PB6接到PA1引脚上。

再看串口输出的测量结果:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量

基本准确,但是存在误差!

在程序中将脉冲改为80,那么此时的PWM波,一个周期内的高电平时间是80,低电平时间是20,则占空比就是20%:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量

在看输出结果:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期,单片机,stm32,单片机,嵌入式硬件,PWM输入,脉冲宽度测量

没问题,捕获的正确~!


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

到了这里,关于STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32 HAL库 通用定时器介绍及相关应用例程 定时器中断 输出PWM (点亮LED呼吸灯、输出PWM、输入捕获) CubeMX

    (部分图引自于ATK) 前情提要(基本定时器) 点此进入 通用定时器类别 通用定时器和基本定时器相比大致的工作方式是相似的,不过通用定时器比基本定时器多了一些很好用的功能,比如: 外部输入捕获 输出比较 输出PWM 时钟源 CubeMX为我们提供了配置时钟的非常方便的工

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

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

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

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

    2024年02月02日
    浏览(82)
  • STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波

    开发板(STM32F407G-DISC1) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407 通用定时器生成可变占空比PWM波形,并将其输出到LED灯引脚实现呼吸灯效果 STM32F407有10个通用定时器,其中TIM2、TIM3、TIM4和TIM5有4个捕获

    2024年02月03日
    浏览(35)
  • 定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

    我用的单片机是STM32F103CBTX 定时器:使用PWM输出的模式 ADC:使用DMA的模式 (在不使用DMA的情况下,定时器控制ADC进行数据采集只能是单通道!如果开启了多通道,读取到的ADC采集值只会是最后一个通道的值!所以,要想使用定时器控制ADC采集 多通道 , 必须使用DMA !)  看

    2024年04月10日
    浏览(46)
  • STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

    输入捕获可以对 输入的信号的上升沿、下降沿或者双边沿进行捕获 ,常用的有 测量输入信号的脉宽 和 测量PWM 输入信号的频率 和 占空比 这两种。 输入捕获的原理 就是,当捕获到信号的跳变沿的时候,把计数器CNT 的值锁存到捕获寄存器CCR 中,把前后两次捕获到的CCR 寄存

    2023年04月14日
    浏览(96)
  • 【STM32】定时器PWM模式详解

    PWM模式: PWM模式1,向上计数时,PWM信号从 有效电平 变为 无效电平 PWM模式2,向上计数时,PWM信号从 无效电平 变为 有效电平 PWM极性: 极性为高时, 高电平为有效电平 ,低电平为无效电平 极性为低时, 低电平为有效电平 ,高电平为无效电平 中心对齐模式(先向上再向下

    2024年02月09日
    浏览(33)
  • STM32定时器的pwm1模式和pwm2模式的区别

    在向上计数时:一旦TIMx_CNTTIMx_CCR1时通道为有效电平,否则为无效电平。 在向下计数时:一旦TIMx_CNTTIMx_CCR1时通道为无效电平,否则为有效电平。 (总结:在PWM1模式下,无论是向上计数还是向下计数,TIMx_CNTTIMx_CCR1时通道为有效电平) 在向上计数时:一旦TIMx_CNTTIMx_CCR1时通道为

    2024年02月11日
    浏览(34)
  • STM32笔记——定时器输入捕获功能(测量PWM的频率和占空比)

    目录 一、概述 二、输入捕获功能 2.1 输入捕获简介 2.2 输入捕获通道  三、输入捕获功能测量PWM波的频率和占空比 3.1 测量频率的方法 3.2 测量过程         主要介绍通用定时器的输入捕获功能,输入信号由GPIO口进入输入捕获通道,之后输入部分对相应的TIx输入信号采样,并

    2024年02月06日
    浏览(69)
  • 一文搞懂STM32定时器翻转模式(产生多路频率、占空比的PWM)

    在STM32定时器配置中,我们知道可以将定时器配置为PWM输出模式,也叫输出比较模式,通过修改ARR寄存器中的值可以改变PWM周期,通过修改CCR寄存器中的值可以修改,PWM的占空比,但是这种普通的PWM输出模式较为单一,能输出PWM的定时器有4个通道,这种方式只能够产生4路周期

    2024年02月12日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包