stm32 pwm波工作原理

   20180812带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。

 pwm波简介:脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用
微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽
度的控制,PWM 原理如图 14.1.1 所示:

            stm32 pwm波工作原理
图 14.1.1 PWM 原理示意图
图 14.1.1 就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM
模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的 PWM
示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,
IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。
改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的
频率,这就是 PWM 输出的原理。

定时器中断时间计算:自动装载值*系统频率/分频系数(系统频率为72000000,分频系数为72的话,定时器频率为 1000000)

一般定时器有四个通道(有时要复用),配置选择的通道设置为pwm波输出。

自己调试代码如下stm32c8t6板子使用通道一输出pwm波:

void pwm_TIM1_init(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;         
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;        
        TIM_OCInitTypeDef TIM1_OCInitStructure;        
        //µÚÒ»²½£ºÅäÖÃʱÖÓ                 
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        //µÚ¶þ²½£¬ÅäÖÃgoio¿Ú          
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;         
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;         
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;               
        GPIO_Init(GPIOB,&GPIO_InitStructure);        
 
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;         
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;         
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                
        //µÚÈý²½£¬¶¨Ê±Æ÷»ù±¾ÅäÖà     
    
        TIM_TimeBaseStructure.TIM_Period=360-1;                  
        TIM_TimeBaseStructure.TIM_Prescaler=0;          
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;                     
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
        
        TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
      TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
      TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 
      TIM1_OCInitStructure.TIM_Pulse = 200; 
      TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
      TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; 
      TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; 
      TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; 
      TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
//        
//      TIM1_OCInitStructure.TIM_Pulse =200; 
//      TIM_OC2Init(TIM1,&TIM1_OCInitStructure); 
 
        
        TIM_Cmd(TIM1,ENABLE);
      TIM_CtrlPWMOutputs(TIM1,ENABLE);
        
}