jiongsheng

jiongsheng

MSPM0學習,定時器PWM模式

前言#

如果您未看過筆者之前寫的 "第一步配置" 和 "MSPM0 教程之調用 SYSCONFIG 以及配置 GPIO 輸出和輸入",強烈建議您將這兩篇先看了,以免出現配置錯誤,如果您以及完成了 SYSCONFIG 的配置,請繼續往下看

在 SYSCONFIG 中配置定時器 PWM 模式#

打開 keil,再 empty.syscfg 中打開 sysconfig 工具

image-20230606184519254

先看看 SYSCONFIG 對這個 PWM 配置的介紹

image-20230605214737910

簡單翻譯一下:

你的描述是關於脈衝寬度調製(Pulse Width Modulation,PWM)驅動模組的功能和配置選項。PWM 是一種常見的數字信號控制技術,可以用於生成具有指定占空比(占空比是指脈衝周期中高電平部分的時間與整個脈衝周期時間的比值)的邊沿對齊的波形。

在基本配置中,用戶可以:

  • 配置時鐘源:指定 PWM 波形的時鐘源,這會影響到 PWM 波形的頻率。
  • 配置定時器設置:調整 PWM 波形的周期,通常是通過配置一個內部的定時器實現的。
  • 配置 PWM:
    • 選擇 PWM 模式:比如邊沿對齊模式或者中心對齊模式。
    • 配置 PWM 通道:包括比較值,占空比等參數,這些參數會影響到輸出的 PWM 波形。

在高級配置中,用戶可以:

  • 配置交叉觸發:一些複雜的應用可能需要多個 PWM 通道同時改變狀態,這時候可以使用交叉觸發功能。

該模組支持 MSPM0 中的不同類型的定時器,包括 TIMGx 和 TIMAx。MSPM0L130x 的功能在下表中有詳細的描述。具體的參數和功能可能會因為不同的設備而有所不同,你需要查看你選擇的設備的數據手冊以獲取更詳細的信息。

介紹得很詳細,接下來直接開始配置

點擊 ADD,添加 PWM

image-20230605215122378

設置相關配置項,然後點擊 Start Timer

接在來到 PWM 設置,介紹一下配置項

image-20230605220223191

PWM Mode

可以設置兩種模式

邊沿對齊(Edge-Aligned)和中心對齊(Center-Aligned)。

在邊沿對齊模式下:

  • 定時器被配置為倒計數模式。每次加載時,輸出信號被設置為高。一旦達到比較值(決定了占空比),相應的輸出信號被設置為低。因此,每個 PWM 通道的上升時間(從低電平變為高電平)是相同的,而下降時間(從高電平變為低電平)則根據占空比的不同而不同。

在中心對齊模式下:

  • 定時器被配置為上下計數模式。當計數值上升並超過比較值時,輸出會被設置為高。當計數值下降並下降到比較值時,輸出會被設置為低。因此,每個 PWM 通道的中心點是當定時器的 LOAD 值在計數器中時。

這兩種模式各有優缺點,適合於不同的應用場景。邊沿對齊模式的實現簡單,適合於需要較高頻率的 PWM 波形。而中心對齊模式可以產生對稱的 PWM 波形,有利於減小電機等負載的電流脈動,提高系統的效率和性能。

image-20230606165936874

配置兩個 PWM 通道

點擊 FIle->Save

然後再 Keil 裡編譯,讓 dl_config.c 更新一下初始化配置

編寫 main 函數

unsigned int utick = 0;//滴答定時器中斷計數

void SysTick_Handler(void)

{

  SysTick->CTRL &= ~(1 << 16); /*清除滴答定時器中斷標誌位*/

  utick++;//滴答定時器中斷計數

}

typedef enum CompareMode

{

  CompareUp=0,

  CompareDown

}CompareMode;

int main(void)

{

  int pretime = 0;

  unsigned short CompareValue0 = 100;

  

  CompareMode comparemode = CompareUp;



  SYSCFG_DL_init();

  NVIC_EnableIRQ(UART1_INT_IRQn);

  

  pretime = utick; //get current time

  while (1) {

switch (comparemode) {

case CompareUp:

if (utick > 100 + pretime) 

​        {



DL_TimerG_setCaptureCompareValue(PWM_0_INST, CompareValue0 += 50, DL_TIMER_CC_0_INDEX);

​          pretime = utick;//update pretime

if (CompareValue0 > 700) 

​          {

​            comparemode = CompareDown;//update comparemode to CompareDown

​          }

​        }

break;

case CompareDown:

if (utick > 100 + pretime) {

DL_TimerG_setCaptureCompareValue(PWM_0_INST, CompareValue0 -= 50, DL_TIMER_CC_0_INDEX);

​          pretime = utick;//update pretime

if (CompareValue0 < 100) 

​          {

​            comparemode = CompareUp;//update comparemode to CompareUp

​          }

​        }

break;

default:

        // Handle other cases here, if necessary.

break;

​    }

  }

}


演示#

gwftd-fdmwu

轉載請標明出處

By <a href=https://www.cnblogs.com/jiongsheng > QDU_jiongsheng

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。