STM32 实验8 PWM输出实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.8 PWM输出实验
上一节,我们介绍了STM32的通用定时器TIM3,用该定时器的中断来控制DS1的闪烁,这一节,我们将向大家介绍如何使用STM32的TIM3来产生PWM输出。本节分为如下几个部分:
3.8.1 PWM简介
3.8.2 硬件设计
3.8.3 软件设计
3.8.4 下载与测试
3.8.1 PWM简介
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。
STM32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出!这里我们仅利用TIM3的CH2产生一路PWM输出。如果要产生多路输出,大家可以根据我们的代码稍作修改即可。
要使STM32的通用定时器TIMx产生PWM输出,除了上一节介绍的寄存器外,我们还会用到3个寄存器,来控制PWM的。这三个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。接下来我们简单介绍一下这三个寄存器。
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有2个,TIMx _CCMR1和TIMx _CCMR2。TIMx_CCMR1控制CH1和2,而TIMx_CCMR1控制CH3和4。该寄存器的各位描述如下:
图3.8.1.1 寄存器TIMx_CCMR1各位描述
该寄存器的有些位在不同模式下,功能不一样,所以上图把寄存器分了2层,上面一层对应输出而下面的则对应输入。关于该寄存器的详细说明,请参考《STM32参考手册》第246页,13.4.7一节。这里我们需要说明的是模式设置位OCxM,此部分由3位组成。总共可以配置成7种模式,我们使用的是PWM模式,所以这3位必须设置为110/111。这两种PWM模式的区别就是输出电平的极性相反。
接下来,我们介绍捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。该寄存器的各位描述如下:
图3.8.1.2 寄存器TIMx_ CCER各位描述
该寄存器比较简单,我们这里不多说了,有不明白的地方,请参考《STM32参考手册》第251页,13.4.9这一节。
最后,我们介绍一下捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有4个,对应4个输通道CH1~4。因为这4个寄存器都差不多,我们仅以TIMx_CCR1为例介绍,该寄存器的各位描述如下:
图3.8.1.3 寄存器TIMx_ CCR1各位描述
在输出模式下,该寄存器的值与CNT的值比较,根据比较结果产生相应动作。利用这点,我们通过修改这个寄存器的值,就可以控制PWM的输出脉宽了。
至此,我们把这一节要用的几个TIMx相关寄存器都介绍完了,解析来我们就说说这一节要实现的功能。我们要利用TIM3的CH2(对应MiniSTM32开发板的PA7)输出PWM来控制DS0的亮度。所以我们在软件上要做的就是控制TIM3_CH2的PWM输出。接下来我们将介绍通过哪几个步骤,就可以达到这个目的:
1)开启TIM3时钟,配置PA7为复用输出。
要使用TIM3,我们必须先开启TIM3的时钟(通过APB1ENR设置),这点相信大家看了这么多代码,应该明白了。这里我们还要配置PA7为复用输出,这是因为TIM3_CH2通道是以IO 复用的形式连接到PA7上的,这里我们要使用复用输出功能。
2)设置TIM3的ARR和PSC。
在开启了TIM3的时钟之后,我们要设置ARR和PSC两个寄存器的值来控制输出PWM的周期。当PWM周期太慢(低于50Hz)的时候,我们就会明显感觉到闪烁了。因此,PWM周期在这里不宜设置的太小。
3)设置TIM3_CH2的PWM模式。
接下来,我们要设置TIM3_CH2为PMW模式(默认是冻结的),因为我们的DS0是低电平亮,而我们希望当CCR2的值小的时候,DS0就暗,CCR2值大的时候,DS0就亮,所以我们要通过配置TIM3_CCMR1的相关位来控制TIM3_CH2的模式。
4)使能TIM3的CH2输出,使能TIM3。
在完成以上设置了之后,我们需要开启TIM3的通道2输出以及TIM3。前者通过TIM3_CCER1来设置,是单个通道的开关,而后者则通过TIM3_CR1来设置,是整个TIM3的总开关。只有设置了这两个寄存器,这样我们才能在TIM3的通道2上看到PWM波输出。
5)修改TIM3_CCR2来控制占空比。
最后,在经过以上设置之后,PWM其实已经开始输出了,只是其占空比和频率都是固定的,而我们通过修改TIM3_CCR2则可以控制CH2的输出占空比。继而控制DS0的亮度。
通过以上5个步骤,我们就可以控制TIM3的CH2输出PWM波了。
3.8.2 硬件设计
该部分,因为我们DS0是连接在PA8上的,而我们的PWM输出是在PA7,所以,硬件上应该把PA7和PA8通过跳线帽短接起来,然后配置PA8为浮空输入(IO口复位后的状态),以免干扰PA7的信号。因此,这一节的电路,除了在PA7和PA8之间放一个跳线帽,其他的都不需要改动。
图3.8.2.1 硬件连接图
将上图中的PA7和PA8用跳线帽短接,图中绿色圈出部分。
3.8.3 软件设计
这里,我们在之前的定时器中断实验的基础上修改,先打开之前的工程,然后我们在timer.c 里面加入如下代码:
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1; //TIM3时钟使能
GPIOA->CRH&=0XFFFFFFF0;//PA8输出
GPIOA->CRH|=0X00000004;//浮空输入
GPIOA->CRL&=0X0FFFFFFF;//PA7输出
GPIOA->CRL|=0XB0000000;//复用功能输出
GPIOA->ODR|=1<<7;//PA7上拉
TIM3->ARR=arr;//设定计数器自动重装值
TIM3->PSC=psc;//预分频器不分频