⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program.c

📁 采用12位MAX 197对外部信号采样。采用全周波傅立叶积分算法
💻 C
📖 第 1 页 / 共 4 页
字号:
}

/* ************************************************************************
** 函 数 名:void XBFX()
** 功能描述:全周波傅立叶积分计算各次谐波的幅值,并返回结果.
*************************************************************************** */
void XBFX() 	
{
	long D,SHU;																		//数据.
	int n_x,k_x,i,n;															//循环参数.
	float Ur,Ui,Urn,Uin,UIL[2];										//数据处理中间变量.
	for(n=0;n<2;n++)															//两路信号.
	{
		for(n_x=0;n_x<5;n_x++)											//计算.
		{
			Urn=0.0;																	//实部.
			Uin=0.0;																	//虚部.
			for(k_x=0;k_x<32;k_x++)										//n_x次谐波.
			{
				D=DATA[CHAN*2+n][k_x];									//取数据计算.
				Urn=Urn+D/409.6*cos((2*n_x+1)*(k_x+1)*0.196);
				Uin=Uin+D/409.6*sin((2*n_x+1)*(k_x+1)*0.196);
			}
			Ur=Urn/16.0;                 							//      
			Ui=Uin/16.0;
			SHU=(long)(760*sqrt(Ur*Ur+Ui*Ui));				//
			UI[n][n_x]=SHU;														//
			UI[n][5]=SHU*SHU+UI[n][5];								//第n_x次谐波幅值.
			if(n_x==0)
				UIL[n]=atan(Ui/Ur);   									//相位.          
		}	
		UI[n][5]=(long)sqrt(UI[n][5]);							//总幅值.
		for(i=0;i<5;i++)														//
  	{
	  	SHU=UI[n][i]*1000;												//
	 		SHU=SHU/(UI[n][5]);												//
	 		UP[n][i]=SHU;															//第i次谐波占有率.
		}
		SHU=1000*(UI[n][5]-UI[n][0]);								//
		UP[n][5]=SHU/UI[n][5]; 											//畸变率.
	}
	L[CHAN]=abs((long)(1000*(UIL[0]-UIL[1])-40));	//功率因数角.
	S[CHAN]=(long)(UI[0][5]*UI[1][5]);						//S.
	P[CHAN]=(long)(S[CHAN]*cos(L[CHAN]/1000.0));	//P.
	Q[CHAN]=(long)(S[CHAN]*sin(L[CHAN]/1000.0));	//Q.
}
/* ***********************************************************************
** 函 数 名:void ABCSH()
** 功能描述:显示双通道数据处理结果.
************************************************************************** */
void ABCSH()
{
	LCDCLEAN(12,1,50,7);													//清除数据显示区.
	OUTNUM(UI[0][5],1,54,1);											//显示U*值.
	OUTNUM(UI[1][5],1,54,2);											//显示I*值.
	OUTNUM(P[CHAN],2,54,3);												//显示P*值.
	OUTNUM(Q[CHAN],2,54,4);												//显示Q*值.
	OUTNUM(S[CHAN],2,54,5);												//显示S*值.
	OUTNUM(L[CHAN],3,54,6);												//显示L*值.
	OUTNUM(F,2,54,7);															//显示F*值.
}
/* ***********************************************************************
** 函 数 名:void XBSH()
** 功能描述:谐波分析结果显示.
************************************************************************** */
void XBSH()
{
	int n,i;																			//参数.
	LCDCLEAN(12,2,126,7);													//清除数据显示区.
	for(n=0;n<2;n++)															//
	{
		for(i=0;i<6;i++)														//
		{
			OUTNUM(UI[n][i],1,28+n*64,2+i);						//显示第i次谐波.
			OUTNUM(UP[n][i],3,56+n*64,2+i);						//显示第i次谐波占有率.
		}
	}
}
/* ***********************************************************************
** 函 数 名:void ADALLSH()
** 功能描述:多通道数据处结果显示.
************************************************************************** */
void ADALLSH()
{
	OUTNUM(UI[0][5],1,40,(2+CHAN));							//显示U*值.
	OUTNUM(UI[1][5],1,40,(5+CHAN));							//显示I*值.
	OUTNUM(P[CHAN],2,114,(2+CHAN));							//显示P*值.
	OUTNUM(Q[CHAN],2,114,(5+CHAN));							//显示Q*值.
}
/* ***********************************************************************
** 函 数 名:void ADALL()
** 功能描述:多通道采样处理显示.
************************************************************************** */
void ADALL()
{
	LCDCLEAN(10,2,50,6);												//清除数据显示区.
	LCDCLEAN(76,2,50,6);												//清除数据显示区.
	for(CHAN=0;CHAN<3;CHAN++)										//
	{
		ADWORDS=ADCAN+CHAN*2;											//确定控制字.
		ADALLSH();																//显示.
		ADCHX();																		//采样.
		XBFX();																		//计算.
	}
	CHAN=0;																			//还原通道.
	ADWORDS=ADCAN;															//还原控制字.
}
/* ***********************************************************************
** 函 数 名:void PLJS()
** 功能描述:计算频率.
************************************************************************** */
void PLJS()
{
	int i,QH,FF[5];															//参数.
	QH=(CCP>9)?0:10;														//判断取数位置.
	for(i=0;i<5;i++)														//
	{
		FF[i]=FT[i+QH];														//取数.
	}
	F=(FF[4]>FF[3])?(FF[4]-FF[3]):(FF[4]+65536-FF[3]);
	F=(long)(100000000/F);											//判断,并计算频率.
}
/* ***********************************************************************
** 函 数 名:void CYTZ()
** 功能描述:零点检测法,采样频率调整.
************************************************************************** */
void CYTZ()
{
	int i,n,PL[2];															//参数.
	while(1)
	{
		ADCHX();																	//AD采样.
		for(i=0,n=0;n<2;i++)											//零点判断.
		{
			if(DATA[CHAN*2][i-1]<=DATA[CHAN*2][i]&&DATA[CHAN*2][i]>=DATA[CHAN*2][i+1])
			{
				PL[n]=i;															//第n个零点.
				n++;																	//
			}
		}
		if((PL[1]-PL[0])==32)											//两个零点的间隔=32.
		{
			break;																	//退出.
		}
		if((PL[1]-PL[0])>32)											//两个零点的间隔>32.
			AD++;																		//加大采样间隔.
		else
			AD--;																		//否则,减小采样间隔.
		if(BACK==1)																//达不到要求.
		{
			BACK=0;																	//标志位清零.
			AD=50;																	//AD还原.
			break;																	//退出.
		}
		OUTNUM(AD,0,120,0);												//显示调整结果.
	}
}
/* ***********************************************************************
** 函 数 名:void MUNS()
** 功能描述:按键功能设置.
************************************************************************** */
 void MUNS()
{
	KEY=KEYIN();																//读按键值.
	switch(KEY)																	//
	{
		case 0XFE:																//
		{
			ADWORDS=ADCAN;													//MAX197控制字.
			MAXD=1;																	//置标志位.
			MAXA=BACK=NEXT=SURE=GUID=0;							//屏蔽其它标志位.
			CHAN=0;																	//确定通道.
			break;																	//退出.
		}
		case 0XFD:																//
		{
			ADWORDS=ADCAN+2;												//MAX197控制字.
			MAXD=1;																	//置标志位.
			MAXA=BACK=NEXT=SURE=GUID=0;							//屏蔽其它标志位.
			CHAN=1;																	//确定通道.
			break;																	//退出.
		}
		case 0XFB:																//
		{
			ADWORDS=ADCAN+4;												//MAX197控制字.		
			MAXD=1;																	//置标志位.
			MAXA=BACK=NEXT=SURE=GUID=0;							//屏蔽其它标志位.
			CHAN=2;																	//确定通道.
			break;																	//退出.
		}
		case 0XF7:																//
		{
			MAXA=1;																	//置标志位.
			MAXD=BACK=NEXT=SURE=GUID=0;							//屏蔽其它标志位.
			break;																	//退出.
		}
		case 0XEF:																//
		{
			BACK=1;																	//置标志位.
			MAXD=MAXA=NEXT=SURE=GUID=0;							//屏蔽其它标志位.
			break;																	//退出.
		}
		case 0XDF:																//
		{
			NEXT=1;																	//置标志位.
			MAXD=MAXA=BACK=SURE=GUID=0;							//屏蔽其它标志位.
			break;																	//退出.
		}
		case 0XBF:																//
		{
			SURE=1;																	//置标志位.
			MAXD=MAXA=BACK=NEXT=GUID=0;							//屏蔽其它标志位.
			break;																	//退出.
		}
		case 0X7F:																//
		{
			GUID=1;																	//置标志位.
			MAXD=MAXA=BACK=NEXT=SURE=0;							//屏蔽其它标志位.
			break;																	//退出.
		}
	}
}
/* ************************************************************************
** 函 数 名:interrupt HI_ISR()
** 功能描述:高优先级中断服务程序.
*************************************************************************** */
void interrupt HI_ISR()
{
  if(CCP1IF==1)															//
  { 
	  CCP1IF=0;																//清中断标志.
	  FT[CCP]=CCPR1L+(CCPR1H<<8);							//读计数器当前值.
	  CCP++;																	//增量加1.
   	if(CCP==20)															//超出.
			CCP=0;																//归零.
	}
}
/* ***********************************************************************
** 函 数 名:void interrupt low_priority LOW_ISR()
** 功能描述:按键功能设置.
************************************************************************** */
void interrupt low_priority LOW_ISR()
{
  if(TMR3IF==1)
  { 
	 ATRL=PORTA&0X0F;													//保存PORTA当前状态.
	 BTRL=PORTB&0XF0;													//保存PORTB当前状态.
	 PORTA=PORTA&0XF0;												//屏蔽所有地址.
	 PORTB=PORTB&0X8F;												//屏蔽所有控制信号.
	 TMR3IF=0;																//清中断标志.
	 TMR3L=0X9A;															//计数初值.
	 MUNS();																	//读按键,置标志位.
	 PORTA=(ATRL|0XF0)&PORTA;									//还原PORTA状态
	 PORTB=(BTRL|0X0F)&PORTB;									//还原PORTB状态
	}
}

/* ***********************************************************************
 ** 函 数 名:void GUIDE() 
 ** 功能描述:绘制系统操作指导界面.
 ************************************************************************** */
 void GUIDE()
{
	int x,y;
	LCDCLEAR(1);																//清屏.
	LCDCLEAR(2);																//清屏.
 	for(y=0;y<3;y++)														//界面占LCD屏6页.
	{	
		for(x=0;x<32;x++)													//102列,前51列在第一片LCD上显示.	
		{
			LCDOUT(HELP[y][31-x],0X7F-x,y+0XBA,1);	//输出数据.
		}
		for(x=0;x<32;x++)													//102列,后51列在第一片LCD上显示.
		{
			LCDOUT(HELP[y][x+32],x+0x40,y+0XBA,2);
		}																					//输出数据.
	}
}
/* ***********************************************************************
** 函 数 名:void MUNM()
** 功能描述:按键功能设置.
************************************************************************** */
void MUNM()
{
	LCDCLEAR(1);																//清屏.
	LCDCLEAR(2);																//清屏.
	LCDNUM(ABC[0],48,1);												//标题.
	LCDNUM(ABC[1],56,1);												//标题.
	LCDNUM(ABC[2],64,1);												//标题.
	LCDNUM(ABC[3],72,1);												//标题.
	LCDNUM(NUM[10],28,3);												//0.
	LCDNUM(ABC[4],36,3);												//A相.
	LCDNUM(ABC[5],44,3);												//
	LCDNUM(NUM[11],28,4);												//1.
	LCDNUM(ABC[6],36,4);												//B相.
	LCDNUM(ABC[7],44,4);												//
	LCDNUM(NUM[12],28,5);												//2.
	LCDNUM(ABC[8],36,5);												//C相.
	LCDNUM(ABC[9],44,5);												//
	LCDNUM(NUM[13],28,6);												//3.
	LCDNUM(ABC[10],36,6);												//三相.
	LCDNUM(ABC[11],44,6);												//
	LCDNUM(NUM[14],74,3);												//4.
	LCDNUM(ABC[12],82,3);												//SET.
	LCDNUM(ABC[13],90,3);												//
	LCDNUM(NUM[15],74,4);												//5.
	LCDNUM(ABC[14],82,4);												//HEI.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -