定时器输出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_CNT
6、输出波形
?6.1、Pwm_Init(7200,10000,5000);
文章图片
?6.2、Pwm_Init(72,10000,5000);
文章图片
【定时器输出PWM波】??
??
??
推荐阅读
- stm32|基于STM32和freeRTOS智能门锁设计方案
- 日常分享|共享充电宝方案原理,具体部件组成以及主控MUC参数
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- STM32|STM32的四种IO输出模式
- STM32 远程升级(ISP / IAP)
- stm32|stm32f103can总线过滤器配置
- STM32CubeMX配置SDIO模式(非DMA方式)
- STM32|如何建一个STM32F030标准库工程模板
- STM32 时钟RCC相关配置参考stm32f10x_rcc.h
- STM32 NVIC