STM32 PWM笔记

关于PWM的STM32

         stm32的定时器除了TIM6和TIM7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出。而通用定时器也能同时产生多达4路PWM输出,stm32最多可以同时产生30路PWM输出。通用定时器TIMx产生PWM输出,用到寄存器:捕获/比较模式寄存器TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4),还有个TIMx的ARR寄存器是用来控制PWM输出频率的。

PWM基本原理:

        控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。

 

PWM工作过程:

定时器从0开始向上计数

0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平

t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平

当TIMx_CNT值达到ARR时,定时器溢出,至此一个PWM周期完成。

                      

PWM一般配置步骤:

  1. 使能相关时钟(定时器和GPIO)
  2. 初始化GPIO
  3. 初始化定时器
  4. 初始化输出比较参数
  5. 使能自动重装载的预装载寄存器
  6. 使能定时器
  7. 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();
    //TIM3 PWM输出初始化,arr:自动重装值,psc:时钟预分频数
    void TIM3_PWM_Init(u16 arr,u16 psc)
    {  
       GPIO_InitTypeDef GPIO_InitStructure;
       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       TIM_OCInitTypeDef  TIM_OCInitStructure;
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能定时器3时钟
       //使能GPIO外设和AFIO复用功能模块时钟
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
       GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  
       //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOB.5
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;    //TIM_CH2
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
     
       //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
       TIM_TimeBaseStructure.TIM_Period = arr; 
       //设置用来作为TIMx时钟频率除数的预分频值
       TIM_TimeBaseStructure.TIM_Prescaler =psc; 
       TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
       //TIM向上计数模式
       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
       //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
       TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化TIM3
       	 
       //选择定时器模式:TIM脉冲宽度调制模式2
       TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
       //输出极性:TIM输出比较极性高
       TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
       TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据指定的参数初始化外设TIM3 OC2
       //使能TIM3在CCR2上的预装载寄存器
       TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  
       TIM_Cmd(TIM3, ENABLE);  //使能TIM3
    }
    

猜你喜欢

转载自blog.csdn.net/lly_3485390095/article/details/83512018