STM32学习和实践笔记(23):PWM输出的配置

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)使能 TIMxARR 上的预装载寄存器允许位

使能 TIMxARR 上的预装载寄存器允许位库函数是

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

第一个参数用于选择定时器,第二个参数用于选择使能还是失能 

以上是通用定时器的设置,如果是高级定时器要想输出PWM波形,还须要设置一个 MOE 位(TIMx_BDTR 的第 15 位),以使能主输出,否则不会输出 PWM。库函数设置的函数为

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);                 

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

复业思维20240108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值