mFrame
載入中...
搜尋中...
無符合項目
mcxa153::core::CorePulseWidth 類別 參考文件

MCXA153 脈衝寬度調變 (PWM) 控制類別 更多...

#include <CorePulseWidth.h>

類別mcxa153::core::CorePulseWidth的繼承圖:
ufm::lang::Object hal::counter::PulseWidth ufm::lang::Interface hal::Base

公開型態

enum struct  Select : unsigned char { CTIMER0 = 0 , CTIMER1 = 1 , CTIMER2 = 2 }
 CTIMER 定時器選擇枚舉 更多...
 
enum struct  Channel : unsigned char { MAT0 = 0 , MAT1 = 1 , MAT2 = 2 , MAT3 = 3 }
 CTIMER 匹配通道選擇枚舉 更多...
 

公開方法(Public Methods)

 CorePulseWidth (Select select, Channel periodChannel)
 建構 CorePulseWidth PWM 控制物件
 
virtual ~CorePulseWidth (void) override
 銷毀 CorePulseWidth PWM 控制物件
 
virtual bool deinit (void) override
 PWM 控制器硬體反初始化
 
virtual bool init (void) override
 PWM 控制器硬體初始化
 
virtual bool isInit (void) override
 檢查 PWM 控制器初始化狀態
 
virtual int setPeriod (float hz) override
 設定 PWM 信號頻率
 
virtual bool setPercent (int channel, float percent) override
 設定指定通道的 PWM 占空比
 
virtual bool getPercent (int channel, float &result) override
 查詢指定通道的 PWM 占空比
 
virtual bool start (bool enable) override
 啟動或停止 PWM 輸出
 
- 公開方法(Public Methods) 繼承自 ufm::lang::Object
void * operator new (size_t n)
 使用運算子 new 分配記憶體
 
void * operator new (size_t n, void *p)
 在指定記憶體上調用運算子 new
 
virtual ufm::lang::ObjectgetObject (void) override
 取得對應的 Object 物件
 
void delay (int milliseconds) const
 延遲指定的毫秒數進行執行緒等待
 
bool equals (Object *object) const
 判斷與另一物件是否為相同參照(指標型態比較)
 
bool equals (Object &object) const
 判斷與另一物件是否為相同參照(參照型態比較)
 
void wait (void) const
 使當前線程等待直到被通知
 
bool wait (int timeout) const
 等待通知或超時
 
bool yield (void) const
 讓執行緒讓渡控制權給同優先權的下一個執行緒
 
int lock (void) const
 核心鎖定,鎖定期間禁止線程切換
 
int unlock (void) const
 核心解鎖
 
ufm::sys::ThreadcurrentThread (void) const
 取得當前執行緒指標
 
virtual int hashcode (void) const
 返回對象的哈希碼值。支持這種方法是為了散列表,如HashMap提供的那樣。
 
- 公開方法(Public Methods) 繼承自 ufm::lang::Interface
virtual ~Interface (void)=default
 虛擬析構函式
 

公開屬性

void *const vBase
 CTIMER 硬體基礎位址指標
 
const Channel vPeriodChannel
 PWM 週期控制通道
 

詳細描述

MCXA153 脈衝寬度調變 (PWM) 控制類別

CorePulseWidth 類別提供基於 MCXA153 微控制器 CTIMER 模組的 PWM 信號產生功能。 支援多通道 PWM 輸出,可用於馬達控制、LED 調光、類比信號合成等應用。 實作了標準的 hal::counter::PulseWidth 介面。

主要功能:

  • 可配置的 PWM 頻率 (週期設定)
  • 多通道占空比控制 (0% 到 100%)
  • 硬體定時器精確控制
  • 同步多通道輸出
  • 啟動/停止控制

硬體支援:

  • 基於 CTIMER0/1/2 硬體定時器
  • 每個定時器支援 4 個匹配通道 (MAT0-MAT3)
  • 16位元解析度計數器
  • 可變預分頻器支援寬頻率範圍

技術特性:

  • PWM 頻率範圍:1Hz 到 MHz 級別
  • 占空比解析度:依頻率和時鐘而定
  • 輸出極性:可透過硬體配置控制
  • 死區時間:支援互補輸出應用

典型應用:

  • 馬達速度控制 (直流馬達、伺服馬達)
  • LED 亮度調節和 RGB 顏色控制
  • 音頻信號產生和揚聲器驅動
  • 電源管理 (DC-DC 轉換器控制)
  • 類比信號模擬 (透過低通濾波)

使用流程:

  1. 建構函數指定定時器和週期通道
  2. 調用 init() 初始化硬體
  3. 設定 PWM 頻率 setPeriod()
  4. 配置各通道占空比 setPercent()
  5. 啟動 PWM 輸出 start()

使用範例:

// 建立 PWM 控制器,使用 CTIMER0,MAT3 作為週期通道
CorePulseWidth pwm(CorePulseWidth::Select::CTIMER0,
CorePulseWidth::Channel::MAT3);
pwm.init(); // 初始化硬體
pwm.setPeriod(1000.0f); // 設定 1kHz PWM 頻率
pwm.setPercent(0, 50.0f); // 通道 0 設定 50% 占空比
pwm.setPercent(1, 25.0f); // 通道 1 設定 25% 占空比
pwm.start(true); // 啟動 PWM 輸出
MCXA153 脈衝寬度調變 (PWM) 控制類別
Definition CorePulseWidth.h:103

效能考量:

  • 較高頻率會降低占空比解析度
  • 多通道同步輸出,無相位差
  • 硬體實作,CPU 負載極低
  • 支援中斷驅動的週期事件

重要限制:

  • 同一定時器的所有通道共享相同頻率
  • 週期通道不可用於 PWM 輸出
  • 頻率變更會影響所有通道的輸出
  • 某些極端頻率可能無法精確達成
參閱
hal::counter::PulseWidth PWM 介面定義
Select 定時器選擇枚舉
Channel 通道選擇枚舉
警告
頻繁變更 PWM 設定可能產生輸出毛刺
繼承自 ufm::lang::Objecthal::counter::PulseWidth

列舉型態成員說明文件

◆ Channel

enum struct mcxa153::core::CorePulseWidth::Channel : unsigned char
strong

CTIMER 匹配通道選擇枚舉

用於選擇 CTIMER 模組中的匹配輸出通道。每個 CTIMER 提供 4 個匹配通道, 其中一個被指定為週期通道 (控制 PWM 頻率),其餘可用於 PWM 輸出。

枚舉值說明:

  • MAT0: 匹配通道 0
    • 暫存器:CTIMERx_MR0
    • 輸出引腳:依 CTIMER 而定
    • 常用作週期控制通道
  • MAT1: 匹配通道 1
    • 暫存器:CTIMERx_MR1
    • 輸出引腳:依 CTIMER 而定
    • 可用於 PWM 輸出
  • MAT2: 匹配通道 2
    • 暫存器:CTIMERx_MR2
    • 輸出引腳:依 CTIMER 而定
    • 可用於 PWM 輸出
  • MAT3: 匹配通道 3
    • 暫存器:CTIMERx_MR3
    • 輸出引腳:依 CTIMER 而定
    • 常用作週期控制通道

通道功能配置:

  • 週期通道:設定 PWM 的基礎頻率和週期
  • PWM 通道:產生可變占空比的輸出信號
  • 所有通道共享相同的時基計數器
  • 匹配事件可觸發中斷或 DMA

引腳對應 (典型配置):

  • CTIMER0_MAT0 → P0.5 或其他可選引腳
  • CTIMER0_MAT1 → P0.6 或其他可選引腳
  • CTIMER0_MAT2 → P0.7 或其他可選引腳
  • CTIMER0_MAT3 → P0.8 或其他可選引腳

使用原則:

  • 週期通道不可用於 PWM 輸出
  • PWM 通道的占空比 = MATx_value / Period_value
  • 建議使用 MAT3 作為週期通道 (最高優先級)
通道選擇影響可用的 PWM 輸出數量
警告
週期通道變更會影響所有 PWM 輸出
參閱
Select CTIMER 選擇枚舉

◆ Select

enum struct mcxa153::core::CorePulseWidth::Select : unsigned char
strong

CTIMER 定時器選擇枚舉

用於選擇 MCXA153 微控制器中的哪一個 CTIMER 模組作為 PWM 產生器。 MCXA153 提供三個獨立的 CTIMER 模組,每個都可以獨立配置為 PWM 控制器。

枚舉值說明:

  • CTIMER0: 第一個定時器模組
    • 基礎位址:0x40004000
    • 中斷號:CTIMER0_IRQn
    • 適合通用 PWM 應用
  • CTIMER1: 第二個定時器模組
    • 基礎位址:0x40008000
    • 中斷號:CTIMER1_IRQn
    • 可與其他模組獨立運行
  • CTIMER2: 第三個定時器模組
    • 基礎位址:0x4000C000
    • 中斷號:CTIMER2_IRQn
    • 提供額外的 PWM 通道資源

設計考量:

  • 每個 CTIMER 支援 4 個匹配輸出通道
  • 所有通道共享相同的時基和頻率
  • 可同時使用多個 CTIMER 產生不同頻率的 PWM
  • 各 CTIMER 間相互獨立,無干擾

應用分配建議:

  • CTIMER0: 主要馬達控制
  • CTIMER1: LED/顯示控制
  • CTIMER2: 音頻/信號產生
選擇後在物件生命週期內不可變更
參閱
Channel 通道選擇枚舉

建構子與解構子說明文件

◆ CorePulseWidth()

mcxa153::core::CorePulseWidth::CorePulseWidth ( Select select,
Channel periodChannel )

建構 CorePulseWidth PWM 控制物件

建立一個新的 PWM 控制器實例,指定使用的 CTIMER 模組和週期控制通道。 建構後需要調用 init() 方法才能開始使用 PWM 功能。

參數
select選擇的 CTIMER 定時器模組
  • CTIMER0: 第一個定時器模組 (0x40004000)
  • CTIMER1: 第二個定時器模組 (0x40008000)
  • CTIMER2: 第三個定時器模組 (0x4000C000)
periodChannel用於週期控制的匹配通道
  • MAT0: 匹配通道 0 (通常用於 PWM 輸出)
  • MAT1: 匹配通道 1 (通常用於 PWM 輸出)
  • MAT2: 匹配通道 2 (通常用於 PWM 輸出)
  • MAT3: 匹配通道 3 (推薦用於週期控制)

建構過程:

  1. 根據 select 設定 vBase 硬體基礎位址
  2. 儲存 periodChannel 作為週期控制通道
  3. 初始化基礎類別 (Object 和 PulseWidth)
  4. 準備硬體控制介面

資源配置:

  • 確定硬體定時器對應關係
  • 建立暫存器存取介面
  • 預留必要的系統資源
  • 設定物件狀態為未初始化

設計考量:

  • 週期通道選擇影響可用的 PWM 輸出數量
  • 推薦使用 MAT3 作為週期通道
  • 這樣 MAT0-MAT2 可用於 3 個 PWM 輸出
  • 不同應用可能需要不同的通道配置

使用範例:

// 建立標準 PWM 控制器 (3 個輸出通道)
CorePulseWidth motor_pwm(CorePulseWidth::Select::CTIMER0,
CorePulseWidth::Channel::MAT3);
// 建立特殊配置 PWM 控制器 (2 個輸出通道)
CorePulseWidth led_pwm(CorePulseWidth::Select::CTIMER1,
CorePulseWidth::Channel::MAT1);

後續操作:

  1. 調用 init() 初始化硬體
  2. 設定 PWM 頻率 setPeriod()
  3. 配置通道占空比 setPercent()
  4. 啟動 PWM 輸出 start()
建構函數不會初始化硬體,需要明確調用 init()
警告
確保選擇的定時器未被其他功能佔用
參閱
init() 硬體初始化方法
Select 定時器選擇枚舉
Channel 通道選擇枚舉

◆ ~CorePulseWidth()

virtual mcxa153::core::CorePulseWidth::~CorePulseWidth ( void )
overridevirtual

銷毀 CorePulseWidth PWM 控制物件

清理 PWM 控制器資源,確保硬體定時器正確關閉和資源釋放。 在物件生命週期結束時自動調用。

銷毀過程:

  1. 檢查硬體初始化狀態
  2. 如果已初始化,自動調用 deinit()
  3. 停止所有 PWM 輸出信號
  4. 關閉定時器時鐘
  5. 重設定時器暫存器
  6. 釋放系統資源
  7. 調用基礎類別解構函數

硬體清理:

  • 停用定時器運行
  • 清除所有匹配暫存器
  • 重設預分頻器
  • 停用中斷源
  • 復原引腳配置 (如果需要)

安全特性:

  • 確保不會產生意外的輸出信號
  • 避免硬體資源洩漏
  • 防止干擾其他功能模組
  • 支援多次建構/銷毀循環

輸出狀態:

  • 所有 PWM 輸出立即停止
  • 輸出引腳回到預設狀態
  • 不會產生額外的邊緣信號
  • 確保系統狀態清潔

使用注意:

  • 銷毀前確保相關應用已安全停止
  • 馬達控制應用需要考慮慣性影響
  • LED 控制會立即關閉所有輸出
  • 音頻應用可能產生爆音

典型使用場景:

{
CorePulseWidth pwm(Select::CTIMER0, Channel::MAT3);
pwm.init();
pwm.setPeriod(1000.0f);
pwm.start(true);
// ... 使用 PWM 功能
} // 自動調用解構函數,清理資源
虛擬解構函數,支援多型操作
警告
銷毀會立即停止所有 PWM 輸出
參閱
deinit() 硬體反初始化方法
ufm::lang::Object 基礎類別

函式成員說明文件

◆ deinit()

virtual bool mcxa153::core::CorePulseWidth::deinit ( void )
overridevirtual

PWM 控制器硬體反初始化

停用 CTIMER 硬體模組,清除所有設定,並釋放相關系統資源。 反初始化會立即停止所有 PWM 輸出信號。

傳回值
true 反初始化成功,硬體已正確關閉
false 反初始化失敗,可能原因:
  • 硬體未曾初始化
  • 定時器處於異常狀態
  • 系統資源衝突

反初始化步驟:

  1. 檢查目前初始化狀態
  2. 停用定時器運行 (TCR.CEN = 0)
  3. 清除所有匹配暫存器 (MR0-MR3)
  4. 重設預分頻器 (PR = 0)
  5. 停用所有中斷 (MCR = 0)
  6. 清除外部匹配設定 (EMR = 0)
  7. 停用定時器時鐘
  8. 更新初始化狀態標誌

硬體狀態變化:

  • 計數器停止運行
  • 所有 PWM 輸出停止
  • 匹配事件停止產生
  • 中斷源被停用
  • 時鐘消耗降至最低

輸出行為:

  • PWM 信號立即停止
  • 輸出引腳保持最後狀態
  • 不產生額外的邊緣變化
  • 消除潛在的毛刺信號

安全考量:

  • 馬達應用:立即停止可能損壞機械系統
  • LED 應用:所有輸出立即關閉
  • 音頻應用:突然停止可能產生爆音
  • 電源控制:需要考慮系統穩定性

使用時機:

  • 系統關機前
  • 切換到其他控制方式
  • 錯誤處理和恢復
  • 低功耗模式進入

範例使用:

if (pwm.isInit()) {
pwm.start(false); // 先優雅停止
delay_ms(100); // 等待系統穩定
if (!pwm.deinit()) { // 反初始化
// 錯誤處理
}
}
反初始化後需要重新調用 init() 才能恢復功能
警告
立即停止 PWM 可能對某些應用造成影響
參閱
init() 硬體初始化方法
isInit() 狀態檢查方法

實作 hal::Base.

◆ getPercent()

virtual bool mcxa153::core::CorePulseWidth::getPercent ( int channel,
float & result )
overridevirtual

查詢指定通道的 PWM 占空比

讀取特定 PWM 輸出通道的目前占空比設定值。 返回的是軟體設定值,而非即時測量值。

參數
channel目標 PWM 輸出通道編號 範圍:0 到 3 (對應 MAT0-MAT3) 限制:週期通道會返回錯誤
result用於儲存查詢結果的浮點數參考 輸出:占空比百分比 (0.0% 到 100.0%) 精度:依硬體解析度和計算精度而定
傳回值
true 查詢成功,result 包含有效值
false 查詢失敗,可能原因:
  • 硬體未初始化
  • 通道編號無效
  • 指定通道為週期控制通道
  • 硬體狀態異常

查詢原理:

  • 讀取通道匹配暫存器值
  • 讀取週期匹配暫存器值
  • 計算:percent = (Match_Value * 100) / Period_Value
  • 返回計算後的百分比

數值精度:

  • 受硬體暫存器位數限制
  • 可能與原始設定值略有差異
  • 由於整數運算的舍入誤差
  • 通常精度足以滿足大多數應用

使用場景:

  • 系統狀態監控和顯示
  • 閉環控制的回授檢查
  • 配置驗證和除錯
  • 系統診斷和記錄

使用範例:

float current_duty;
// 查詢馬達 PWM 占空比
if (pwm.getPercent(0, current_duty)) {
printf("馬達速度: %.1f%%\n", current_duty);
} else {
printf("查詢失敗\n");
}
// 系統狀態監控
for (int ch = 0; ch < 3; ch++) {
if (ch != periodChannel && pwm.getPercent(ch, current_duty)) {
log_channel_state(ch, current_duty);
}
}

即時性考量:

  • 返回的是目前的暫存器設定值
  • 不是即時的輸出電平測量
  • 如果正在動態調整,可能與實際輸出有短暫差異
  • 查詢速度快,適合高頻監控

錯誤處理:

float duty;
if (!pwm.getPercent(channel, duty)) {
// 處理查詢錯誤
if (!pwm.isInit()) {
// PWM 未初始化
} else if (channel == periodChannel) {
// 週期通道不支援查詢
} else {
// 其他錯誤
}
}
返回的是設定值,非實際輸出測量值
參閱
setPercent() 占空比設定方法
isInit() 初始化狀態檢查

實作 hal::counter::PulseWidth.

◆ init()

virtual bool mcxa153::core::CorePulseWidth::init ( void )
overridevirtual

PWM 控制器硬體初始化

配置並啟用 CTIMER 硬體模組,準備 PWM 信號產生功能。 初始化會設定定時器基礎配置,但不會立即開始 PWM 輸出。

傳回值
true 初始化成功,硬體已準備就緒
false 初始化失敗,可能原因:
  • 硬體已經初始化
  • 定時器資源被其他功能佔用
  • 系統時鐘未正確配置
  • 硬體故障或異常

初始化步驟:

  1. 檢查重複初始化
  2. 啟用 CTIMER 時鐘源
  3. 重設定時器暫存器
  4. 設定定時器為計數模式 (Timer Mode)
  5. 配置週期通道匹配設定
  6. 設定外部匹配行為 (EMR)
  7. 配置匹配控制 (MCR)
  8. 清除計數器 (TC = 0)
  9. 更新初始化狀態標誌

硬體配置:

  • 計數模式:向上計數
  • 時鐘源:系統時鐘或分頻時鐘
  • 預分頻器:根據需求設定
  • 匹配行為:重設計數器 (週期通道)
  • 外部輸出:準備 PWM 波形產生

預設狀態:

  • 定時器停止運行
  • 所有匹配值為 0
  • PWM 輸出未啟動
  • 準備接受頻率和占空比設定

資源需求:

  • CTIMER 硬體模組獨占使用
  • 適當的系統時鐘配置
  • 足夠的系統功耗預算
  • 相關 GPIO 引腳配置 (另外處理)

後續操作:

  1. 調用 setPeriod() 設定 PWM 頻率
  2. 使用 setPercent() 配置占空比
  3. 調用 start() 啟動 PWM 輸出
  4. 根據需要調整參數

使用範例:

CorePulseWidth pwm(Select::CTIMER0, Channel::MAT3);
if (pwm.init()) {
// 硬體初始化成功
pwm.setPeriod(1000.0f); // 設定 1kHz
pwm.setPercent(0, 50.0f); // 通道 0: 50%
pwm.start(true); // 開始輸出
} else {
// 初始化失敗處理
}

錯誤處理:

  • 檢查返回值確認初始化狀態
  • 失敗時檢查資源佔用情況
  • 確認系統時鐘配置正確
  • 考慮重試機制
初始化不會立即開始 PWM 輸出
警告
重複初始化會返回 false
參閱
deinit() 硬體反初始化方法
isInit() 狀態檢查方法

實作 hal::Base.

◆ isInit()

virtual bool mcxa153::core::CorePulseWidth::isInit ( void )
overridevirtual

檢查 PWM 控制器初始化狀態

查詢 CTIMER 硬體模組是否已正確初始化並準備運行。 用於驗證硬體狀態和診斷系統問題。

傳回值
true PWM 控制器已初始化且可用
false PWM 控制器未初始化或異常

檢查項目:

  • 內部初始化狀態標誌
  • CTIMER 時鐘是否啟用
  • 定時器暫存器配置
  • 硬體模組回應性

狀態判定:

  • 初始化標誌為真
  • 硬體暫存器可正常存取
  • 定時器配置符合預期
  • 無硬體錯誤狀態

典型使用場景:

  • 功能調用前的安全檢查
  • 系統診斷和除錯
  • 錯誤恢復流程
  • 狀態監控和報告

使用範例:

if (pwm.isInit()) {
// 安全進行 PWM 操作
pwm.setPeriod(frequency);
pwm.start(true);
} else {
// 需要先初始化
if (!pwm.init()) {
// 初始化失敗處理
}
}

除錯應用:

void diagnosticPWM() {
if (!pwm.isInit()) {
log("PWM not initialized");
return;
}
// 繼續其他檢查
}

效能考量:

  • 此方法執行速度很快
  • 主要檢查軟體狀態標誌
  • 可頻繁調用而無顯著開銷
  • 不會影響硬體運行狀態
返回 true 並不保證所有 PWM 功能完全正常
參閱
init() 硬體初始化方法
deinit() 硬體反初始化方法

實作 hal::Base.

◆ setPercent()

virtual bool mcxa153::core::CorePulseWidth::setPercent ( int channel,
float percent )
overridevirtual

設定指定通道的 PWM 占空比

配置特定 PWM 輸出通道的占空比百分比,控制高電平時間比例。 占空比變更會立即生效,但建議在適當時機進行調整。

參數
channel目標 PWM 輸出通道編號 範圍:0 到 3 (對應 MAT0-MAT3) 限制:週期通道不可用於 PWM 輸出
percent占空比百分比 範圍:0.0% 到 100.0%
  • 0.0%: 完全關閉 (持續低電平)
  • 50.0%: 對稱方波 (高低電平時間相等)
  • 100.0%: 完全開啟 (持續高電平) 精度:依 PWM 頻率和定時器解析度而定
傳回值
true 占空比設定成功
false 設定失敗,可能原因:
  • 硬體未初始化
  • 通道編號無效
  • 指定通道為週期控制通道
  • 占空比參數超出範圍

占空比計算:

  • Match_Value = (Period_Value * percent) / 100
  • High_Time = Match_Value / Timer_Clock
  • Low_Time = (Period_Value - Match_Value) / Timer_Clock
  • Duty_Cycle = High_Time / (High_Time + Low_Time)

解析度特性:

  • 實際解析度 = Period_Value + 1
  • 例:Period = 999,解析度 = 1000 (約 0.1%)
  • 高頻率時解析度可能降低
  • 低頻率時可達到極高解析度

輸出極性:

  • 預設:高電平為有效狀態
  • 可透過硬體配置反相
  • 0% = 持續無效電平
  • 100% = 持續有效電平

通道獨立性:

  • 每個通道可獨立設定占空比
  • 所有通道共享相同頻率
  • 通道間相位同步 (同時開始週期)
  • 互不干擾的占空比控制

動態調整:

  • 運行中可安全變更占空比
  • 變更在下一個週期開始時生效
  • 避免產生毛刺或異常脈衝
  • 支援平滑的占空比變化

應用範例:

// 三相馬達控制 (120度相差)
pwm.setPercent(0, 50.0f); // A 相
pwm.setPercent(1, 50.0f); // B 相
pwm.setPercent(2, 50.0f); // C 相
// RGB LED 顏色混合
pwm.setPercent(0, 80.0f); // 紅色 (80%)
pwm.setPercent(1, 60.0f); // 綠色 (60%)
pwm.setPercent(2, 40.0f); // 藍色 (40%)
// 馬達速度控制
float speed = getDesiredSpeed();
pwm.setPercent(0, speed); // 0-100% 速度

特殊值處理:

  • 0.0%: 確保完全關閉輸出
  • 100.0%: 確保完全開啟輸出
  • 中間值:線性對應到匹配暫存器
  • 負值:自動限制為 0%
  • 超過100:自動限制為 100%
週期控制通道不能設定占空比
警告
頻繁變更占空比可能增加系統負載
參閱
setPeriod() 頻率設定方法
getPercent() 占空比查詢方法

實作 hal::counter::PulseWidth.

◆ setPeriod()

virtual int mcxa153::core::CorePulseWidth::setPeriod ( float hz)
overridevirtual

設定 PWM 信號頻率

配置 PWM 信號的基礎頻率,影響所有輸出通道的週期時間。 頻率變更會重新計算定時器預分頻器和週期匹配值。

參數
hzPWM 頻率 (赫茲) 範圍:約 1Hz 到 1MHz (依系統時鐘而定) 常用值:
  • 馬達控制:1kHz - 20kHz
  • LED 調光:100Hz - 1kHz
  • 音頻合成:20Hz - 20kHz
  • 開關電源:20kHz - 100kHz
傳回值
int 設定結果狀態碼 0: 設定成功 -1: 硬體未初始化 -2: 頻率參數無效 (≤0 或過大) -3: 硬體無法達成指定頻率

頻率計算原理:

  • System_Clock = 系統主時鐘頻率
  • Timer_Clock = System_Clock / (Prescale + 1)
  • PWM_Frequency = Timer_Clock / (Period + 1)
  • Period = Timer_Clock / PWM_Frequency - 1

自動預分頻:

  • 算法會自動選擇最佳預分頻值
  • 在頻率精度和解析度間取得平衡
  • 最大化占空比的可調節範圍
  • 避免計數器溢位問題

解析度影響:

  • 更低頻率 = 更高占空比解析度
  • 更高頻率 = 更低占空比解析度
  • 典型解析度:8位元到16位元

頻率精度:

  • 受定時器時鐘和預分頻限制
  • 某些頻率可能無法精確達成
  • 會選擇最接近的可實現頻率
  • 誤差通常小於 1%

系統影響:

  • 頻率變更會瞬間影響所有通道
  • 可能產生短暫的波形異常
  • 建議在停止狀態下變更頻率
  • 變更會重設所有計數器

使用範例:

// 馬達控制 PWM (10kHz)
int result = pwm.setPeriod(10000.0f);
if (result != 0) {
printf("頻率設定失敗: %d\n", result);
}
// LED 調光 PWM (1kHz)
pwm.setPeriod(1000.0f);

頻率選擇建議:

  • 馬達控制:10-20kHz (避免聽覺範圍)
  • LED/背光:200-2kHz (避免閃爍)
  • 電源轉換:50-100kHz (提高效率)
  • 音頻應用:依音頻需求選擇

效能考量:

  • 較高頻率增加開關損失
  • 較低頻率可能產生可聞雜音
  • EMI 特性隨頻率變化
  • 功耗隨開關頻率增加
頻率變更會影響所有 PWM 通道的輸出
警告
運行中變更頻率可能產生波形異常
參閱
setPercent() 占空比設定方法
start() PWM 啟動控制

實作 hal::counter::PulseWidth.

◆ start()

virtual bool mcxa153::core::CorePulseWidth::start ( bool enable)
overridevirtual

啟動或停止 PWM 輸出

控制 PWM 信號的整體輸出狀態,影響所有已配置的通道。 提供統一的啟動/停止控制,確保多通道同步操作。

參數
enablePWM 輸出控制
  • true: 啟動 PWM 輸出 (開始產生波形)
  • false: 停止 PWM 輸出 (停止波形產生)
傳回值
true 控制操作成功
false 控制操作失敗,可能原因:
  • 硬體未初始化
  • 定時器配置異常
  • 硬體故障

啟動操作 (enable = true):

  1. 檢查硬體初始化狀態
  2. 驗證 PWM 參數設定 (頻率、占空比)
  3. 清除定時器計數器 (TC = 0)
  4. 啟動定時器運行 (TCR.CEN = 1)
  5. 開始產生 PWM 波形
  6. 所有配置的通道同時開始輸出

停止操作 (enable = false):

  1. 停用定時器運行 (TCR.CEN = 0)
  2. 保持目前的匹配暫存器設定
  3. 所有 PWM 輸出立即停止
  4. 輸出引腳保持最後狀態
  5. 定時器計數器停止更新

同步特性:

  • 所有通道同時啟動/停止
  • 確保相位關係正確
  • 避免通道間的時序差異
  • 適合多相系統應用

輸出狀態:

  • 啟動:根據占空比設定產生波形
  • 停止:輸出保持在停止瞬間的電平
  • 不會產生額外的邊緣變化
  • 確保信號完整性

應用場景:

// 馬達控制啟動序列
pwm.setPeriod(10000.0f); // 10kHz
pwm.setPercent(0, 0.0f); // 初始速度為 0
pwm.start(true); // 啟動 PWM
// 逐漸加速
for (float speed = 0; speed <= 100; speed += 1) {
pwm.setPercent(0, speed);
delay_ms(10);
}
// 緊急停止
pwm.start(false); // 立即停止所有輸出

RGB LED 控制:

// 設定顏色並啟動
pwm.setPercent(0, red_intensity); // 紅色
pwm.setPercent(1, green_intensity); // 綠色
pwm.setPercent(2, blue_intensity); // 藍色
pwm.start(true); // 顯示顏色
// 關閉顯示
pwm.start(false); // 所有 LED 關閉

安全考量:

  • 馬達應用:停止前考慮減速過程
  • 電源控制:避免突然中斷可能損壞負載
  • 音頻應用:停止時可能產生爆音
  • LED 控制:停止會立即關閉輸出

效能影響:

  • 啟動會開始定時器計數和中斷
  • 停止會停止所有定時器活動
  • 功耗隨運行狀態變化
  • CPU 負載主要來自中斷處理

狀態管理:

  • 可多次調用啟動/停止
  • 重複操作不會造成錯誤
  • 內部狀態管理確保正確性
  • 支援快速的開關控制
停止不會清除 PWM 參數設定
警告
某些應用需要優雅的啟動/停止程序
參閱
init() 硬體初始化方法
setPeriod() 頻率設定方法
setPercent() 占空比設定方法

實作 hal::counter::PulseWidth.

資料成員說明文件

◆ vBase

void* const mcxa153::core::CorePulseWidth::vBase

CTIMER 硬體基礎位址指標

指向選定的 CTIMER 硬體模組基礎位址的常數指標。 用於直接存取 CTIMER 暫存器和控制硬體行為。

位址對應:

  • CTIMER0: 0x40004000
  • CTIMER1: 0x40008000
  • CTIMER2: 0x4000C000

暫存器存取:

  • TC (Timer Counter): 目前計數值
  • PR (Prescale Register): 預分頻設定
  • MR0-MR3 (Match Register): 匹配比較值
  • CCR (Capture Control): 捕捉控制
  • EMR (External Match Register): 外部匹配控制
  • MCR (Match Control Register): 匹配控制
  • TCR (Timer Control Register): 定時器控制

存取特性:

  • 32位元對齊存取
  • 硬體暫存器映射
  • 即時生效的配置變更
  • 需要適當的時鐘啟用

安全考量:

  • 為 const 指標,防止意外修改
  • 確保指向有效的硬體位址
  • 存取前需確認硬體已初始化
物件建構時設定,生命週期內保持不變
警告
直接存取暫存器需要深入了解硬體規格
參閱
Select 定時器選擇影響此指標值

◆ vPeriodChannel

const Channel mcxa153::core::CorePulseWidth::vPeriodChannel

PWM 週期控制通道

指定哪一個匹配通道用於控制 PWM 信號的基礎週期 (頻率)。 週期通道的匹配值決定了所有 PWM 輸出通道的共同頻率。

功能說明:

  • 設定 PWM 信號的基礎週期時間
  • 控制計數器的重設點
  • 決定所有通道的共同頻率
  • 影響占空比的解析度

週期計算:

  • PWM_Period = (MR_Period + 1) / Timer_Clock
  • PWM_Frequency = Timer_Clock / (MR_Period + 1)
  • Timer_Clock = System_Clock / (Prescale + 1)

解析度影響:

  • 更大的週期值 = 更高的占空比解析度
  • 更小的週期值 = 更高的 PWM 頻率
  • 需要在頻率和解析度間取得平衡

通道限制:

  • 週期通道不可用於 PWM 輸出
  • 其匹配事件觸發計數器重設
  • 所有其他通道的輸出都基於此週期

典型配置:

  • MAT3 作為週期通道 (推薦)
  • MAT0, MAT1, MAT2 用於 PWM 輸出
  • 提供最多 3 個獨立的 PWM 輸出

使用範例:

// 使用 MAT3 作為週期通道的 PWM 設定
CorePulseWidth pwm(Select::CTIMER0, Channel::MAT3);
// MAT0, MAT1, MAT2 可用於 PWM 輸出
物件建構時設定,生命週期內不可變更
警告
變更週期通道設定會影響所有 PWM 輸出
參閱
Channel 通道定義
setPeriod() 頻率設定方法

此類別(class) 文件是由下列檔案中產生: