?? ?一、輸出模式總覽?
STM32定時器的輸出比較模式通過比較計數器(CNT)與捕獲/比較寄存器(CCRx)的值,控制輸出引腳(OCx)的電平狀態。六種模式定義如下:
?模式宏? | ?觸發動作?(CNT = CCRx時) | ?輸出波形特點? | ?典型應用? |
---|---|---|---|
TIM_OCMode_Timing | 無動作(引腳凍結) | 保持原電平 | 純定時中斷 |
TIM_OCMode_Active | 強制輸出高電平?(有效電平) | 單次高脈沖 | 單脈沖生成 |
TIM_OCMode_Inactive | 強制輸出低電平?(無效電平) | 單次低脈沖 | 單脈沖生成 |
TIM_OCMode_Toggle | ?電平翻轉? | 周期為?2×ARR ?的方波(占空比50%) | 方波時鐘源 |
TIM_OCMode_PWM1 | 自動生成PWM(見下文詳述) | 占空比可調(0%-100%) | 電機/LED控制 |
TIM_OCMode_PWM2 | 自動生成PWM(極性相反) | 占空比可調(0%-100%) | 電機/LED控制 |
🔧 ?二、各模式詳解?
1. ?凍結模式? (TIM_OCMode_Timing
)
- ?工作原理?:CNT與CCRx匹配時不改變引腳狀態,僅觸發中斷或DMA請求。
- ?應用場景?:精確計時任務(如周期性傳感器采樣),無需物理輸出。
2. ?單次動作模式? (TIM_OCMode_Active
/Inactive
)
- ?工作流程?:
Active
:匹配時引腳置高,?保持至下次重載或手動修改?。Inactive
:匹配時引腳置低,行為同上。
- ?特點?:?僅觸發一次電平變化,需手動重置計數器才能再次觸發。
- ?應用場景?:生成單脈沖信號(如步進電機單步驅動)。
3. ?翻轉模式? (TIM_OCMode_Toggle
)
- ?工作流程?:每次CNT=CCRx時,?引腳電平翻轉一次?。
- ?輸出波形?:
- 周期 =?
2 × (ARR + 1) / CK_CNT
- ?固定50%占空比?(例如CCRx設為ARR的一半)。
- 周期 =?
- ?應用場景?:生成方波時鐘(如驅動無源蜂鳴器)。
4. ?PWM模式? (PWM1
/PWM2
)
?核心區別?:
?模式? ?向上計數行為? ?向下計數行為? PWM1
CNT < CCRx → 高電平;
CNT ≥ CCRx → 低電平
CNT > CCRx → 低電平;
CNT ≤ CCRx → 高電平
PWM2
CNT < CCRx → 低電平;
CNT ≥ CCRx → 高電平
CNT > CCRx → 高電平;
CNT ≤ CCRx → 低電平
?注?:有效電平由
TIM_OCPolarity
進一步配置。?參數計算?:
- ?頻率? =?
CK_PSC / (PSC + 1) / (ARR + 1)
- ?占空比? =?
CCRx / (ARR + 1)
(PWM1模式)。
- ?頻率? =?
?高級功能?:
- ?互補輸出?(高級定時器TIM1/TIM8):可生成帶死區的互補PWM,用于H橋驅動。
- ?預裝載寄存器?:通過
TIM_OCxPreloadConfig()
使能,避免占空比更新時的毛刺。
? ?三、PWM模式的配置示例(STM32F103)??
以TIM1通道1生成PWM1波形為例:
// 1. 初始化GPIO(PA8為TIM1_CH1)
GPIO_InitTypeDef GPIO_InitStruct = {.GPIO_Pin = GPIO_Pin_8,.GPIO_Mode = GPIO_Mode_AF_PP, // 復用推挽輸出.GPIO_Speed = GPIO_Speed_50MHz
};
GPIO_Init(GPIOA, &GPIO_InitStruct);// 2. 配置時基單元(72MHz時鐘,1kHz PWM)
TIM_TimeBaseInitTypeDef TIM_TimeBase = {.TIM_Period = 720 - 1, // ARR = 719 → 周期720.TIM_Prescaler = 0, // PSC = 0 → 無分頻.TIM_CounterMode = TIM_CounterMode_Up
};
TIM_TimeBaseInit(TIM1, &TIM_TimeBase);// 3. 配置PWM模式(占空比50%)
TIM_OCInitTypeDef TIM_OCInit = {.TIM_OCMode = TIM_OCMode_PWM1, // PWM模式1.TIM_OutputState = TIM_OutputState_Enable,.TIM_Pulse = 360, // CCRx = 360 (50%占空比).TIM_OCPolarity = TIM_OCPolarity_High // 高電平有效
};
TIM_OC1Init(TIM1, &TIM_OCInit);// 4. 使能高級定時器主輸出
TIM_CtrlPWMOutputs(TIM1, ENABLE); // 必需!否則無輸出[5](@ref)
TIM_Cmd(TIM1, ENABLE); // 啟動定時器
?? ?四、模式選擇與常見問題?
?模式選擇建議?:
- 電機控制/調光 → ?PWM1/PWM2?
- 精確時間中斷 → ?Timing?
- 簡單方波 → ?Toggle?
- 單脈沖指令 → ?Active/Inactive? 。
?關鍵注意事項?:
- ?PWM無輸出?:檢查高級定時器的
MOE
位(TIM_CtrlPWMOutputs()
)。 - ?占空比異常?:確保CCRx ≤ ARR,否則PWM不生效。
- ?電平極性混淆?:
PWM1
+High
與PWM2
+Low
等效,需結合外設需求選擇。
- ?PWM無輸出?:檢查高級定時器的
💎 ?總結?
STM32定時器的輸出模式覆蓋了從基礎定時到復雜PWM生成的各類場景:
- ?凍結/單次模式適用于事件驅動型任務;
- ?翻轉模式提供簡單方波;
- ?PWM模式?(占主導地位)通過硬件自動生成可調占空比信號,結合互補輸出和死區插入,可滿足電機驅動、電源轉換等工業級需求。
配置時需嚴格匹配時基參數(ARR/PSC)與極性設置,并善用預裝載功能確保波形穩定性。