4-13 ETM輸出PWM HT66F70A
ETM提供5種模式 比對吻合輸出 計時/計數 PWM 輸入補捉 單脈衝輸出
ETM 內部結構
ETM 內部結構 10Bit上/下數計數器TMnD 兩組10Bit捕捉暫存器(CCR暫存器)(TM1A、TM1B) 週期控制暫存器(T1RP) TM1C[2:0]控制暫存器 三組比較器: Comparator A(10Bit) Comparator B(10Bit) ComparatorC(3Bit) 操作模式 輸出特性
TM1C0 控制暫存器 T1PAU T1CK2 T1CK1 T1CK0 T1ON T1RP2 T1RP1 T1RP0 Bit 7 6 5 4 3 2 1 0 Bit [7] : T1PAU TM1計時/計數暫停控制位元 0 : 繼續計數(TM1D由原暫停時的數值繼續往上數) 1 : 暫停計數 Bit [6:4] : T1CK[2:0] : TM1計數時脈選擇位元 = 000 : fINT = fsys/4 =100 : fINT = fSUB = 001 : fINT = fsys =101 : 保留 = 010 : fINT = fH/16 =110 : fINT = TCK時脈正緣 = 011 : fINT = fH/64 =111 : fINT = TCK時脈負緣 Bit [3] : T1ON : TM1計時/計數控制位元 1 : 開始計數(TM1D由000h開始往上計數) 0 : 停止計數 Bit [2:0] : TnRP [2:0] = 000 : 週期= 1024 x fINT -1 =100 : 週期= 512 x fINT -1 = 001 : 週期= 128 x fINT -1 =101 : 週期= 640 x fINT -1 = 010 : 週期= 256 x fINT -1 =110 : 週期= 768 x fINT -1 = 011 : 週期= 384 x fINT -1 =111 : 週期= 896 x fINT -1
TM1C1 控制暫存器 Bit [7 6] : T1AM[1:0] TM1A模式控制位元 Bit 7 6 5 4 3 2 1 0 T1AM1 T1AM0 T1AIO1 T1AIO0 T1AOC T1APOL T1CDN T1CCLR Bit 7 6 5 4 3 2 1 0 Bit [7 6] : T1AM[1:0] TM1A模式控制位元 = 00 : TM1A 為「比對吻合輸出」模式 = 01 : TM1A 為「輸入捕捉」模式 = 10 : TM1A 為「脈波寬度調變」或「但脈衝輸出」模式 = 11 : TM1A 為「計時/計數器」模式
TM1C1 控制暫存器 Bit [5 4] : T1AIO[1:0] : TP1A輸出功能選擇位元 Bit 7 6 5 4 3 2 1 0 T1AM1 T1AM0 T1AIO1 T1AIO0 T1AOC T1APOL T1CDN T1CCLR Bit 7 6 5 4 3 2 1 0 Bit [5 4] : T1AIO[1:0] : TP1A輸出功能選擇位元 若TM1A為「比對吻合輸出」模式時,(T1AM[1:0]=00) : 00 : 比對吻合時 TP1A 不變 10 : 比對吻合時 TP1A 輸出「1」 01 : 比對吻合時 TP1A 輸出「0」11 : 比對吻合時 TP1A 轉態 若TM1A為「輸入捕捉」模式時,(T1AM[1:0]=01) : 00 : 在 TP1A 信號為正緣,記錄當前TM1D之值 01 : 在 TP1A 信號為負緣,記錄當前TM1D之值 10 : 在 TP1A 信號為負緣及正緣,均記錄當前TM1D之值 11 : 停止輸入捕捉功能 若TM1A為「脈波寬度調變」或「單脈衝輸出」模式時,(T1AM[1:0]=10) : 00 : 強制 TP1A 為非啟動狀態 10 : PWM輸出 00 : 強制 TP1A 為啟動狀態 11 : 單脈衝輸出 若TM1A為「計時/計數器」模式時(T1AM[1:0]=11),這兩個位元無作用
TM1C1 控制暫存器 Bit [3] : T1AOC : TP1A輸出控制位元 Bit [2] : T1APOL : TP1A極性控制位元 T1AM1 T1AM0 T1AIO1 T1AIO0 T1AOC T1APOL T1CDN T1CCLR Bit 7 6 5 4 3 2 1 0 Bit [3] : T1AOC : TP1A輸出控制位元 若TM1A為「比對吻合輸出」模式時,(T1AM[1:0]=00) : 1 : 首次比對吻合前使TP1A維持在「1」 0 : 首次比對吻合前使TP1A維持在「0」 若TM1A為「脈波寬度調變」或「單脈衝輸出」模式時,(T1AM[1:0]=10) : 1 : TP1A啟動準位為「1」 0 : TP1A啟動準位為「0」 Bit [2] : T1APOL : TP1A極性控制位元 1 : 將 TP1A 反向後輸出 0 : TP1A 直接輸出 Bit [1] : T1CDN : 計數器上/下數狀態旗標 1 : 下數 0 : 上數 Bit [0] : T1CCLR : 計數器清除控制位元 1 : 當TM1A1比對吻合時即清除計數器 0 : 當TM1RP比對吻合或記數器溢位(CCRP為零)時清除計數器
TM1C2控制暫存器 Bit [7 6] : T1BM[1:0] TM1 CCRB模式控制位元 Bit 7 6 5 4 3 2 1 0 T1BM1 T1BM0 T1BIO1 T1BIO0 T1BOC T1BPOL T1PWM1 T1PWM0 Bit 7 6 5 4 3 2 1 0 Bit [7 6] : T1BM[1:0] TM1 CCRB模式控制位元 = 00 : TM1B 為「比對吻合輸出」模式 = 01 : TM1B 為「輸入捕捉」模式 = 10 : TM1B 為「脈波寬度調變」或「但脈衝輸出」模式 = 11 : TM1B 為「計時/計數器」模式
TM1C2 控制暫存器 Bit [5 4] : T1BIO[1:0] : TP1B、TP1BB輸出功能選擇位元 T1BM1 T1BM0 T1BIO1 T1BIO0 T1BOC T1BPOL T1PWM1 T1PWM0 Bit 7 6 5 4 3 2 1 0 Bit [5 4] : T1BIO[1:0] : TP1B、TP1BB輸出功能選擇位元 若TM1B為「比對吻合輸出」模式時,(T1AM[1:0]=00) : 00 : 比對吻合時,輸出維持不變 10 : 比對吻合時,輸出「1」 01 : 比對吻合時,輸出「0」 11 : 比對吻合時,轉態 若TM1B「輸入捕捉」模式時,(T1AM[1:0]=01) : 00 : 在 TP1IB 信號為正緣,記錄當前TM1D之值 01 : 在 TP1IB 信號為負緣,記錄當前TM1D之值 10 : 在 TP1IB 信號為負緣及正緣,均記錄當前TM1D之值 11 : 停止輸入捕捉功能 若TM1B「脈波寬度調變」或「單脈衝輸出」模式時,(T1AM[1:0]=10) : 00 : 強制 TP1B 為非啟動狀態 10 : PWM輸出 00 : 強制 TP1B 為啟動狀態 11 : 單脈衝輸出 若TM1B為「計時/計數器」模式時(T1BM[1:0]=11),這兩個位元無作用
TM1C1 控制暫存器 Bit [3] : T1AOC : TP1B、TP1BB輸出控制位元 T1BM1 T1BM0 T1BIO1 T1BIO0 T1BOC T1BPOL T1PWM1 T1PWM0 Bit 7 6 5 4 3 2 1 0 Bit [3] : T1AOC : TP1B、TP1BB輸出控制位元 若TM1B為「比對吻合輸出」模式時,(T1AM[1:0]=00) : 1 : 首次比對吻合前使TP1A維持在「1」 0 : 首次比對吻合前使TP1A維持在「0」 若TM1B為「脈波寬度調變」或「單脈衝輸出」模式時,(T1AM[1:0]=10) : 1 : TP1B啟動準位為「1」 0 : TP1B啟動準位為「0」 Bit [2] : T1BPOL : TP1B、TP1BB極性控制位元 1 : 反向後輸出 0 : 直接輸出 Bit [1:0] : T1PWM[1:0] : PWM模式選擇位元 00 : 邊緣對齊模式 01 : 中心對齊模式0,上數時產生比對吻合 10 : 中心對齊模式1,下數時產生比對吻合 11 : 中心對齊模式2,上/下數時產生比對吻合 (中心對齊模式中之比對吻合包含TM1A與TM1RP暫存器)
4-13 ETM-PWM #include <HT66F70A.h> #define R_PinC _pdc5 //PDC.5 #define R_Pin _pd5 //PD.5 #define G_PinC _pdc6 //PDC.6 #define G_Pin _pd6 //PD.6 #define B_PinC _pdc7 //PDC.7 #define B_Pin _pd7 //PD.7 typedef unsigned char u8; typedef unsigned short u16; void Delay100us(u16); //函式原型宣告 #define Period 200 //PWM周期常數 u8 PCnt,R,G,B,RCnt,GCnt,BCnt;
主程式 void main() { _wdtc=0b10101111; //關閉看門狗計時器 R_Pin=0 ;G_Pin=0 ;B_Pin=0 ; //設定R、G、B腳位為低電位 R_PinC=0;G_PinC=0;B_PinC=0; //規劃R、G、B腳位為輸出模式 _mf1e=1; _t1ae=1; //致能MF1、T1A中斷 _tm1c0=0x00; //fINT=fSYS/4 _tm1c1=0b10101001; //PWM,TM1A吻合清除 _tm1c2=0b10101001; _tm1al=200%256;_tm1ah=200/256; //設定TM1A=200 _t1af=0; _mf1f=0; _emi=1; //清除中斷旗標並致能中斷 PCnt=Period; _t1on=1; //設定PWM周期並開始計數 while(1) { G=0;B=0; for(R=0; R<120; R+=10) Delay100us(100); //R每隔0.1秒數值遞增10 R=0;B=0; for(G=120; G>0; G-=10) Delay100us(100); //G每隔0.1秒數值遞增10 R=0;G=0; for(B=0; B<120; B+=10) Delay100us(100); //R每隔0.1秒數值遞增10 G=0; for(R=0; R<120; R+=10,B-=10) Delay100us(100); R=40;B=120; for(G=0; G<120; G+=10,B-=10) Delay100us(100);} }
副程式 DEFINE_ISR(ISR_ETM,0x18) { if(PCnt--==0) //判斷PWM周期是否已結束 { PCnt=Period; RCnt=R; GCnt=G; BCnt=B; //是,還原所有值 R_Pin=(R==0)? 0 : 1; //依Duty設定腳位初始狀態 G_Pin=(G==0)? 0 : 1; B_Pin=(B==0)? 0 : 1; } else { if(RCnt!=0) RCnt-- ; else R_Pin=0; //判斷Duty若是結束設定接腳為0 if(GCnt!=0) GCnt-- ; else G_Pin=0; if(BCnt!=0) BCnt-- ; else B_Pin=0; _t1af=0; //清除T2AF旗標 void Delay100us(u16 del) //延遲del*200指令週期 { u16 i,j; //@fSYS=8MH,延遲del*100us for(i=0;i<del;i++) for(j=0;j<=25;j++) GCC_NOP();