PWM输出关键点

定时器输出PWM其实很简单,主要关注下面几件事情

  • 1.PWM频率设置:
    这个通过设置定时器的ARR寄存器即可,外部通过TIM_Period 来配置. TimerClk/TIM_Period 即为PWM频率.

  • 2.PWM占空比设置:
    这个需要设置对应通道的CCR寄存器,定时器工作时,会比较CCR的值,当计数器工作在递增模式时,当计数器的值小于CCR中的值时,输出TIM_OCPolarity配置的极性,反之输出相反的极性.
    在这里插入图片描述

  • 3.PWM极性
    PWM的极性通过TIM_OCPolarity配置, 一般默认都是高电平.一般我们说占空比为20%,就是意为一个周期内高电平持续时间占一个周期时间的20%.
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

代码如下:

uint16_t CCR1_Val = 333;
uint16_t CCR2_Val = 249;
uint16_t CCR3_Val = 166;

nt pwmout_main(void)
{
  /* 一些GPIO配置,不展示代码了*/
  TIM_Config();
  
  /* -----------------------------------------------------------------------     
    TIM1 Channel1 占空比 = (TIM1_CCR1/ TIM3_ARR)* 100 = 50%
    TIM1 Channel2 占空比 = (TIM1_CCR2/ TIM3_ARR)* 100 = 37.5%
    TIM1 Channel3 占空比 = (TIM1_CCR3/ TIM3_ARR)* 100 = 25%

    Note: 
     下面把定时器的时钟设置为21M,
  ----------------------------------------------------------------------- */   
  /* 
     TIM8 使用 APB2, 它的时钟是= 2 * PCLK2 = SystemCoreClock (168 MHz) */
  PrescalerValue = (uint16_t) ((SystemCoreClock) / 21000000) - 1;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 665; //PWM频率为21000000/665 = 31.578K
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //占空比为333/665=50.07%
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //占空比对应的是高电平.

  TIM_OC1Init(TIM8, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;//占空比=249/665=37.44%

  TIM_OC2Init(TIM8, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;//占空比=166/665=24.96%

  TIM_OC3Init(TIM8, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM8, ENABLE);

  /* 下面这句代码很重要,没有的话,PWM没有输出的*/
  TIM_CtrlPWMOutputs(TIM8, ENABLE);

  /* TIM8 enable counter */
  TIM_Cmd(TIM8, ENABLE);

}

逻辑分析仪测试结果:

各个通道的PWM频率都是相同的,计算公式为PWM频率为21000000/665 = 31.578K.但是逻辑分析仪测出来的为31.45K,稍微有点出入(先不计较了)

  • 通道1测试结果
    占空比为333/665=50.07%, 符合预期
    在这里插入图片描述
  • 通道2测试结果:
    占空比=249/665=37.44%
    在这里插入图片描述
  • 通道3测试结果:
    占空比=166/665=24.96%
    在这里插入图片描述
  • 其它测试
    特意将极性改为低电平,则占空比就变成了低电平占整个周期的比例.如下图
    通道3的高电平变的很长.
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    在这里插入图片描述

更多推荐