定时器输出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波
*/
void  Pwm_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_CNT
  TIM3->CCR1=ccr;
  TIM3->CCER|=1<<1;//设置有效电平为低电平有效
  TIM3->CCER|=1<<0;//开启- OC1信号输出到对应的输出引脚。
  TIM3->CR1|=1<<0;//使能定时器3
}

6、输出波形
 6.1、Pwm_Init(7200,10000,5000);

定时器输出PWM波_第1张图片
 6.2、Pwm_Init(72,10000,5000);
定时器输出PWM波_第2张图片

  
  
  

你可能感兴趣的:(STM32)