STM32定时器(一)PWM输出

发布者:快乐家庭最新更新时间:2024-08-12 来源: elecfans关键字:STM32  定时器  PWM输出 手机看文章 扫描二维码
随时随地手机看文章

一、 STM32定时器分类众多,按照内核、外核标准分为两部分:核内定时器+核外定时器

1)核内定时器:Systick

2)外设定时器:特定应用定时器+常规定时器

3)特定应用定时器:LPTIM,RTC,WTD,HRTIM

4)常规定时器:基本定时器TIM6&TIM7)、通用定时器(TIM2TIM5,TIM9TIM14)、高级定时器(TIM1&TIM8)

【常规定时器:

  1. 基本定时器:计划没有任何对外输入/输出,常用作时基,实现基本的计数和定时功能。

  2. 通用定时器:除了基本的定时器的时基功能外,还可以对外作输入捕获、输出比较以及连接其他传感器接口(除了编码器霍尔传感器

  3. 高级定时器:此类的定时器功能强大,除了具备通用的定时器的功能外,还包含一些与电机控制和数字电源应用的相关功能,比方带死区控制的互补信号输出、紧急刹车关断输入控制。】

按照计数器的位宽来分:分为3部分

1)16bit定时器

2)32bit定时器(TIM2、TIM5)

3)24bit定时器(Systick)

二、三种 定时器 (高级&通用&基本)区别

对于STM32F4XX,三种定时器(高级、通用、基本)的区别如下表

图片

根据以上表格,可以看出

1)高级定时器(TIM1&TIM8)是16bit,支持向上、向下、向上/向下计数模式,可以产生DMA请求,捕获/比较通道有4个,支持互补输出(带可编程死区的互补输出)

2)通用定时器又分为三种,32bit(TIM2&TIM5)和16bit(TIM3&TIM4),这两种支持向上、向下、向上/向下计数模式,且都可以产生DMA请求,捕获/比较通道4个,16bit(TIM9TIM14)只能向上计数,不能产生DMA请求,捕获/比较通道只有2个,没有这三种都无互补输出,都能应用于定时器技术,PWM输出,输入捕获,输出比较。可以认为TIM9TIM14是TIM2&TIM5&TIM3&TIM4的简单版本。

3)基本定时器(TIM6&TIM7)是16bit,支持向上、向下、向上/向下计数,可以产生DMA请求,没有捕获/比较通道和互补输出,只能用于驱动DAC。

三、通用定时器的特性(以TIM2.TIM3,TIM4.TIM5为例)

1)16bit/32bit递增、递减、递增/递减(中心对齐)计数模式,自动重载计数器;

2)16bit可编程预分频器(可实时修改),用于对计数器时钟进行分频,分频系数介于1~65535之间;

3)多达4个独立通道

--输入捕获

--输出比较

--PWM生成(边沿和中心对齐模式)

--单脉冲模式输出

4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用1个定时器控制另外一个定时器)同步电路

5)如下事件发生时,可以产生中断/DMA请求(6个独立的IRQ/DMA请求生成器)

  1. 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或内部/外部触发)

  2. 触发事件(计数器启动、停止、初始化或由内部/外部触发计数)

  3. 输入捕获

  4. 输出比较

  5. 会吃针对定位的增量(正交)编码器和霍尔传感器电路

  6. 触发输入作为外部时钟或按周期的电流管理

6)STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)

7)使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个us到几个毫秒之间调整。SMT32的每个通用定时器都是完全独立的,没有互相共享的任何资源。

四、计数器模式

通用定时器可以向上、向下、向上/向下双向计数模式

  • 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器向上溢出事件

  • 向下计数模式:计数器从自动装入的值(TIMx_ARR)向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件

  • 向上/向下双向计数模式(中央对齐模式)

图片

五、定时器框图分析

图片

框图可以分为以下4个部分

第一部分:定时器时钟源

定时器时钟可由下列时钟源提供:

  • 内部时钟(CK_INT)(内部RCC提供的时钟)

  • 外部时钟模式1:外部输入引脚(TIx)

  • 外部时钟模式2:外部触发输入(ETR),仅适用于TIM2,TIM3,TIM4

  • 内部触发输入(ITRx):使用一个定时器作为另外一个定时器的预分频器,例如可以将定时器配置为定时器2的预分频器

第二部分:时基单元 :主要包括预分频寄存器(TIMx_PSC)、自动重装载寄存器(TIMx_ARR)、计数器寄存器(TIMx_CNT)

第三部分:输入捕获通道

第四部分:输出比较通道

六、PWM输出

PWM输出主要用到定时器框图中的第四部分:时基单元和输出比较通道

PWM工作过程(通道1为例)

图片

CCR1:捕获/比较值寄存器(x=1,2,3,4),设置比较值

CCMR1:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】或PWM模式2【111】

CCER:CC1P位:捕获/比较1输出极性,0:高电平有效,1:低电平有效

CCER:CC1E位:捕获/比较1输出使能,0:OC1关闭,1:OC1打开

PWM模式1;在递增计数模式下,只要 TIMx_CNTTIMx_CCR1,通道 1 便为无效状态 (OC1REF=0),否则为有效状态 (OC1REF=1)。

PWM模式2:在递增计数模式下,只要 TIMx_CNTTIMx_CCR1,通道 1 便为有效状态,否则为无效状态。
注意:在 PWM 模式 1 或 PWM 模式 2 下,仅当比较结果发生改变或输出比较模式由“冻结”模式切换到“PWM”模式时, OCREF 电平才会发生更改

如下图就是PWM模式2的例子

图片

当配置某个IO口为PWM1模式,TIMx_CNT=TIM_CCR1,通道1有效,输出高电平。

PWM模式本质是可以产生一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM位写入'110-PWM模式1','111-PWM模式2',能够独立地设置每个OCx输出通道产生一路PWM,必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最好还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。

注意:此处提到的“ 必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器.. .”目的是满足一些特殊的需求,使能预装载的意义在于可以多个通道同时输出时,时序能准确地同步。网上的一段有意义的解释是:设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。可见如果只是单通道输出,多通道输出时没时序精准的同步更新要求,不使能也可以的。

**七、PWM编程
**

1)要求:使用TIM14的PWM功能,输出频率不变,占空比变化的PWM波,驱动LED灯,达到LED的亮度由暗变亮,由从亮变暗,如此往复。

2)编程步骤

2-1,使能定时器时钟和对应的GPIO时钟,

2-2 初始化IO口为复用功能输出,并将复用功能映射到对应的定时器

2-3 初始化定时器,ARR,PSC等

2-4 初始化输出比较参数

2-5 使能预装载寄存器和ARPE位

2-6 使能定时器

2-7不断改变比较值CCRx,达到不同的占空比;

图片

在功能函数中,我们初始化要设置好arr和psc,TIM14采用的APB1(42MHz)经过2倍的倍频获得的频率(84MHz),预分频系数设置为84,那么PWM的频率为1MHZ,自动重装载值arr=500,则PWM的频率为1MHZ/500=2kHz。

TIM14_PWM_Init(500-1,84-1); //1Mhz的计数频率,2Khz的PWM.

u16 led0pwmval=0;

u8 dir=1;

pwm_func{


if(dir)led0pwmval++;


else led0pwmval--;  


if(led0pwmval >300)dir=0;//实测当TIM_CNT大于300时,亮度变化不明显,故此处设置为300为最亮


if(led0pwmval==0)  dir=1;      


TIM14- >CCR1 =led0pwmval;


关键字:STM32  定时器  PWM输出 引用地址:STM32定时器(一)PWM输出

上一篇:建工程的几个错误
下一篇:stm32看门狗的特点是什么

推荐阅读最新更新时间:2026-03-25 13:46

STM32定时器输出PWM 【自用】
PWM1输出模式配置: 1.配置IO(TIM3 PA6~7 CH1 CH2 GPIO_Mode_AF_PP复用推挽输出 50Mhz速度) /*void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //GPIOA and GPIOB clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull GPIO_InitStructure.
[单片机]
Keil MDK STM32系列(八) STM32F4基于HAL的PWM定时器输出音频
方式1: 通过PWM和TIM输出音频 机制 音频使用一个预生成的的8bit无符号数组, 采样率为8KHz 输出包含两部分, 一部分是TIM2产生连续的PWM, PWM分辨率设置为256, 正好对应8bit PCM采样 输出的第二部分是TIM3产生的定时中断, 中断的频率正好是8KHz, 每次中断都修改一次PWM的占空比 通过调节PWM频率可以调节输出音质, PWM频率越高音质越好(谐振频率越远离音频) 通过调节PWM分辨率可以调节音量, PWM分辨率越高, 音量越低 配置STM32CubeMX 选择芯片STM32F401CCU6, 创建新项目 系统时钟 System Core - SYS- Debug: Serial Wi
[单片机]
stm32定时器既做定时功能又输出PWM并控制PWM启停
对于普通定时器如TIM2、TIM3、TIM4、TIM5,如下配置: //TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init(u16 arr, u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockC
[单片机]
STM32单片机一个定时器输出不同频率PWM
  在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式。可以通过自动重装载寄存器(TIMx_ARR)来设置定时器的输出频率,然后通过捕获/ 比较寄存器 1(TIMx_CCRx)来设置占空比。一个定时器只有一个自动重装载寄存器(TIMx_ARR),但是有4个通道的捕获/ 比较寄存器 1(TIMx_CCR1、TIMx_CCR2、TIMx_CCR3、TIMx_CCR4)。所以使用一个定时器输出PWM波形的时候,频率是统一调整的,4个通道的频率是相同的,但是占空比每个通道可以独立设置。比较寄存器TIMx_CCR1、TIMx_CCR2、TIMx_CCR3、TIMx_CCR4分别设置4个通道的占空比。   
[单片机]
<font color='red'>STM32</font>单片机一个<font color='red'>定时器</font><font color='red'>输出</font>不同频率<font color='red'>PWM</font>波
STM32实现灯的PWM输出以及定时器输入捕获频率和占空比
寄存器版本的实现 程序中的频率和占空比:频率控制在1KHZ----20KHZ,步进值为1KHZ,占空比控制在5%----90%内,步进值为5%。 程序的主要功能: 1.按键一:控制四个灯的PWM输出频率和占空比 2.按键二:改变频率大小。 3.按键三:选择一个通道。 4.按键四:改变按键三选择通道的占空比。 5.按键五:实现输入捕获频率和占空比(组内成员提供了关键思想)。 说明: 1.本次为了方便实现占空比的值为整数,默认给ARR的值+1,还希望不要误解; 2.代码里面输入捕获的实现用了全映射,通道三用来捕获的IO口被之前的按键占用,若读者想实现定时器的四路输入捕获,还请自行改变IO口,方便使用。 3.本次用更新中断来获取捕获的值
[单片机]
利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM
MCU:STM32F334C8T6 PWM即脉宽调制,可以用来驱动电机,驱动全桥电路等,用过STM32的知道,用它的定时器可以很容易实现PWM输出,使用高级定时器的TIMx_CHy和TIMx_CHyN可以轻易实现互补PWM(complementary PWM)波形的输出。 高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。 STM32的定时器PWM有两种模式:PWM mode 1和PWM mode 2 工作原理: PWM mode 1 - In upcounting, channel 1 is active as lon
[单片机]
利用<font color='red'>STM32</font>通用<font color='red'>定时器</font>实现<font color='red'>输出</font>两路占空比和频率可调的互补<font color='red'>PWM</font>
利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM
MCU:STM32F334C8T6 PWM即脉宽调制,可以用来驱动电机,驱动全桥电路等,用过STM32的知道,用它的定时器可以很容易实现PWM输出,使用高级定时器的TIMx_CHy和TIMx_CHyN可以轻易实现互补PWM(complementary PWM)波形的输出。 高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。 STM32的定时器PWM有两种模式:PWM mode 1和PWM mode 2 工作原理: PWM mode 1 - In upcounting, channel 1 is active as l
[单片机]
利用STM32定时器输出PWM
使用芯片:STM32F103ZET6 目的:利用stm32的定时器3输出PWM 所用寄存器及相应位(参考STM32参考手册): (1)控制寄存器1(TIM1_CR1) 第0位CEN:计数器使能位;通过函数void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) 来实现。 第4位DIR:计数方式,默认向上,也可以设置为向下计数; 第5、6位CMS:设置计数对齐方式; 第7位ARPE:自动重装载预装载允许位,为0时TIMx_ARR没有缓冲,为1时TIMx_ARR被装入缓冲器 第8、9位CKD:设置定时器的时钟分频因子为1、2、4。 (2)DMA/中断使能寄存器(TIM
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved