定时器输出PWM波


定时器输出PWM波

一、STM32专栏目录

二、Linux专栏目录

三、Android专栏目录

注意:该文是以配置寄存器的方式,从寄存器层面讲解如何配置定时器输出PWM波形。

概述:
??该文主要介绍了PWM的基本概念、PWM名词介绍、定时器为何能够输出PWM波、官方手册对定时器PWM模式介绍、PWM配置代码、以及生成的波形。

1、PWM简介

??PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形。

2、PWM名词介绍

??占空比:输出的PWM波中,高电平保持的时间与该PWM的周期之比。
??频率:1s时间内波形重复的次数。

3、定时器为何能够输出PWM波

??输出PWM波形为定时器的高级功能,因此基本定时器无法输出PWM波,通用定时器和高级的定时器可以输出(该文以通用定时器来介绍)。
??首先介绍通用定时器中的几个寄存器(以下寄存器都为16位寄存器)。
??SPC(预分频器):由于STM32的主频为72MHZ,预分频是为了得到不同频率值。例如SPC=72,那么定时器的工作频率就变成1MHZ,即周期为1um,这样通过设置SPC的值就确定我们波形的周期为um级别的还是ms级别的。
??CNT(计数器):每次向上加一或者向下加1(一般设置为向上计数)。
??ARR(自动重装载寄存器):当CNT的数值加到和ARR相同时,那么CNT将被自动设置成为0。因此ARR寄存器就决定了输出波形的周期。
??CCR(捕获/比较寄存器):CCR寄存器一直与计数器CNT进行比较,当CNT>CCR值时,并在端口上产生输出信号(即高低电平)。
??因此,通过设置SPC寄存器就可以设置输出波形频率的级别,设置ARR寄存器可以设置输出波形的周期,设置CCR寄存器就可以控制波形的占空比。

4、官方手册对定时器PWM模式介绍

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

??对官方手册加以解释:

??110:PWM模式1- 在向上计数时,一旦TIMx_CNT(简单的说就是,波形开始时先为有效电平后为无效电平,)。
??111:PWM模式2- 在向上计数时,一旦TIMx_CNT(简单的说就是,波形开始时先为无效电平后为有效电平)。
??两种模式选哪一种都可以。
??每个定时器都会有四个通道,这四个通道是独立的,但是如若四个通道同时输出PWM波,那么他们的占空比可以完全不同,但是频率必须相同。因为四个通道共用一个ARR寄存器,但CCR寄存器分别对于CCR1、CCR2、CCR3、CCR4。
??预装载寄存器的意思是,写入的值实际是并没有立即写到寄存器中,而是等到下一个周期开始才将值写入。官方手册说必须设置相应的预装载寄存器,是因为这样不会形成有两个占空比的错乱波形。

??OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。 TIMx_CCER寄存器中的CCxE位控制OCx输出使能。详见TIMx_CCERx寄存器的描述。
??对官方手册加以解释:

??设置输出极性,也就是设置高电平(1)为有效电平,还是低电平(0)为有效电平。输出极性的和PWM的模式两者一同决定了输出波形现为高电平还是低电平。

??在PWM模式(模式1或模式2)下,TIMx_CNT和TIMx_CCRx始终在进行比较, (依据计数器的计数方向)以确定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。当满足条件时,对应通道就可以输出高低电平。

5、配置代码如下

/* 函数功能:配置Timer3的CH1输出PWM波 */ voidPwm_Init(u16 psc,u16 arr,u16 ccr) { RCC->APB1ENR|=1<<1; //TIM3 RCC->APB2ENR|=1<<2; //PA GPIOA->CRL&=0xF0FFFFFF; GPIOA->CRL|=0x0B000000; RCC->APB1RSTR|=1<<1; RCC->APB1RSTR&=~(1<<1); TIM3->CNT=0; TIM3->PSC=psc-1; TIM3->ARR=arr; TIM3->CCMR1&=~(0x3<<0); //CH1设置为输出 TIM3->CCMR1|=1<<3; //CH1预装载使能 TIM3->CCMR1|=0x6<<4; //PWM模式2-在向上计数时,一旦TIMx_CNTCCR1=ccr; TIM3->CCER|=1<<1; //设置有效电平为低电平有效 TIM3->CCER|=1<<0; //开启- OC1信号输出到对应的输出引脚。 TIM3->CR1|=1<<0; //使能定时器3 }

6、输出波形
?6.1、Pwm_Init(7200,10000,5000);
定时器输出PWM波
文章图片

?6.2、Pwm_Init(72,10000,5000);
定时器输出PWM波
文章图片

【定时器输出PWM波】??
??
??

    推荐阅读