目录

STM32 PWM工作过程​编辑

 STM32 PWM工作过程(通道1为例)

PWM模式1 & PWM模式2

 向上计数配置说明​编辑

STM32 定时器3输出通道引脚

自动重载的预装载寄存器

​编辑

PWM输出相关库函数

输出比较初始化函数:

设置比较值函数:

使能输出比较预装载:

使能自动重装载的预装载寄存器允许位:


STM32 PWM工作过程

 

 STM32 PWM工作过程(通道1为例)

  • CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。
  • CCMR1: OC1M[2:0]位:
  •                 对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

  • CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。
  • CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。
  • PWM模式1 & PWM模式2

    寄存器TIMx_CCMR1的OC1M[2:0]位来分析:

     向上计数配置说明

            这里的OCXREF是比较的结果,在PWM模式一下,向上计数,当计数值CNT<比较值CCR时,输出有效值。

            这里的CCxIF是终端触发标志位。

    STM32 定时器3输出通道引脚

    自动重载的预装载寄存器

    void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
    

             简单的说:

            ARPE=1,ARR立即生效。原来本来是向上计数到36,然后溢出,再回到0。

    如果计数中间修改了ARR的值,比如修改到了F5,那么再计数到F5时会立即溢出。

            APRE=0,ARR下个比较周期生效。原来本来是向上计数到36,然后溢出,再回到0。

    如果计数中间修改了ARR的值,比如修改到了FF,那么再计数到FF时不会溢出,他要到下个比较的周期,再到FF才会溢出。

    PWM输出相关库函数

    输出比较初始化函数:

    void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    typedef struct
    {
      uint16_t TIM_OCMode;  //PWM模式1或者模式2
      uint16_t TIM_OutputState; //输出使能 OR失能
      uint16_t TIM_OutputNState;
      uint16_t TIM_Pulse; //比较值,写CCRx
      uint16_t TIM_OCPolarity; //比较输出极性
      uint16_t TIM_OCNPolarity; 
      uint16_t TIM_OCIdleState;  
      uint16_t TIM_OCNIdleState; 
    } TIM_OCInitTypeDef;
    

    实例:

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure. TIM_Pulse=100;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
    

    设置比较值函数:

    void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);
    

    使能输出比较预装载:

    void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

    使能自动重装载的预装载寄存器允许位:

    void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
    

    总结 —PWM输出配置步骤:

    ① 使能定时器3和相关IO口时钟。

            使能定时器3时钟:RCC_APB1PeriphClockCmd();

            使能GPIOB时钟:RCC_APB2PeriphClockCmd();

    ② 初始化IO口为复用功能输出。函数:GPIO_Init();

            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      

    ③ 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,

            所以需要开启AFIO时钟。同时设置重映射。

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

            GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

    ④ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();

    ⑤ 初始化输出比较参数:TIM_OC2Init();

    ⑥ 使能预装载寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

    ⑦   使能定时器。TIM_Cmd();

    ⑧   不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

    作者:end_SJ

    物联沃分享整理
    物联沃-IOTWORD物联网 » 初学stm32 — PWM输出

    发表回复