STC12C5608AD測脈沖寬度
/******************************************/
//PCA初始化函數(shù)
void PCA_Init (void)
{ //CIDL --- CPS2 CPS1CPS0 ECF
CMOD = 0x80;//空閑時關(guān)閉PCA,計數(shù)時鐘為Fosc/12,關(guān)閉計數(shù)器溢出中斷CF
//CF CR - - - - CCF1 CCF0
CCON = 0x00;//PCA控制寄存器初始化//PCA定時器停止//清除CF標(biāo)志//清除模塊中斷標(biāo)志//復(fù)位PCA寄存器
CCAPM0 = 0x21;//16位捕獲模式,上升沿觸發(fā),關(guān)閉捕獲中斷CCF0
//CCAPM0 = 0x10;//16位捕獲模式,下降沿觸發(fā),關(guān)閉捕獲中斷CCF0
CCAP0L = 0x00;//清零
CCAP0H = 0x00;
CL = 0x00; //清PCA計數(shù)器
CH = 0x00;
EPCAI = 1;//允許PCA模塊中斷,此句與STC12C5A60S不同
// EA = 1;
CR = 1; //啟動PCA計數(shù)器計數(shù)
}
/******************************************/
//PCA中斷服務(wù)函數(shù) ,測脈沖寬度,
//50Hz上升沿=20000mS/2=10000(12MHz)
//50Hz上升沿=20000mS/2/2=5000(6MHz)
/******************************************/
void PCA_Int(void) interrupt 6
{
if (CCF0==1) //PCA模塊0中斷
{
CCF0 = 0; // 清CCF中斷標(biāo)志
if(Last_Capture_Data == 0) // 說明是第一個上升沿
{
Last_Capture_Data = CCAP0H; //獲得捕捉數(shù)據(jù)的高8位
//高8位<<8+低8位構(gòu)成16位整數(shù)
Last_Capture_Data = (Last_Capture_Data << 8) + CCAP0L;
CCAPM0=0x11;//轉(zhuǎn)為下降沿中斷
}
else // 說明是第二個上升沿
{
CCF0 = 0; // 清CCF中斷標(biāo)志
New_Capture_Data = CCAP0H; //獲得捕捉數(shù)據(jù)的高8位
//高8位<<8+低8位構(gòu)成16位整數(shù)
New_Capture_Data = (New_Capture_Data << 8) + CCAP0L;
g_Period = New_Capture_Data - Last_Capture_Data; //計數(shù)值單位為us
length_sum+=g_Period; // 得到周期,6MHz6MHZ時脈沖個數(shù)1000
//累計平均
PCA_t++;
if(PCA_t==4)//累加4次
{
length=length_sum>>2;//算出脈沖寬度。50Hz時:晶振16M=13333,晶振6M=5000
length=length/10;
PCA_t=0;
length_sum=0;//累計清0
}
Last_Capture_Data=0; //為下一次捕捉設(shè)定初始條件
CCAPM0 = 0x21; //轉(zhuǎn)為上升沿中斷
CCAP0L = 0x00;//清零
CCAP0H = 0x00;
CL = 0x00; //清PCA計數(shù)器
CH = 0x00;
Capture_over = 1;//捕獲完成標(biāo)志位
}
}
}