STM32使用CubeMx配置定时器输出PWM

这篇具有很好参考价值的文章主要介绍了STM32使用CubeMx配置定时器输出PWM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 概述

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

        本文档的行文结构如下,首先,说明实际需求,即要输出什么样的PWM信号;然后,根据需求把手册中相关的部分摘抄下来并辅以个人的理解和总结;最后,详细说明在软件中怎么去配置并展示配置后的实验效果。

2 需求

        项目中用到4路PWM信号,硬件条件决定了其只能由定时器1和定时器3产生,每个定时器输出两路PWM信号,要求4个PWM信号相位同步,每个PWM信号如图1所示。

cubemx设置pwm输出,stm32

图1 PWM输出波形要求

        具体要求见表1。

        表1 PWM要求

序号 名称 要求 备注

1

周期

100us

暂定

2

占空比

0~100%可调

3

中断触发时刻

计数器下溢点

4

占空比更新时刻

计数器下溢点

3 STM高级定时器原理

cubemx设置pwm输出,stm32

图 2高级定时器的原理框图

        图中用红色虚线框出来的部分是输出PWM所需要的部分,包括时钟源、计数器单元、比较寄存器及PWM输出、TRGO输出、外部触发输入,下面依次说明各部分原理。

3.1 时钟源

计数器时钟可由以下时钟源提供:

  • 内部时钟(CK_INT)
  • 外部时钟模式1:外部输入引脚
  • 外部时钟模式2:外部触发输入ETR
  • 外部触发输入(ITRx)

输出PWM使用内部时钟(CK_INT),只需要关心怎么配置为内部时钟以及内部时钟的频率

 3.2 计数器单元

        时钟源输出的时钟经过预分频器分频后作为计数器的时钟。计数器在时钟下可以增计数、减计数、增/减计数。自动重载寄存器控制计数器的计数范围,即定时器的周期。重复计数器控制更新事件UEV产生的频率。

3.2.1 预分频器

        预分频器用于对计数器时钟进行分频,分频系数可配置为1~65536。分频系数可以动态修改,不过其具有缓冲功能,修改后的分频系数只能在下一次更新事件UEV后生效(见3.2.3节)

3.2.2 计数器

1)计数器可以增计数、减计数、增\减计数。

  • 增计数的范围为0~自动重装值(TIMx_ARR寄存器的值),计数值为自动重装值时产生上溢事件,定时器周期=T_CK_CNT*(自动重装值+1)
  • 减计数的范围为自动重装值(TIMx_ARR寄存器的值)~0,计数值为0时产生下溢事件,定时器周期=T_CK_CNT*(自动重装值+1)
  • 增\减计数的范围为0~自动重装值(TIMx_ARR寄存器的值)~1,计数值为自动重装值-1时生成上溢事件,计数值为1时生成下溢事件。计数器周期=T_CK_CNT*自动重装值*2

2)自动重装值可以配置为预装载或者不预装载。不预装载时,自动重装值实时生效;预装载时,自动重装值在下一次更新事件UEV后生效(见3.2.3节)

3)增/减计数有3种,分别为中心对称模式1/2/3,区别在于输出比较中断标志触发的位置不同,具体见手册。

3.2.3 重复计数器及更新事件(UEV)的产生

1.重复计数器

        重复计数器仅用来控制更新事件的产生。它是一个自动重装的减计数器,更新事件UEV时自动重装,重装值为RCR寄存器的值。每次上溢或下溢事件时重复计数器减1。

2.更新事件的产生

         更新事件(UEV)可以被屏蔽或者启用(TIM_CR1的UDIS位)。被屏蔽的情况下不会产生任何更新事件;被启用的情况下,有两种情况可以产生更新事件,分别为外部触发和计数器内部触发。

        外部触发不受重复计数器的影响,只要触发则立即产生更新事件。外部触发有两种,分别为软件向TIM_EGR的UG位写1和外部触发输入(见3.5节)。

        计数器内部触发受重复计数器的影响,只有重复计数器等于0时才可以产生更新事件。在重复计数器等于0时以下三种情况可以产生更新事件:

  • 增计数时上溢事件时产生更新事件;
  • 减计数时下溢事件时产生更新事件;
  • 增\减计数时上溢和下溢均产生更新事件;

        结合重复寄存器的原理可知,每N(RCR寄存器的值)+1次上溢或者N+1

次下溢事件产生1次更新事件 。

3.增\减计数模式下如何控制更新事件(UEV)在上溢还是下溢产生?

        显然,增\减计数模式时如果配置重复寄存器RCR为奇数,更新事件将只能在上溢或下溢产生,那么该如何控制其在上溢还是在下溢产生呢?手册中写到:在启动计数器前写入RCR,则UEV将在上溢时产生,在计数器启动后写入RCR,则UEV将在下溢时产生

但经过实测试上述说法并不完全准确。实测结果如下:

  • 在启动计数器前对RCR写入1,UEV在上溢产生;
  • 在启动计数器前先对RCR写入1,再软件强制触发一个UEV,然后启动计数器,UEV将在下溢产生。(HAL库中有此操作,所以在CubeMx直接配置重复计数器为1,UEV仍在下溢产生);
  • 启动计数器后,在增计数过程中对RCR写入1,UEV在上溢产生;
  • 启动计数器后,在减计数过程中对RCR写入1,UEV在下溢产生

        可以这么理解,启动计数器后首先触发的是上溢事件,然后是下溢事件。因为重复计数器是一个在更新事件UEV时自动重装载的计数器,在启动计数器前写入的1并没有装载到重复计数器,所以启动计数器后更新事件UEV在上溢产生;如果在启动计数器前软件强制触发一个UEV事件,则在启动计数器时1已经写入重复计数器,所以更新事件UEV在下溢产生。

        至于启动计数器后写入RCR的现象则更好解释。因重复计数器只在UEV时更新,写入RCR后不会立马更新,所以增计数在上溢产生UEV事件然后更新重复计数器,减计数在下溢产生UEV事件然后更新重复计数器。

cubemx设置pwm输出,stm32

图 3不同模式和配置下的更新事件(UEV)的触发时刻

3.2.3 比较寄存器及PWM输出

        比较寄存器(TIM_CCRx)可以配置为预装载和不预装载。预装载时,只有在下一次更新事件UEV时比较寄存器的值才会生效,不预装载时,比较寄存器的值实时生效。配置为PWM模式时必须使能预装载(使用HAL库配置为PWM模式时默认已使能预装载)

        比较寄存器可以配置为PWM模式和其他模式。这里仅介绍PWM模式,其他模式见手册比较输出模式章节。PWM模式分为PWM模式1和PWM模式2。

PWM模式1时:

  • 计数器增计数时,计数器<TIM_CCRx则OCxREF输出高电平,否则输出低电平;
  • 计数器减计数时,计数器TIM_CCRx则OCxREF输出高电平,否则输出低电平

cubemx设置pwm输出,stm32

图 4 PWM模式1、中心对齐模式的PWM波形

PWM模式2时:

  • 计数器增计数时,计数器>TIM_CCRx则OCxREF输出高电平,否则输出低电平;
  • 计数器减计数时,计数器≧TIM_CCRx则OCxREF输出高电平,否则输出低电平。

        注意事项:不建议在运行中心对齐模式(增\减计数)时对计数器执行写操作,使用中心对称模式最为保险的方法为:在启动计数器前通过软件生成更新(对TIM_EGR的UG位写1)来初始化所有寄存器(HAL库中有此操作),并且不要在计数器运行过程中对其执行写操作

3.4 外部触发输出(TRGO)

        TRGO输出受TIM_CR2寄存器MMS位控制,具体如图5。

cubemx设置pwm输出,stm32

 图 5 TRGO输出配置

        MMS为010时,更新事件UEV作为TRGO输出,可用于同步其他定时器。

3.5 外部触发输入

        定时器配置为从模式可与外部触发输入同步,有三种同步模式,分别为复位模式、门控模式和触发模式,这里仅介绍复位模式,其他模式见手册。复位模式:触发事件时,计数器和预分频器将重新初始化,同时还会生成更新事件UEV,所有的预装载寄存器将会更新。触发输入可选:

  • ITR0:内部触发0
  • ITR1:内部触发1
  • ITR2:内部触发2
  • ITR3:内部触发3
  • T1F_ED:TI1的边沿检测器
  • TI1FP1:滤波后的定时器输入1
  • TI1FP2:滤波后的定时器输入2
  • ETRF:外部触发输入

        其中ITR0~ITR3是从定时器的内部触发输入,是主定时器的TRGO输出。当定时器3作为从定时器时,它对应的内部触发输入来源如下:

表 2 定时器3作为从定时器时的触发输入来源

从定时器

ITR0

ITR1

ITR2

ITR3

TIM2

TIM1

TIM15

TIM3

TIM14

4 软件配置

        硬件条件决定了只能使用定时器1和定时器3各输出两路PWM信号。为实现同步,配置定时器3为从模式,使用定时器1的触发输出(TRGO)进行同步复位。

4.1 CubeMx中的配置

4.1.1 定时器1的配置

cubemx设置pwm输出,stm32

 图 6 CubeMx中定时器1的配置1

cubemx设置pwm输出,stm32

 图 7 CubeMx中定时器1的配置2

4.1.2 定时器3的配置 

cubemx设置pwm输出,stm32

图 8 CubeMx中定时器2的配置

4.2 程序中的配置

 cubemx设置pwm输出,stm32

 图 9 程序中的配置1

cubemx设置pwm输出,stm32

 图 10 程序中的配置2

5 实验效果

        实验结果如图10和图11所示,定时器1和定时器3的PWM输出同步,周期为10kHz,占空比为25%;定时器1的更新事件在下溢点触发,每个增\减计数周期触发1次。

cubemx设置pwm输出,stm32

图 11 实验效果1-PWM信号周期、占空比、同步关系

cubemx设置pwm输出,stm32

 图 12 定时器1更新事件UEV触发时刻

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

到了这里,关于STM32使用CubeMx配置定时器输出PWM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32CubeMX——定时器配置

    本文将会以STM32F103C8T6为例配置定时器2定时5 ms SMT32F1系列共有8个定时器: 基本定时器(TIM6、TIM7) 通用定时器(TIM2、TIM3、TIM4、TIM5) 高级定时器(TIM1、TIM8) 16位向上、向下、向上/下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为 1~6553

    2023年04月10日
    浏览(55)
  • STM32 HAL库 通用定时器介绍及相关应用例程 定时器中断 输出PWM (点亮LED呼吸灯、输出PWM、输入捕获) CubeMX

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

    2024年04月15日
    浏览(82)
  • STM32CubeMX学习四 之定时器配置

    记录一下STM32CubeMX的学习笔记,同时分享给初学的小白,希望一起进步。 如何使用STM32CubeMX以及工程创建在之前的博客有提到,这里就直接从定时器讲起。 编译环境:KEIL 代码生成:STM32CubeMX 库:HAL MCU:STM32F072 假设你的cubeMX工程已经建好,这里我们开始配置定时器2(TIM2),

    2024年02月01日
    浏览(39)
  • STM32开发(10)----CubeMX配置基本定时器

    本章介绍使用STM32CubeMX对基本定时器进行配置的方法,STM32F103高性能系列设备包括基本定时器、高级控制定时器、通用定时器、看门狗定时器和 SysTick 定时器,但是STM32F103C6t6上资源比较有限(高级定时器TIM1,通用定时器TIM2和TIM3),没有真正的基本定时器,其实通用定时器和

    2024年02月16日
    浏览(70)
  • 搭建stm32电机控制代码框架(二)——Stm32CubeMx配置定时器

    搭建了基础的环境,配置了一个简单的工程后,CubeMx的基本操作就会了。然后基于这个操作往下推进,开始对关键模块定时器的攻略,这个部分需要先熟悉一下Stm32的定时器基本原理。 《STM32参考手册》中仅对定时器的介绍就已经占了100多页,这里就不一一展开,挑一些关键

    2024年02月06日
    浏览(79)
  • 野火STM32电机系列(五)Cubemx配置高级定时器TIM1

    鸽了一段时间,放心不会断的哈,目前仅仅是显示屏坏了,不影响后面项目 前文已经配置了GPIO、编码器 本节讲解CubeMX高级定时器TIM1配置带死区的6路互补的PWM 同时配置信号触发后续ADC采集 板子引角的原理图如下 对应的: Motor1--U+--PA8--TIM1_CH1 Motor1--U---PB13--TIM1_CH1N Motor1--V+--

    2024年02月15日
    浏览(66)
  • 【STM32】定时器1触发ADC多(规则)通道采样+DMA(CUBEMX配置)

    在用单片机做电源控制时不得不提ADC采集,离散系统是有固定的执行周期的,所以我们采样也是要固定时间去采样。然后就是我希望pwm波(定时器1产出)的频率与采样频率一致。 我下面演示的是G431CBU6,当然其他芯片也大差不差了。 说一下大致流程,TIM1触发ADC采样,然后

    2024年02月01日
    浏览(46)
  • STM32CUBEMX配置 定时器中断 和 上升沿中断(实现检测1s以内的脉冲个数)

    ———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动,包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。

    2024年02月16日
    浏览(36)
  • STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

    本篇博客以STM32F103C8为例,其他系列MCU可能稍有不同,但原理一样。 相关链接博文: STM32CubeMX | STM32使用HAL库实现定时器PWM输出 STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量 1、介绍 以前写过一篇博文,介绍的是如何使用定时器的输入捕获功能测量脉冲的宽度以及周期,适

    2024年02月13日
    浏览(50)
  • 初出茅庐的小李博客之STM32CubeMx配置定时器的编码器模式

    上次文章写了编码器是如何工作的,今天就来用STM32F103C8T6的TIM3的通道1跟通道2编写一个编码器识别程序。 话不多说,上教程! 选择外部高速时钟源HSE 选择中断模式触发下降沿有效 默认是上拉输入 添加用户标签为SWITCH 使能NVIC配置 选择编码器模式 分频值设置为2-1 计数值设

    2024年02月12日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包