|
定時器頻率
#define T100Hz (FOSC / 12 / 100)
方波脈沖頻率
#define T100KHz (FOSC / 4 / 100000)
struct PCA_
{//PCA_結(jié)構(gòu)數(shù)據(jù)類型
unsigned int Cycle; //頻率
unsigned int Match; //重裝值容器
unsigned int Dou; //擴(kuò)展精度自加容器
unsigned int Doub; //擴(kuò)展精度終點(diǎn)容器
unsigned char PWM_Value; //脈寬值
}PCA_0,PCA_1; //結(jié)構(gòu)變量名
void PCA_isr() interrupt 7 using 1
{
if(CCF0)
{
CCF0 = 0; //清中斷
CCAP0L = PCA_0.Match;
CCAP0H = PCA_0.Match >> 8; //裝入比較值到比較捕獲寄存器
PCA_0.Match += T100Hz; //計算下次需要裝入的值
if (PCA_0.Dou-- == 0)
{//如果Dou自減1后為0
PCA_0.Dou = PCA_0.Doub; //擴(kuò)展定時時間
TI=1;
Uart1_SendData('0');
}
}
if(CCF1)
{
CCF1 = 0; //清中斷
CCAP1L = PCA_1.Match1;
CCAP1H = PCA_1.Match1 >> 8; //裝入比較值到比較捕獲寄存器
PCA_1.Match1 += T100Hz; //計算下次需要裝入的值
if (PCA_1.Dou-- == 0)
{//如果Dou自減1后為0
PCA_1.Dou = PCA_1.Doub; //擴(kuò)展定時時間
TI=1;
Uart1_SendData('1');
}
}
}
void PCA_Timers_Setup()
{
//清空PCA控制器、計數(shù)器
CCON = 0; //清計數(shù)溢出CF,PCA時鐘停止,清模塊0、1中斷標(biāo)記
CL = 0; //清PCA16位計數(shù)器
CH = 0;
//計數(shù)時鐘選擇
CMOD&=0xF1; //設(shè)置PCA 16位計數(shù)器工作在12T模式
//CMOD|=0x02; //設(shè)置PCA 16位計數(shù)器工作在2T模式
//CMOD|=0x04; //設(shè)置PCA 16位計數(shù)器使用定時器1溢出計數(shù)
//CMOD|=0x06; //設(shè)置PCA 16位計數(shù)器計數(shù)使用P1.2\P4.1輸入脈沖,最高速度2T
//CMOD|=0x08; //設(shè)置PCA 16位計數(shù)器計數(shù)使用系統(tǒng)時鐘全速
//CMOD|=0x0A; //設(shè)置PCA 16位計數(shù)器工作在4T模式
//CMOD|=0x0C; //設(shè)置PCA 16位計數(shù)器工作在6T模式
//CMOD|=0x0E; //設(shè)置PCA 16位計數(shù)器工作在8T模式
//計數(shù)溢出控制
CMOD&=0xFE; //禁止PCA計數(shù)器溢出產(chǎn)生中斷標(biāo)志CF
//CMOD|=0x01; //允許PCA計數(shù)器溢出產(chǎn)生中斷標(biāo)志CF
//模塊0定時器與高速方波模式設(shè)定裝入值
PCA_0.Match = T100Hz; //裝入100Hz重裝值
CCAP0L = PCA_0.Match;
CCAP0H = PCA_0.Match >> 8; //裝入比較值到比較捕獲寄存器
PCA_0.Match += T100Hz; //重裝值累加
//模塊1定時器與高速方波模式設(shè)定裝入值
PCA_1.Match = T100Hz; //裝入100Hz重裝值
CCAP1L = PCA_1.Match;
CCAP1H = PCA_1.Match >> 8; //裝入比較值到比較捕獲寄存器
PCA_1.Match += T100Hz; //重裝值累加
//模塊0PWM模式設(shè)定裝入值
CCAP0H = CCAP0L = PCA_0.PWM_Value; //輸出50%PWM波
CCAP0H = CCAP0L = 0x00;
PCAPWM0 = 0x00; //固定輸出高
CCAP0H = CCAP0L = 0xFF;
PCAPWM0 = 0x03; //固定輸出低
//模塊1PWM模式設(shè)定裝入值
CCAP1H = CCAP1L = PCA_1.PWM_Value; //輸出50%PWM波
CCAP1H = CCAP1L = 0x00;
PCAPWM1 = 0x00; //固定輸出高
CCAP1H = CCAP1L = 0xFF;
PCAPWM1 = 0x03; //固定輸出低
//模塊0捕獲模式設(shè)定
CCAPM0 = 0x11; //負(fù)捕獲,開匹配中斷CCFO
//CCAPM0 = 0x21; //正捕獲,開匹配中斷CCFO
//CCAPM0 = 0x31; //雙向捕獲,開匹配中斷CCFO
//模塊1捕獲模式設(shè)定
CCAPM1 = 0x11; //負(fù)捕獲,開匹配中斷CCFO
//CCAPM1 = 0x21; //正捕獲,開匹配中斷CCFO
//CCAPM1 = 0x31; //雙向捕獲,開匹配中斷CCFO
//模塊0定時器模式設(shè)定
CCAPM0 = 0x49; //開比較器,允許計數(shù)器值與比較器相同時產(chǎn)生中斷CCF0
//模塊1定時器模式設(shè)定
CCAPM1 = 0x49; //開比較器,允許計數(shù)器值與比較器相同時產(chǎn)生中斷CCF0
//模塊0高速方波模式
CCAPM0 = 0x4D; //與定時器模式相同情況下,TOG置1,在發(fā)生匹配時,P1.3\P4.2電位直接翻轉(zhuǎn)
//模塊1高速方波模式
CCAPM1 = 0x4D; //與定時器模式相同情況下,TOG置1,在發(fā)生匹配時,P1.4\P4.3電位直接翻轉(zhuǎn)
//模塊0PWM模式
CCAPM0 = 0x42; //允許比較器比較,選擇PWM開關(guān),硬件產(chǎn)生PWM波,關(guān)閉比較中斷CCFO
//模塊1PWM模式
CCAPM1 = 0x42; //允許比較器比較,選擇PWM開關(guān),硬件產(chǎn)生PWM波,關(guān)閉比較中斷CCF1
//公用
CR = 1; //計數(shù)器開始計數(shù)
EA = 1; //開總中斷
PCA_0.Dou = 0;
PCA_1.Dou = 0; //中斷內(nèi)擴(kuò)展定時時間
}
|
|