PWM可以看作是定时器功能中其中一个子功能,配置步骤与前面定时器的方式类似。相关库函数也同样在tim.c里。
3.PWM输出配置步骤
(1)使能定时器及端口时钟,并设置引脚复用器映射。
a) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3定时器的端口时钟打开
所谓的引脚复用器映射,是指将原来默认设置在某个引脚上的功能,改到别的引脚上去实现。
比如,这里的通用定时器3的通道1,它的默认PWM输出引脚是PA6,通过使用重映像或映射,可以让它在PB4或PC6引脚上输出!
在接下来的PWM实验中,就是实现在PC6上输出PWM信号,来使接在PC6的LED灯,显示呼吸灯的效果。
所以就有下面这两条语句:
b) RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开PC端口的时钟
c) GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//通过这个函数来将通用定时器3的通道1的输出重映像到PC6。
上表中的部分重像与完全重映像,并没有什么特别的意思,仅仅是为了在库函数中,用这两个名字来代表两个值:10和11,用以传递形参来分别表明,到底是映射到PB4还是PC6而已。
有哪些功能可以在对应引脚上实现重映像?可选的参数在 stm32f10x_gpio.h 都已经列出来非常详细:
d) GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//将PC6配置为复用的推挽输出
(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*
TIM_TimeBaseInitStruct);
(3)初始化PWM输出参数,包含PWM模式、输出极性(含义见上一篇文),使能等
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef*
TIM_OCInitStruct);
typedef struct
{
uint16_t TIM_OCMode; //比较输出模式(PWM一共有8种输出模式)
uint16_t TIM_OutputState; //比较输出使能
uint16_t TIM_OutputNState; //比较互补输出使能(这个在高级定时器中才用到)
uint32_t TIM_Pulse; //脉冲宽度(这个在高级定时器中才用到)
uint16_t TIM_OCPolarity; //输出极性
uint16_t TIM_OCNPolarity; //互补比较输出极性(这个在高级定时器中才用到)
uint16_t TIM_OCIdleState; //空闲状态下比较输出状态(这个在高级定时器中才用到)
uint16_t TIM_OCNIdleState; //空闲状态下比较输出状态(这个在高级定时器中才用到)
} TIM_OCInitTypeDef;
如果我们要配置TIM3的CH1为PWM1模式,输出极性为低电平,并且使能
PWM输出,可以如下配置:
TIM_OCInitTypeDef TIM_OCInitStructure;//先定一个结构体变量
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM3,&TIM_OCInitStructure); //输出比较通道1初始化
(4)开启定时器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
TIM_Cmd(TIM3,ENABLE); //开启定时器
(5)修改TIMx_CCRx的值控制占空比
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1);
(6)使能TIMx在CCRx上的预装载寄存器
使能输出比较预装载库函数是:
void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
第一个参数用于选择定时器,第二个参数用于选择使能还是失能输出比较预装载寄存器,可选择为TIM_OCPreload_Enable、TIM_OCPreload_Disable。
(7)使能 TIMx 在 ARR 上的预装载寄存器允许位
使能 TIMx 在 ARR 上的预装载寄存器允许位库函数是:
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
第一个参数用于选择定时器,第二个参数用于选择使能还是失能。
以上是通用定时器的设置,如果是高级定时器要想输出PWM波形,还须要设置一个 MOE 位(TIMx_BDTR 的第 15 位),以使能主输出,否则不会输出 PWM。库函数设置的函数为:
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);