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