0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何通过STM32的定时器输出PWM?

GReq_mcu168 来源:玩转单片机 作者:玩转单片机 2021-02-20 15:08 次阅读

本文将介绍通过STM32定时器输出PWM,如果对定时器不太熟悉的同学可以看下之前的文章《STM32基础定时器详解》,关于定时器的基础功能不再详解。

01 PWM介绍

PWM定义:脉冲宽度调制(PulseWidthModulation,PWM)简称脉宽调制。通俗讲,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

占空比定义:占空比就是高电平所占整个周期的时间,如下图所示:

95afdcb2-71b8-11eb-8b86-12bb97331649.png

第一个PWM波,周期为10ms,高电平的时间为4ms,所以占空比为40%,同理第二个PWM波为60%,第三个为80%。

PWM的频率:PWM的频率的整个周期的倒数,所以说上图PWM的周期为1/0.01,也就是100HZ。改变PWM的频率是通过改变整个的周期实现的。所以通过改变高低电平总共的时间、改变高电平占总周期的比例就可以实现任意频率、任意占空比的PWM波。

PWM的用途和优点:电机调速、功率调制、PID调节、通信等等,配置简单、抗干扰能力强,从处理器到被控系统信号都是数字形式的,无需进行数模转换。并且让信号保持为数字形式可将噪声影响降到最小,噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响,这是PWM用于通信的主要原因。

02 STM32的管脚复用

STM32没有专门的PWM引脚,所以使用IO口的复用模式。首先确认PWM功能的输出管脚,使用定时器9。从下面的框图中得知,timer9只有两个输出通道,所以timer9只能输出两路PWM。

95e68672-71b8-11eb-8b86-12bb97331649.png

在STM32F207数据手册中的Alternatefunction mapping图片中,timer9的两个通道分别可以复用为PA2,PA3,PE5和PE6。

96411fa6-71b8-11eb-8b86-12bb97331649.png

03 STM32输出PWM原理

下图中的①部分,在《STM32基础定时器详解》讲解过了,关于影子寄存器,也在《STM32影子寄存器》中讲述,下文不再赘述了。本文将重点在②部分,捕获/对比通道讲解,其中STM32的PWM就是利用对比通道实现的。

969111aa-71b8-11eb-8b86-12bb97331649.png

Pulse Width Modulation mode allows you to generate a signal with afrequency determined by the value of the TIMx_ARR register and a dutycycle determined by the value of the TIMx_CCRx register。 节选自STM32F207 Reference manual手册

脉冲宽度调制模式可以生成一个信号,该信号频率由TIMx_ARR 寄存器值决定,其占空比则由TIMx_CCRx 寄存器值决定。

从下图可以看出,当CCR寄存器和CNT计数器数值一样时,会产生动作(改变通道对应的GPIO电平)。由于CNT溢出时,重载值由TIMx_ARR寄存器值决定的。所以说TIMx_ARR寄存器值决定周期,而TIMx_CCRx寄存器值决定CNT溢出时,经过多久会产生动作(改变通道对应的GPIO电平),也就是决定了占空比。

96f613de-71b8-11eb-8b86-12bb97331649.png

以向上计数为例,重载值为ARR,比较值为CRRx

9738d9d0-71b8-11eb-8b86-12bb97331649.png

上图可以看出:

0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平。

t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平。

当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程至此一个PWM周期完成。

上图更加形象的说明了

信号频率由TIMx_ARR 寄存器值决定。

占空比则由TIMx_CCRx 寄存器值决定。

STM32输出PWM的过程:

1、首先配置GPIO,配置定时器,具体参考一下代码。定时器配置参考《STM32基础定时器详解》。

2、捕获/比较通道使能比较通道。

977125f6-71b8-11eb-8b86-12bb97331649.png

上图看到,①寄存器名字为:Capture/Compare1register。可以选择从②处输入捕获,也可以选择从从③中输出,也就是我们需要的PWM输出功能。选择捕获通道,还是选择比较通道,在框图中没有找到具体的说明,但在TIMx_CCMR1寄存器CC1S[1:0]控制位使能。

97b8c3c0-71b8-11eb-8b86-12bb97331649.png

3、使能完输出,就要配置PWM输出了

a78b464c-71b8-11eb-8b86-12bb97331649.png

①TIMx_CCMR1寄存器的OC1M[2:0]位,设置输出模式控制器

110:PWM模式1,111:PWM模式2。

②计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平。

OC1REF=0 无效电平,OC1REF=1无效电平。

③通过输出模式控制器产生的信号。TIMx_CCER寄存器的CC1P位,设置输入/捕获通道1输出极性。

0:高电平有效,1:低电平有效。

④TIMx_CCER:CC1E位控制输出使能电路,信号由此输出到对应引脚。

0:关闭,1:打开。

首先对PWM模式1和PWM模式2进行介绍:

01 模式1

在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

02 模式2

在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。

TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

PWM输出高低电平由TIMx_CCMR1:OC1M位和TIMx_CCER:CC1P位共同决定。

总结下来:

模式1:

CNT

CNT>CCR为无效电平//(OC1REF =0)

模式2:

CNT

CNT>CCR为有效电平//(OC1REF =1)

CC1P:

0:高电平有效

1:低电平有效

04 STM32输出PWM配置

分析了原理,那么下面就分析STM32生成PWM的过程。

1、首先要将GPIO设置为复用输出

/* GPIOE clock enable */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); /* GPIOE Configuration: TIM9 CH2(PE6)*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 |GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed =GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType =GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOE, &GPIO_InitStructure); /*Connect TIM9 pins to AF3 */ GPIO_PinAFConfig(GPIOE,GPIO_PinSource5, GPIO_AF_TIM9);GPIO_PinAFConfig(GPIOE,GPIO_PinSource6, GPIO_AF_TIM9);

2、配置定时器向上计数,配置定时器频率

/* TIM9 clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE); /* Compute the prescaler value */PrescalerValue= (uint16_t) ((SystemCoreClock) / 2000000) - 1; /* Timebase configuration */TIM_TimeBaseStructure.TIM_Period =1000-1;TIM_TimeBaseStructure.TIM_Prescaler =PrescalerValue;TIM_TimeBaseStructure.TIM_ClockDivision =0;TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseInit(TIM9,&TIM_TimeBaseStructure);3、配置PWM输出 上面分析过程较为麻烦,ST提供了标准外设库,我们只需要配置TIM_OCInitTypeDef结构体即可。

TIM_OCInitTypeDef TIM_OCInitStructure; /* PWM Modeconfiguration: Channel1 */TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse =100-1;TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; TIM_OC1Init(TIM9,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM9,TIM_OCPreload_Enable);

TIM_OCInitTypeDef结构体解析

typedef struct{ uint16_t TIM_OCMode; //PWM模式1或者模式2 uint16_t TIM_OutputState; // 输出使能OR失能 uint16_t TIM_OutputNState; // PWM输出不需要 uint32_t TIM_Pulse; // 比较值 uint16_t TIM_OCPolarity;// 比较输出极性 uint16_t TIM_OCNPolarity; // PWM输出不需要 uint16_t TIM_OCIdleState;// PWM输出不需要 uint16_t TIM_OCNIdleState; // PWM输出不需要}TIM_OCInitTypeDef;

其中TIM_Pulse可以在初始化时设置,设置完毕后,也可以通过以下接口再次更新。

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1)

4、使能定时器

TIM_ARRPreloadConfig(TIM9, ENABLE); /* TIM9 enable counter*/TIM_Cmd(TIM9,ENABLE);

使用timer9输出PWM的波形。

原文标题:STM32 PWM输出

文章出处:【微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4885

    浏览量

    209820
  • STM32
    +关注

    关注

    2239

    文章

    10665

    浏览量

    348518
  • 定时器
    +关注

    关注

    23

    文章

    3145

    浏览量

    112007

原文标题:STM32 PWM输出

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用STM32定时器实现一个周期输出PWM2的波形?

    请教各位如何用STM32定时器实现一个周期输出PWM2的波形呢(低-高-低-高-低)?万分感谢您的解答!
    发表于 04-03 06:39

    STM32同一定时器PWM输出定时,会影响我的PWM输出吗?

    求助各位大佬 ,我用定时器2通道1输出PWM 定时器设置为TIM2_PERIODE (1000-1) TIM2_PRESCALER 36,现在还想开启2的中断用
    发表于 03-26 07:23

    STM32G030C8T6要输出8~12路PWM,每个定时器可以输出4路,那如何让两个定时器输出PWM同步呢?

    STM32G030C8T6要输出8~12路PWM,每个定时器可以输出4路,那如何让两个定时器
    发表于 03-08 08:19

    通过两个不同的定时器控制PWM输出,如何让两者同步?

    通过两个不同的定时器控制PWM输出,希望两个PWM可以同步,该如何处理?
    发表于 11-06 06:47

    STM32H7芯片系列中定时器同步启动并输出PWM波形的实现方法

    本文主要研究了STM32H7芯片系列中定时器同步启动并输出PWM波形的实现方法。
    的头像 发表于 10-24 14:56 659次阅读
    <b class='flag-5'>STM32</b>H7芯片系列中<b class='flag-5'>定时器</b>同步启动并<b class='flag-5'>输出</b><b class='flag-5'>PWM</b>波形的实现方法

    使用MM32F0270 定时器DMA方式输出PWM

    使用MM32F0270 定时器DMA方式输出PWM
    的头像 发表于 10-17 14:47 515次阅读
    使用MM32F0270 <b class='flag-5'>定时器</b>DMA方式<b class='flag-5'>输出</b><b class='flag-5'>PWM</b>

    使用定时器PWM输出功能的方法

    PWM(脉冲宽度调制)可用于电机的调速、LED的亮度调节、无源蜂鸣器输出音调等,是嵌入式系统开发中经常采用的方法。本期内容以一个用无源蜂鸣器播放音乐的例子,带领大家了解使用定时器PWM
    发表于 08-16 06:13

    使用瑞萨e² studio FSP基于RA2E1定时器配置PWM输出

    使用瑞萨e² studio FSP基于RA2E1定时器配置PWM输出
    的头像 发表于 08-01 00:13 154次阅读
    使用瑞萨e² studio FSP基于RA2E1<b class='flag-5'>定时器</b>配置<b class='flag-5'>PWM</b><b class='flag-5'>输出</b>

    STM32 TIM—基本定时器

    STM32F4xx系列控制器有共有14个TIM定时器。其中2个高级控制定时器TIM1和TIM8、10 个通用定时器TIM2TIM5和TIM9TIM14、 2个基本
    的头像 发表于 07-22 17:05 3272次阅读
    <b class='flag-5'>STM32</b> TIM—基本<b class='flag-5'>定时器</b>

    基于STM32芯片三路互补PWM输出的设计实现

    目的:使用Stm32高级定时器TIM1。配置中心对齐模式输出三路互补PWM
    的头像 发表于 07-21 16:26 4979次阅读
    基于<b class='flag-5'>STM32</b>芯片三路互补<b class='flag-5'>PWM</b><b class='flag-5'>输出</b>的设计实现

    STM32定时器(一)PWM输出

    STM32定时器分类众多,按照内核、外核标准分为两部分:核内定时器+核外定时器
    的头像 发表于 07-21 14:51 2642次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>(一)<b class='flag-5'>PWM</b><b class='flag-5'>输出</b>

    一个定时器输出4路不同频率波形的应用示例

    一般来讲,一个STM32定时器输出基于同一频率的各路信号比较方便。但经常也会有人问使用STM32一个定时器是否可以实现多路不同频率的
    的头像 发表于 07-06 15:57 1183次阅读
    一个<b class='flag-5'>定时器</b><b class='flag-5'>输出</b>4路不同频率波形的应用示例

    STM32F407 基本定时器配置输出PWM方波

    介绍STM32F407定时器PWM波形输出配置方式。 通过逻辑分析采集波形数据进行可视化显示对比。
    的头像 发表于 07-06 14:33 3151次阅读
    <b class='flag-5'>STM32</b>F407 基本<b class='flag-5'>定时器</b>配置<b class='flag-5'>输出</b><b class='flag-5'>PWM</b>方波

    STM32通过PWM控制电机速度

    STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速。分享本文了解如何通过PWM
    的头像 发表于 07-06 09:56 2102次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>通过</b><b class='flag-5'>PWM</b>控制电机速度

    使用STM32定时器PWM功能时的小问题

    有人使用STM32定时器PWM功能,遇到点小疑问,这里一起看看。 他先将STM32定时器计数周期设为0xff,单向递增计数模式,OC比较
    的头像 发表于 06-21 16:26 949次阅读
    使用<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>PWM</b>功能时的小问题