STM32 Cubemx 輸出可調頻率與占空比的PWM


  這里就不對STM32的PWM進行講解了,想要了解的可以百度一下,這里主要說怎么實現。

  1、建立工程,我選的是STM32F103zet6芯片,選擇定時器的PWM功能

  

  2、配置時鍾,我這里配的是內部時鍾,沒有配外部時鍾,而且不是最大時鍾,有需要的可以自己改

  

  3、配置定時器,這里的話默認就可以,因為代碼里面需要對配置的初始化代碼進行修改的,而修改后才可以實現該功能

  

  4、生成代碼后,修改代碼,找到PWM初始化函數,修改為如下代碼,注意要把初始化函數前面的 static 關鍵字也去掉,而且函數聲明也要跟着修改

void MX_TIM4_Init(uint16_t pre,uint16_t pul) //修改初始化函數,改變頻率與PWM
{
  //占空比=Pulse/Period;頻率:f=48M/pre/per
    
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim4.Instance = TIM4;
  htim4.Init.Prescaler =pre; //分頻(關鍵)
  htim4.Init.Period = 100-1;//計數周期 (關鍵,若100的計數周期對於一些頻率跟占空比誤差大的話,可以自己計算更改調試計數周期大小)  
    htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = pul;//脈沖計數(關鍵)
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  HAL_TIM_MspPostInit(&htim4);

}

  5、接着在自己需要的代碼里插入,PWM開始停止函數就可以啦

HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); //PWM開啟函數
MX_TIM4_Init(uint16_t pre,uint16_t pul); //改變參數就可實現改變占空比跟頻率的目的了
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);//停止PWM

  這里我說一下核心部分:占空比 = (Pulse/Period)*100%;頻率: f = 48M/Prescaler/Period;影響PWM占空比跟頻率的參數這主要是 Pulse、Prescaler、Period 這3個;頻率跟占空比都與Period(計數周期)有關,只要我們把計數周期定下來,修改Prescaler、跟Pulse這兩個值,就可以直接修改PWM的頻率跟占空比了。具體要多少的占空比跟頻率,就自己計算一下就可以了。舉個例子說明一下:這里Period設為100,如果我要設定一個頻率為1500Hz、占空比5%的PWM波,只需要傳入參數Pulse=5(占空比 = Pulse / Period * 100% =(5/100) * 100%=5%)Prescaler=320(f = 系統頻率 / 分頻 / 計數周期 = 48M/320/100 = 1500Hz)即可,邏輯分析儀采集結果如下圖:

  

 

補充一點:如果頻率要求快,而且精度要求高的,就選用晶振大的 STM32 系列,晶振大誤差就小,這里如果定好占空比的話,只調頻率可以調到很准確,或者定好頻率調占空比也是一樣,如果要同時改變頻率跟占空比,頻率高了就會有誤差了,所以選用大晶振可以減小點誤差。

 

附一個我自己算出來的頻率占空比表(已全部用示波器調試驗證):

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM