天天看點

關于STM32 PWM計算問題

至于STM32的PWM的基本知識,部落格 STM32——PWM基本知識及配置過程已經說的非常清楚了,這裡再說明一下PWM的頻率和占空比計算

  • 首先要搞清楚單片機的時鐘樹,搞清楚TIM的時鐘來源以及具體時鐘頻率,這裡以TIM2CH4為例,假設時鐘來源為内部時鐘HSI,最終到APB1的時鐘為8M,TIM2的時鐘也為8M
  • 其次,搞明白PWM的計算公式,PWM的周期由ARR決定,定時器的計數器跑完一個(ARR+1)即為一個PWM周期,而計數器的計數機關時間為(PSC+1)/8M
關于STM32 PWM計算問題
  • 計算,假設PWM周期設定為20ms即50Hz,

    20ms = (ARR+1)*[(PSC+1)/8M]

    ,假設PSC=7,則計數器計數機關為1us,再将ARR+1設定為20 000,

    1us*20 000=20ms

    即設定PWM周期20ms
  • PWM的占空比與CCRx和ARR寄存器有關,ARR決定CCRx的最大值,CCRx使用

    TIM_SetComparex

    設定
  • 備注

    在實際操作中,因為單片機焊接了外部晶振8M,以為定時器的APB1時鐘頻率為72M,再怎麼計算修改寄存器值,輸出的PWM都不對,後來才發現單片機預設使用的是内部時鐘源!

  • 代碼執行個體
    void TIM2_PWM_Init()
    {  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);                                                                      	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	TIM_TimeBaseStructure.TIM_Period = 20000-1; //arr 20000*1us=20ms
    	TIM_TimeBaseStructure.TIM_Prescaler = 8-1;//psc 8/8M =1us
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1:CNT<CCR時輸出有效
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    	TIM_OCInitStructure.TIM_Pulse = 0;//TIM_SetCompare 
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//設定極性-有效為高電平
    	TIM_OC4Init(TIM2, &TIM_OCInitStructure); 
    
        TIM_CtrlPWMOutputs(TIM2,ENABLE);
    	TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); 
    	
    	TIM_ARRPreloadConfig(TIM2, ENABLE);
    	TIM_Cmd(TIM2, ENABLE); 
    }
    
    TIM_SetCompare4(TIM2,10000);//20ms 50%占空比	  
               

繼續閱讀