STM32(7)-定时器输出PWM的原理分析

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

概念+代码


一、输出比较

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

二、PWM原理

PWM(Pulse Width Modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
PWM参数:
频率 = 1 / TS
占空比 = TON / TS(高电平占总时间的比率),如占空比为50%,高电平=5V,低电平=0V,则模拟电压为2.5V.
分辨率 = 占空比变化步距,即精度。
stm32 pwm,stm32,单片机,嵌入式硬件
PWM基本结构:
stm32 pwm,stm32,单片机,嵌入式硬件
stm32 pwm,stm32,单片机,嵌入式硬件
当CNT计数小于CCR时,置高电平,当CNT大于CCR时,置低电平,当CNT=ARR时触发事件,计数值归零,又开始新的一轮周期,这样就可以不断的输出PWM信号。因此,可以看出,CCR值的设置与占空比密切相关。
PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
CK_PSC是预分频频率,一般是系统频率。PSC是分频系数,ARR是自动重装载寄存器最大计数值。
PWM占空比: Duty = CCR / (ARR + 1)
CCR是输出比较输出PWM的一个限定比较值。
PWM分辨率: Reso = 1 / (ARR + 1)

三、输出PWM

以正点原子PWM实验为例:使用TIM3的CH2通道,在PB5端口输出PWM波。

1.PWM初始化

void TIM3_PWM_Init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //使能定时器3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5

   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形    GPIOB.5
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
   //初始化TIM3
    //溢出时间time=(arr+1)*(psc+1)/144000000
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    //初始化TIM3 Channel2 PWM模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    TIM_OCInitStructure.TIM_Pulse = 50;
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
    TIM_Cmd(TIM3, ENABLE);  //使能TIM3
}

这里最重要的是:
1.该函数的参数为 arr 和 psc,分别表示自动重载寄存器的值和预分频系数。根据这两个参数,可以计算出 PWM 的频率和占空比。

2.在函数中,首先使能了定时器 TIM3 和 GPIOB 外设的时钟,以及 GPIO 的复用功能模块时钟。然后,通过 GPIO_PinRemapConfig 函数将 TIM3_CH2 信号映射到 GPIOB.5 引脚上。
这里有一个问题:为什么要配置AFIO复用功能模块时钟?如下图:
stm32 pwm,stm32,单片机,嵌入式硬件
可以看到:PB5的默认复用功能是I2C1_SMBA/ SPI3_MOSI,I2S3_SD,而其重定义功能才是TIM3_CH2,所以不能简单直接的复用它,必须要配置重映射。

3.通过 TIM_OCInitTypeDef 结构体对 TIM3 的通道 2 进行初始化,选择定时器模式为 PWM2,使能比较输出,设置输出极性为高电平,设置占空比为 50%。
最后,通过 TIM_OC2PreloadConfig 函数使能 TIM3 在 CCR2 上的预装载寄存器,并通过TIM_Cmd 函数使能 TIM3。

2.输出指定频率PWM波

   TIM3_Int_Init(5999,0);
   //TIM3_PWM_Init(5999,0);//不分频。PWM 频率=96000/(5999+1)=16KHz

参考PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1),这里我的芯片系统频率是96MHz,对应CK_PSC,ARR是计数值,PSC是预分频值,代入公式,得:频率F=16000Hz=16KHz。
因此,这个代码输出了一个频率固定为16KHz的PWM波。

3.输出占空比可变的PWM波

TIM3_Int_Init(5999,0);
u16 pulse=400;
TIM_SetCompare2(TIM3,pulse);

对于定时器 TIM3,CCR2 寄存器的取值范围是 0 到 ARR,即比较寄存器的值不能大于自动重载寄存器的值。因此,在设置占空比时,输入的占空比值需要通过计算转换为相应的比较寄存器的值。也就是说,pulse的值只能在0-5999之间设置,并且注意,这里调用的函数是TIM_SetCompare2()函数,是比较寄存器CCR2对应通道2,如果是ch3,则要调用TIM_SetCompare3()函数。如此,便实现了修改PWM波的占空比。文章来源地址https://www.toymoban.com/news/detail-766633.html

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

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

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

相关文章

  • STM32高级定时器输出指定数量PWM(STM32CubeMx配置)

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

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

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

    2024年01月25日
    浏览(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波)

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

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

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

    2024年01月18日
    浏览(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)
  • HAL库STM32常用外设教程(一)—— 定时器 输出PWM

    本篇文章为个人参考总结所用,如果错误还望指出。 涉及的知识: 1、STM32CubeMx的部分使用 2、PWM原理及常用概念 3、用单片机生成一定频率的PWM 用到的软件及单片机: 1、STM32CubeMx 2、IDE: MDK-Keil软件 3、芯片:STM32F407ZGT6 4、开发板:正点原子探索者 注:不同型号的单片机实现

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

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

    2024年04月10日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包