📄 pca.c
字号:
/*===============================================================*/
/*函数名称: PCA_Capture.c */
/*函数功能: 主函数,调用各模块 */
/*基本思想: 正负边沿均捕捉脉冲 */
/*修改记录: 无修改记录 */
/*编写作者: t483-4-19chenyong */
/*编写日期: 2007-4-14 */
/*===============================================================*/
#include"common.h"
#include"PCA.h"
#include<math.h>
#define M 0.32653061
float value;
float xdata PCA0_Value[10];
long pca_temp;
float period;
float frequncy;
uchar number=0;
bit pca_flag;
/*===============================================================*/
/* CAPPn----------------------------------------------上升沿捕捉*/
/* CAPNn----------------------------------------------下降沿捕捉*/
/* ECCFn--------------------------------------------允许捕捉中断*/
/*===============================================================*/
void PCA0_Initial()
{ //PCA CEX0配置为正负边沿均捕捉
PCA0CPM0 = 0x31; //正负边沿触发模式,CEX0捕捉中断使能
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x00;
}
void PCA_Initial()
{
PCA0MD=0x08; //PCA采用系统时钟,且PCA溢出中断禁止
PCA0CN=0x40; //启动PCA计数器
EIE1|=0x08; //PCA中断使能
}
float PCA_Capture()
{
if(pca_flag) //捕捉十次
{
pca_flag=0;
if(number>=10)
{
pca_temp = PCA0_Value[1]+PCA0_Value[3]+PCA0_Value[5]+PCA0_Value[7]+PCA0_Value[9];
period = (float)pca_temp/5;
period = (float)M*period*2;
frequncy = (float)1000/period;
frequncy = (float)1000*frequncy;
number=0;
}
}
return(period);
}
/*捕捉思想:在中断程序中放个静态变量,电平的跳变间隔就是当前的捕捉值与上次捕捉
值之差。
*/
void PCA_ISR(void) interrupt 9 using 1
{
static xdata uint temp_count=0,cnum=0;
if(CF)
{
cnum++;
CF=0;
}
if(CCF0)
{
if(PCA0CP0<temp_count)
cnum--;
if(number>=10)
number=0;
PCA0_Value[number] = PCA0CP0-temp_count;
PCA0_Value[number]+=65536L*cnum;
cnum=0;
temp_count=PCA0CP0;
number++;
CCF0=0;
}
pca_flag=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -