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

📄 yc.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 2 页
字号:
/*------------------------------------------------------------------*/
/*模块名称:yc.c                   	  		                     	*/
/*模块功能:遥测、整定处理模块										*/
/*编写者:  fengliang												*/
/*备注1:	2005年10月 dingding对模块重新编写并优化处理        		*/
/*------------------------------------------------------------------*/

#include "includes.h"


extern u_char	 TGSH;
extern INT32U	NVRAMSIZE;
extern struct SysPort		*SysPorts;
extern struct SysConfig		SysCfg;
extern struct YCPara_t		YCPara;
extern struct MyConfig		MyCfg;


//采用原风格,按照最大分配
struct ADData_t		ADData[MAXYCFD];
struct YCTempData	YCTemp[MAXYCFD];
struct YCParas		YCParas[MAXYCFD];
INT16S	YcTmpBuf[192];	//按最大分配(32*6 )

INT16U	Frequency = 5000 ;
INT8U	Frequency_Lose = 0 ;

//计数器 
INT8U	CurAD = 0;
INT8U	CurFast = 0;
INT8U	CurSubF = 0;
INT8U	SumCount = 0;
INT16U	YcReadCounter = 0;
INT16U	YcMeanCounter = 0;

//录波
struct LB_t	Lb[MAXYCFD];


/*------------------------------------------------------------------*/
/*函数名称:YCTask()												*/
/*函数功能:遥测任务												*/
/*------------------------------------------------------------------*/
void YCTask(void *pdata)
{
	memset (ADData, 0, MAXYCFD*sizeof (struct ADData_t));
    memset (YCTemp, 0, MAXYCFD*sizeof (struct YCTempData));
    
	YC_Init();


    while(1)
    {
        OSTimeDlyHMSM(0, 0, 0, 10);
		
		Fast_Calculate();
		YcReadCounter++;

	    		
	 	if (YcReadCounter >= 10)
	 	{
	 		YcReadCounter = 0;
	 		YcMeanCounter++;
		    UI_Treatment();
			AppYcRead();
	    }
	    
	 	if ((YcReadCounter >= 10 - MAXYCFD) && (YcReadCounter < 10))
	 	{
		    PQ_Treatment(10 - YcReadCounter);
	    }
	    
	    
	    if (YcMeanCounter >= 5)      //2; 须>=3
     	{	
    		YcMeanCounter = 0;
			AppYcMean();
      	}
     }
}


/*------------------------------------------------------------------*/
/*函数名称:YC_Init()												*/
/*函数功能:遥测任务初始化											*/
/*------------------------------------------------------------------*/
void YC_Init(void)
{
	BOOL	rc = FALSE;
	INT8U	i;
	INT32S	defycpara[10] = {6900, 6900, 2300, 2300, 2300, 2300 , 476000, 476000, 473000, 473000};

	//整定值
	if (SysCfg.ParaValid)
	{
		for (i=0; i<TMPYCNUM*2; i++)
		{
			if ((TGSH && (i==1)) || (i==0))
			{
				if((YCPara.Value[i] == 0) || (YCPara.Value[i] == 0xFFFF))	//防止参数非法
				{
					rc = TRUE;
					YCPara.Value[i] = defycpara[i%TMPYCNUM];
				}
			}
		}	
	}
	else
	{
		rc = TRUE;		
		for (i=0; i<TMPYCNUM*2; i++)
		{
			YCPara.Value[i] = defycpara[i%TMPYCNUM];
		}
	}

	//归零值
	for (i=0; i<TMPYCNUM; i++)
	{
		YCParas[0].ToZero[i] = YCPara.Value[i] * MyCfg.Ai[i].ToZero / 1000;
	}
	if (TGSH)
	{
		for (i=0; i<TMPYCNUM; i++)
		{
			YCParas[1].ToZero[i] = YCPara.Value[TMPYCNUM+i] * MyCfg.Ai[DEFYCNUM+i].ToZero / 1000;
		}		
	}
	
	if (rc)
	{
		ErrorInfo(OSPrioCur, "ycpara.sys有错!");
	}
	
	memset (Lb, 0, MAXYCFD * sizeof (struct LB_t));
}


/*------------------------------------------------------------------*/
/*函数名称:FIQ_init_handler()										*/
/*函数功能:中断处理函数											*/
/*------------------------------------------------------------------*/
void FIQ_init_handler(void)
{
	INT16U	i, no;
	
	if (CurAD >= ADAINUM)
		CurAD = 0;
	
	if (TGSH)
	{
		no = ADAINUM * (ADNUM-1) + CurAD;
		for (i=0; i<ADNUM; i++)
		{
			ADData[1].Data[no] = *ZK2_AD8364;
			no = no - ADAINUM;
		}
	}

	no = ADAINUM * (ADNUM-1) + CurAD;
	for (i=0; i<ADNUM; i++)
	{
//		AD_Channel = *ZK1_AD8364;	//for new board;
		ADData[0].Data[no] = *ZK1_AD8364;
		no = no - ADAINUM;
	}

	CurAD++;
	
   	*ZK1_ADRST = 1;		// 复位AD1
   	*ZK2_ADRST = 1;		// 复位AD2
   	
   	AIC_ICCR = 1;		// 消除多余的FIQ中断标志
}


/*------------------------------------------------------------------*/
/*函数名称:Fast_Calculate()										*/
/*函数功能:遥测快速计算,每周波滚动计算四次						*/
/*函数说明:计算耗时120uS/两回线路									*/
/*------------------------------------------------------------------*/
void Fast_Calculate(void)
{
	INT8U	i, j, k, num;
	INT16U	no;
	unsigned long long sum;
	
	if (CurFast < CurAD)
		num = CurAD - CurFast;
	else
		num = CurAD + ADAINUM - CurFast;
	num = num / 8;
	
	while (num--)
	{
		for (k=0; k<MAXYCFD; k++)
		{
			if ((TGSH && (k==1)) || (k==0))
			{
				for (i=0; i<ADNUM; i++)
				{
					YCTemp[k].FData[i].Subsum[CurSubF] = 0;
					no = i * ADAINUM + CurFast;
					for (j=0; j<8; j++)
					{
						YCTemp[k].FData[i].Subsum[CurSubF] += (int)ADData[k].Data[no+j] * (int)ADData[k].Data[no+j];
					}
					
					sum = 0;
					for (j=0; j<4; j++)
					{
						sum += YCTemp[k].FData[i].Subsum[j];
						YCTemp[k].FData[i].Rms2 = sum>>5;
					}
				}
			}
		}
		
		CurFast = (CurFast + 8) % ADAINUM;
		CurSubF = (CurSubF + 1) % 4;
	}
	
	//added for FA by dingding
	OSFlagPost (SysPorts[0].Event, FYCRDY, OS_FLAG_SET, &k);
/*	if (k != OS_NO_ERR)
	{
		ErrorInfo(OSPrioCur, "发送遥测失败");
	}*/
	
	
	for (no=0; no<MAXYCFD; no++)
	{
		if (Lb[no].State)
			LB(no);
	}
}

/*------------------------------------------------------------------*/
/*函数名称:UI_Treatment()											*/
/*函数功能:计算电流、电压有效值									*/
/*函数说明:计算耗时57uS/两回线路									*/
/*------------------------------------------------------------------*/
void UI_Treatment(void)
{
	INT8U	i, k;
	
	k = MAXYCFD;
	while (k--)
	{
		if ((TGSH && (k==1)) || (k==0))
		{
			for (i=0; i<ADNUM; i++)
			{
				YCTemp[k].YcData[i] = MySqrtInt(YCTemp[k].FData[i].Rms2);
			}
		}
	}
	
}

/*------------------------------------------------------------------*/
/*函数名称:PQ_Treatment()											*/
/*函数功能:计算有功、无功											*/
/*函数说明:计算耗时221uS/两回线路									*/
/*------------------------------------------------------------------*/
void PQ_Treatment(INT8U No)
{
	INT8U	i, k;
	INT16U	str, end, a, b;
	long long sum[4];
	
	str = (CurFast + ADAINUM - 32) % ADAINUM;
	end = (CurFast + ADAINUM - 1) % ADAINUM;
	
	k = No - 1;
//	while (k--)
//	{
		if ((TGSH && (k==1)) || (k==0))
		{
			sum[0] = (int)ADData[k].Data[str + ADAINUM*2] * (int)ADData[k].Data[str] + (int)ADData[k].Data[end + ADAINUM*2] * (int)ADData[k].Data[end];
			sum[2] = (int)ADData[k].Data[str + ADAINUM*2] * (int)(ADData[k].Data[end] - ADData[k].Data[str+1])
					+ (int)ADData[k].Data[end + ADAINUM*2] * (int)(ADData[k].Data[end-1] - ADData[k].Data[str]);
			sum[1] = (int)ADData[k].Data[str + ADAINUM*4] * (int)ADData[k].Data[str + ADAINUM] + (int)ADData[k].Data[end + ADAINUM*4] * (int)ADData[k].Data[end + ADAINUM];
			sum[3] = (int)ADData[k].Data[str + ADAINUM*4] * (int)(ADData[k].Data[end + ADAINUM] - ADData[k].Data[str + ADAINUM + 1])
					+ (int)ADData[k].Data[end + ADAINUM*4] * (int)(ADData[k].Data[end + ADAINUM - 1] - ADData[k].Data[str + ADAINUM]);
			
			for (i=1; i<31; i++)
			{
				end = (str + i) % ADAINUM;
				a = (end + ADAINUM - 1) % ADAINUM;
				b = (end + ADAINUM + 1) % ADAINUM;
				
				sum[0] += (int)ADData[k].Data[end + ADAINUM*2] * (int)ADData[k].Data[end];
				sum[2] += (int)ADData[k].Data[end + ADAINUM*2] * (int)(ADData[k].Data[a] - ADData[k].Data[b]);
				sum[1] += (int)ADData[k].Data[end + ADAINUM*4] * (int)ADData[k].Data[end + ADAINUM];
				sum[3] += (int)ADData[k].Data[end + ADAINUM*4] * (int)(ADData[k].Data[a + ADAINUM] - ADData[k].Data[b + ADAINUM]);
			}
		
			//将功率降低100倍
			for (i=0; i<4; i++)
			{
				if (i < 2)	//P
				{
					YCTemp[k].YcData[i+6] = sum[i] / 3200;	//32* 100
				}
				else	//Q
				{
					YCTemp[k].YcData[i+6] = sum[i] * 10 / 12566;	//1000 / 12566 /100
				}
			}
		}
//	}	

}

/*------------------------------------------------------------------*/
/*函数名称:AppYcRead()												*/
/*函数功能:读取有效值,并找出MEANNUM次中最大值,最小值,及和		*/
/*------------------------------------------------------------------*/
void AppYcRead(void)
{
	INT8U	i, k;
	
	for (k=0; k<MAXYCFD; k++)
	{
		if ((TGSH && (k==1)) || (k==0))
		{
			for (i=0; i<TMPYCNUM; i++)
			{
				if (SumCount == 0)
				{
					YCTemp[k].YcDataMax[i] = YCTemp[k].YcData[i];
					YCTemp[k].YcDataMin[i] = YCTemp[k].YcData[i];
					YCTemp[k].YcDataSum[i] = YCTemp[k].YcData[i];
				}
				else
				{
					YCTemp[k].YcDataSum[i] += YCTemp[k].YcData[i];
										
					if (YCTemp[k].YcData[i] > YCTemp[k].YcDataMax[i])
					{

⌨️ 快捷键说明

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