定时器特性配置——PWM波发生

PWM波既可以通过模拟实现,也可以硬件实现。我们以硬件实现为例:TIM3的CH2生成PWM波。

一、开启 TIM3 时钟以及复用功能时钟,配置 PB5 为复用输出

使能TIM3和复用时钟,配置 PB5 为复用输出,这是因为 TIM3_CH2 通道将重映射到 PB5 上,此时,PB5属于复用功能输出。

 

库函数使能 TIM3 时钟的方法是:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

这在前面一章已经提到过。库函数设置 AFIO 时钟的方法是:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

列出 GPIO 初始化的一行代码:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

 

二、设置 TIM3_CH2 重映射到 PB5上

因为 TIM3_CH2 默认是接在 PA7 上的,所以我们需要设置 TIM3_REMAP 为部分重映射(通过 AFIO_MAPR 配置),让 TIM3_CH2 重映射到 PB5 上面。

在库函数函数里面设置重映射的函数是:

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

STM32 重映射只能重映射到特定的端口。

 

第一个入口参数可以理解为设置重映射的类型,比如 TIM3 部分重映射入口参数为GPIO_PartialRemap_TIM3,这点可以顾名思义了。所以 TIM3 部分重映射的库函数实现方法是:

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

 

三、初始化 TIM3, 设置 TIM3 的ARR 和 PSC

在开启了 TIM3 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来控制输出 PWM 的周期。当 PWM 周期太慢(低于 50Hz)的时候,我们就会明显感觉到闪烁了。因此,PWM 周期在这里不宜设置的太小。这在库函数是通过 TIM_TimeBaseInit 函数实现的,调用的格式为:

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim,不需要设置

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx

 

四、设置 TIM3_CH2的PWM 模式,使能 TIM3的CH2输出

接下来,我们要设置 TIM3_CH2 为 PWM 模式(默认是冻结的),因为我们的 DS0 是低电平亮,而我们希望当 CCR2 的值小的时候,DS0 就暗,CCR2 值大的时候,DS0 就亮,所以我们要通过配置 TIM3_CCMR1 的相关位来控制 TIM3_CH2 的模式。在库函数中,PWM 通道设置是通过函数 TIM_OC1Init()~TIM_OC4Init()来设置的,不同的通道的设置函数不一样,这里我们使用的是通道 2,所以使用的函数是 TIM_OC2Init():

void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

 

来看看结构体 TIM_OCInitTypeDef的定义:

typedef struct

{

uint16_t TIM_OCMode;

uint16_t TIM_OutputState;

uint16_t TIM_OutputNState; */

uint16_t TIM_Pulse;

uint16_t TIM_OCPolarity;

uint16_t TIM_OCNPolarity;

uint16_t TIM_OCIdleState;

uint16_t TIM_OCNIdleState;

} TIM_OCInitTypeDef;

 

这里我们讲解一下与我们要求相关的几个成员变量:

1、参数 TIM_OCMode 设置模式是 PWM 还是输出比较,这里我们是 PWM 模式。

2、参数TIM_OutputState 用来设置比较输出使能,也就是使能 PWM 输出到端口。

3、参数 TIM_OCPolarity 用来设置极性是高还是低。

4、其他的参数 TIM_OutputNState,TIM_OCNPolarity,TIM_OCIdleState 和 TIM_OCNIdleState 是高级定时器 TIM1 和 TIM8 才用到的。

 

要实现我们上面提到的场景,方法是:

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高

TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC2

 

五、使能 TIM3

在完成以上设置了之后,我们需要使能 TIM3。使能 TIM3 的方法前面已经讲解过:

TIM_Cmd(TIM3, ENABLE); //使能 TIM3

 

六、修改TIM3_CCR2来控制占空比

最后,在经过以上设置之后,PWM 其实已经开始输出了,只是其占空比和频率都是固定的,而我们通过修改 TIM3_CCR2 则可以控制 CH2 的输出占空比。继而控制 DS0 的亮度。

 

在库函数中,修改 TIM3_CCR2 占空比的函数是:

void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);

理所当然,对于其他通道,分别有一个函数名字,函数格式为 TIM_SetComparex(x=1,2,3,4)。

通过以上 6 个步骤,我们就可以控制 TIM3 的 CH2 输出 PWM 波了。

上一篇:YIE002开发探索04-定时器


下一篇:Android Studio导入Android 源码