使用計時器 5 作為 PWM 輸出,計時器 4 作為比較擷取輸入,獲得 PWM 的輸出週期。
參考代碼:
#include "SPCE3200_Constant.h"
#include "SPCE3200_Register.h"
//---主函數 ---//
int main(void) {
*P_INT_MASK_CTRL1 = ~C_INT_TIMER_DIS; // 打開 TIMER 中斷 *P_CLK_32K_CONF = C_32K_CRY_EN; // 打開 32K 晶振 *P_TIMER_CLK_SEL = C_TIMER4_CLK_32K
| C_TIMER5_CLK_32K; // 選擇 TIMER4、TIMER5 時鐘源 *P_TIMER_INTERFACE_SEL = C_TIMER4_PORT_SEL
| C_TIMER5_PORT_SEL;
*P_TIMER5_CLK_CONF = 0; // 重設 TIMER5 模組 *P_TIMER5_CLK_CONF = C_TIMER_CLK_EN
| C_TIMER_RST_DIS; // 使能 TIMER5 模組 *P_TIMER5_PRELOAD_DATA = 0xF200; // 設置計數初值
*P_TIMER5_CCP_DATA = 0xF700; // 設置 CCP 初值
*P_TIMER5_CCP_CTRL = C_TIMER_PWM_MODE; // 選擇 TIMER5 工作在 PWM 模式 *P_TIMER5_MODE_CTRL = C_TIMER_CTRL_EN // 使能 TIMER5
| C_TIMER_INT_EN | C_TIMER_INT_FLAG;
*P_TIMER4_CLK_CONF = 0; // 重設 TIMER4 模組 *P_TIMER4_CLK_CONF = C_TIMER_CLK_EN
| C_TIMER_RST_DIS; // 使能 TIMER4 模組
*P_TIMER4_CCP_CTRL = C_TIMER_CAP_MODE // 選擇 TIMER4 工作在擷取模式
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 181 V1.1 - Agu 29, 2007
| C_TIMER_CAP_FALL;
*P_TIMER4_MODE_CTRL = C_TIMER_CTRL_EN // 使能 TIMER4 | C_TIMER_INT_EN | C_TIMER_INT_FLAG;
while(1);
return 0;
}
//---中斷服務函數 ---//
IRQ56(void) {
unsigned int t;
unsigned int h;
if(*P_TIMER5_MODE_CTRL & C_TIMER_INT_FLAG) {
*P_TIMER5_MODE_CTRL |= C_TIMER_INT_FLAG;
}
if(*P_TIMER4_MODE_CTRL & C_TIMER_INT_FLAG) {
*P_TIMER4_MODE_CTRL |= C_TIMER_INT_FLAG;
t = *P_TIMER4_COUNT_DATA;
h = *P_TIMER4_CCP_DATA; // 獲得 PWM 週期 }
}
4. PWM 輸出模式
Timer0~5 作 PWM 輸出的結構如圖 4-13所示:其核心是一個 16 位計數器與 PWM 控制邏輯。
透過 P_TIMER0_PRELOAD_DATA 與 P_TIMER0_CCP_DATA 暫存器決定 TIMER0 模組的 PWM 信號的週期和脈寬,PWM 信號透過 CCP IO 輸出。具體對應晶片上管腳參考表 4-4。
32768Hz 時 鐘 源
16位計數器 計數初值
PWM控制邏輯 CCP寄存器單元 27MHz/(M+1)
CCP IO
控制邏輯
圖 4-13 Timer0~5 PWM 輸出結構圖
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 182 V1.1 - Agu 29, 2007
Timer0~5 PWM 輸出的時序如圖 4-14所示:
計數時鐘
功能選擇 000 CCP_MODE = 0xC0000000
計數值 2B5C2B5D 55E355E4 FFFEFFFF80008001 80028003 BFFF C000 C001 C002 C003
PRELOAD(R) 8000
CCP_REG(R) C000
2B5C
55E3
Timer _CCP0
PRELOAD(W) 8000
CCP_REG(W) C000
2B5C
55E3
圖 4-14 Timer0~5 PWM 輸入時序圖
向 P_TIMER0_CCP_CTRL 暫存器的 b31:b30 寫入 11,選擇計時器工作在 PWM 輸出模式 下,使能計時器,計數器載入 P_TIMER0_PRELOAD_DATA 與 P_TIMER0_CCP_DATA 的 值,並開始計數。當計數值 P_TIMER0_COUNT_DATA 與 P_TIMER0_CCP_DATA 的值匹 配時置位 PWM 輸出埠,當計數器溢出時(達到 65536)清除 PWM 輸出埠,周而復始。當 計數器溢出時,可以重新載入計數初值與 CCP 初值。若計時器的計數時鐘頻率為 f,
P_TIMER0_PRELOAD_DATA 和 P_TIMER0_CCP_DATA 預置的值分別為 PRELOAD 和 CCP_REG,則輸出 PWM 信號的週期和占空比由圖 4-15公式計算:
Non-Return-One(NRO)
Non-Return-Zero(NRZ)
T =f * (65536 – PRELOAD) T0 =f * (CCP_REG – PRELOAD)
圖 4-15 PWM 輸出信號計算方法
透過設置暫存器 P_TIMER0_CCP_CTRL 的 b25 位選擇 NRO 模式或 NRZ 模式,當 b25 為 0 時選擇 NRO 模式;當 b25 為 1 時選擇 NRZ 模式。
應用 Timer0~5 的 PWM 輸出功能,需要以下操作:配置計時器模組、選擇計時器時鐘源、設
置計時器計數初值及 CCP 初值、使能 I/O 作為 CCP 埠使用、選擇計時器工作方式為 PWM
輸出方式、使能計時器及中斷。其操作流程如下:
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 183 V1.1 - Agu 29, 2007
使能/配置計時器模組
(P_TIMER0_CLK_CONF)
使能32768Hz即時時鐘(P_CLK_32K_CONF)
選擇計時器時鐘源(P_TIMER_CLK_SEL)
設置計時器計數初值/CCP初值
(P_TIMER0_PRELOAD_DATA /P_TIMER0_CCP_DATA)
選擇計時器工作方式
(P_TIMER0_CCP_CTRL)
使能計時器、計時器中斷(清)
(P_TIMER0__CTRL)
使能I/O埠為CCP埠
(P_TIMER_INTERFACE_SEL)
圖 4-16 Timer0~5 PWM 輸出初始化流程圖