STM32 PWM学习

本文围绕STM32定时器PWM输出展开。先确定可用于PWM输出的定时器,接着阐述开发步骤,包括使能定时器和IO口时钟、初始化IO口、定时器及输出比较参数等。还深入探讨了PWM1和PWM2模式的区别,以及有效电平的定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,确定可以使用PWM输出的定时器,在STM32中,定时器共有8个,分别为TIM1~TIM8。

定时器属性是否可用PWM输出路数
TM1,TIM8高级定时器可用7路
TIM2~TIM6通用定时器可用4路
TIM6,TIM7基本时器不可用

开发步骤1

  1. 使能定时器3和相关IO口时钟。
    使能定时器3时钟:RCC_APB1PeriphClockCmd();
    使能GPIOB时钟:RCC_APB2PeriphClockCmd();
  2. 初始化IO口为复用功能输出。函数: GPIO_Init();
    PIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  3. 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,
    所以需要开启AFIO时钟。同时设置重映射。
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  4. 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
  5. 初始化输出比较参数:TIM_OC2Init();
  6. 使能预装载寄存器:
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  7. 使能定时器。TIM_Cmd();
  8. 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

咱们这里可以贴一下原子哥的代码:

TIM_OCInitTypeDef  TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 			//选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //比较输出使能,
TIM_OCInitStructure.TIM_Pulse = 0; 								//设置待装入捕获比较寄存器的脉冲值,其实就是设置CCR
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       //输出极性:TIM输出比较极性高
TIM_OC4Init(TIM4, &TIM_OCInitStructure);                         //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

这里原子选择的PWM2模式,为什么选择的是PWM2模式呢?为什么不选择PWM1模式呢?两者又有什么区别呢?下面我们就一探究竟,PWM1和PWM2模式是由CCMR1的OC1M和OC2M来决定的,因为我们选择的是是通道2,所以设置的是OC2M,再看相关介绍

OC1M[2:0]:输出比较1模式(Output compare 1 enable)
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

在这里插入图片描述
看到红色的“有效电平”了吧,那么这又是谁定义的呢?别急,再看手册,可知它是由CCER这个寄存器的CCxP来决定的这里是通道2,所以是CC2P,继续看介绍

CC2P:输入/捕获2输出极性(Capture/Compare 2 output polarity) 位2
CC2通道配置为输出:
0:OC1高电平有效
1:OC1低电平有效
现在很清楚了吧,TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;所以这里我们设置的CC2P是0,也就是默认的OC2高电平有效。


  1. 参考自原子哥的《手把手教你学STM32系列视频》第33讲PPT ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值