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

发布者:RadiantSerenity最新更新时间:2023-07-21 来源: elecfans关键字:STM32  定时器输出  PWM 手机看文章 扫描二维码
随时随地手机看文章

本文将介绍通过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 引用地址:如何通过STM32的定时器输出PWM?

上一篇:STM32步进电机驱动的算法
下一篇:基于STM32的智能电梯控制系统设计

推荐阅读最新更新时间:2024-11-19 13:37

STM32学习笔记1-----初识stm32F429IGT6
型号: stm32F429IGT6 描述: 1、高性能、主频180MHz,cortex-m4, 2、Flash为1M,SRAM为256KB 3、引脚为176pin 芯片框架: 总线矩阵图: 其主控总线8条(S0~S7),被控总线7条(M0~M6,其包括:Flash、RAM和外设)。在总线交叉的时候即可进行相互通信。 存储器映射:(存储器本身没有地址,给存储器分配地址的过程叫存储器映射) 程序存储器、数据存储器、寄存器和IO口共同排列在4G地址空间中,其平均分为8个块,每个块为512MB。 如下表所示: Block0设置为内部Flash,Block
[单片机]
<font color='red'>STM32</font>学习笔记1-----初识stm32F429IGT6
详解STM32最小系统电路
STM32最小系统硬件组成 最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是STM32入门的基础。 组成: · 电源 · 复位 · 时钟 · 调试/下载接口 · 启动 电源 3.3V的电源从这里接入,其中电容起到滤波的作用。 复位电路 当RESET引脚被拉低产生外部复位时,产生复位脉冲,从而使系统复位。 有三种复位方式: · 上电复位 · 手动复位 · 程序自动复位 上电复位 ,在上电瞬间,电容充电,RESET出现短暂的低电平,该低电平持续时间由电阻和电容共同决定,需求的复位信号持续时间约在1ms左右,计算方式如下: t = 1.1RC(固定计算公式) 1.1*10K*0.1uF
[单片机]
STM32直接存储器访问DMA
第一次接触DMA是在学校学习ARM9裸板程序的时候,想起来都时隔快2年了。现在来看看STM32平台的DMA,一样,在标准外设库的支持下,STM32的DMA编程十分简单,但是既是学习,那还是花点时间看看DMA的相关概念及原理的了解下。 1. DMA简介 DMA是Direct Memory Access的简称,是直接存储器访问的意思。DMA是STM32单片机的外设之一,主要功能是用来搬移数据的。通过DMA搬移数据不需要CPU直接参与控制,也不需要中断处理方式那样保留现场和恢复现场。在传输数据的时候,CPU可以干其他事情。 无使用DMA的数据传输: 使用DMA后的数据传输: DMA数据传输支持从外设到存储器、存储器到外设
[单片机]
<font color='red'>STM32</font>直接存储器访问DMA
STM32软件运行过程,如何查看全局变量的实时数据?
下面是一个单片机STM32RCT6的PA8,PA9,PA10引脚输出PWM波形的仿真步骤,此外还展示了软件运行过程,如何查看全局变量的实时数据。每一步我都做了截图,大家照着一步步来,请大家放心参考! 1.点target图标,如下: 2.选择好单片机芯片的型号:我选的STM32RCT6型号,大家可以根据自己手上stm32开发板的型号来选择 3.外部晶振频率的选择:8Mhz(因为大部分单片机的外部晶振是8Mhz),为了使仿真更贴近实际,通常情况下都是选8Mhz 4.进入Debug页面进行设计,特别要注意第四点parameter,注意选正确好芯片的型号,我的是RC系列,所以写了RC,如果是RB系列,要后面改为RB 5
[单片机]
<font color='red'>STM32</font>软件运行过程,如何查看全局变量的实时数据?
STM32PWM波形输出配置
一. TIMER分类: STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 没有 TIM6 T
[单片机]
<font color='red'>STM32</font>之<font color='red'>PWM</font>波形<font color='red'>输出</font>配置
串口如何接收数据 STM32串口接收数据
如果采用查询接收方式接受串口数据,就会造成接收不及时,还没接收完数据,下一个数据就发过来了,就会把上一个数据覆盖了,造成数据丢失。所以可以通过中断去接收数据,开启接收中断。而发送数据,是我们自己决定的,只要调用函数就可以了,不需要开启中断。 要串口接收数据,需要在昨天串口发送数据的基础上,再设置中断接收函数。接收数据的中断时间有准备好读取接收到的数据、检测到空闲线路,事件标志分别为RXNE、IDLE。对应状态寄存器(USART_SR)的位5和位4。相应的使能控制位RXNEIE、IDLEIE在控制寄存器 1 (USART_CR1)的位5和位4。 根据寄存器配置中断 //设置中断 USART1- SR = 0;
[单片机]
串口如何接收数据 <font color='red'>STM32</font>串口接收数据
STM32 串口调试UART1,调试笔记1
Usart1重新初始化之后,再次发送数据的时候,就会死在 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); 解决方法:注释掉原程序中的 // USART_ClearFlag(USART1, USART_FLAG_TC);
[单片机]
PFC与PWM控制器复合芯片ML4824及其应用研究
摘要:传统的两级APFC采用两套控制电路和至少两个功率开关管,增加了电路复杂程度及成本。随着PFC/PWM两级复合控制芯片的产生,两级APFC的这一缺陷可以得到大大改善。基于对PFC/PWM两级控制复合芯片ML4824功能的简介,对两级APFC技术进行了研究,并通过带PFC的蓄电池充电器的研制,证实了该复合控制的可行性和实用性。关键词:功率因数校正;脉宽调制控制器;双管正激变换器 1引言 20世纪90年代以来,随着各国对用电设备输入电流谐波含量的限制,以及各种限制输入电流谐波的标准的建立,使有源PFC技术取得了长足的进展。有源PFC技术由于变换器工作在高频开关状态,而具有体积小、重量轻、效率较高和功率因数高等优点。从电路结构上
[电源管理]
PFC与<font color='red'>PWM</font>控制器复合芯片ML4824及其应用研究
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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