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

📄 nsa_timer_drv.c

📁 ds1306和bs5460的驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		else
		{
			tDegree.dEMid[i]+=Energy_Reg[i].E;
		}
	}
}

void SetNewDegree(BYTE i)
{
	Energy_Reg[i].Conf.Config=daDegree[tDegree.byIndexMid[i]] |0x000001;
	TM_Write_CS5460( WRITE_COM| CONFIG_REG, i, &Energy_Reg[i].Conf.Config );
}


bool Judge_Degree()
{
	//判大小   交换    判结束
	//置标志
	int i;
	for( i=0; i<CS_ALL; i+=2 )
	{
		if( tDegree.bDegreeOK[i] )
		{//本路已完成!
			continue;
		}
		if( !tDegree.bDone_Min[i] )
		{//先做MIN点
			tDegree.bDone_Min[i]=true;
			continue;
		}
		else if( !tDegree.bDone_Max[i] )
		{//再做MAX点
			tDegree.bDone_Max[i]=true;
			continue;
		}
		else
		{//正常只做中间点
			if( tDegree.byIndexMin[i]==tDegree.byIndexMid[i]-1 )
			{//最后连续三点
				if( tDegree.dEMax[i]>=tDegree.dEMid[i] && tDegree.dEMax[i]>=tDegree.dEMin[i] )
				{//MAX点最大
					tDegree.byIndexMid[i]=tDegree.byIndexMax[i];
					SetNewDegree((BYTE)i);
					tDegree.bDegreeOK[i]=true;
					continue;
				}
				else if( tDegree.dEMin[i]>=tDegree.dEMid[i] && tDegree.dEMin[i]>=tDegree.dEMax[i] )
				{//MIN点最大
					tDegree.byIndexMid[i]=tDegree.byIndexMin[i];
					SetNewDegree((BYTE)i);
					tDegree.bDegreeOK[i]=true;
					continue;
				}

				else
				{//MID点最大,正是当前点
					tDegree.bDegreeOK[i]=true;
					continue;
				}
			}
			//非最后连续三点,中间任意三点
			if( (tDegree.dEMin[i]<=tDegree.dEMax[i]) && 
						(tDegree.dEMin[i]<=tDegree.dEMid[i]) )
			{//MIN点最小:
				tDegree.dEMin[i]=tDegree.dEMid[i];
				tDegree.byIndexMin[i]=tDegree.byIndexMid[i];
				//tDegree.bDone_Min[i]=false;
				//tDegree.bDone_Max[i]=false;
				//tDegree.dEMin[i]=0;
				//tDegree.dEMax[i]=0;
			}
			else if( (tDegree.dEMax[i]<=tDegree.dEMin[i]) && 
						(tDegree.dEMax[i]<=tDegree.dEMid[i]) )
			{//MAX点最小:
				tDegree.dEMax[i]=tDegree.dEMid[i];
				tDegree.byIndexMax[i]=tDegree.byIndexMid[i];
				//tDegree.bDone_Min[i]=false;
				//tDegree.bDone_Max[i]=false;				
				//tDegree.dEMin[i]=0;
				//tDegree.dEMax[i]=0;
			}
			else if(1)
			{//理论不存在,实际有可能出现的情况,即当前MID点是最小值
				//跳出去重做!
				tDegree.bDone_Min[i]=false;
				tDegree.bDone_Max[i]=false;
				tDegree.dEMin[i]=0;
				tDegree.dEMax[i]=0;
			}
			//中间任意三点时
			tDegree.byIndexMid[i]=(tDegree.byIndexMin[i]+tDegree.byIndexMax[i])>>1;
			tDegree.dEMid[i]=0;
		}
	}
	if( tDegree.bDegreeOK[0] && tDegree.bDegreeOK[2] )
		return true;
	return false;
}

#define EXP	4
#define TIMES	( 16 )

static bool bStart=false;

void Test_Factor()
{
	static bool bDone=false;
	static int i=0;
	static DWORD dE0=0;
	static DWORD dI0=0;
	static DWORD dU0=0;
	static DWORD dE2=0;
	static DWORD dI2=0;
	static DWORD dU2=0;
	static DWORD dBL0=0;
	static DWORD dBL2=0;
	static DWORD dIBL0;
	static DWORD dIBL2;
	static DWORD dUBL0;
	static DWORD dUBL2;
	
	if( !bStart )
	{
		bStart=true;
				 dE0=0;
				 dI0=0;
				dU0=0;
				 dE2=0;
				 dI2=0;
				dU2=0;
				 dBL0=0;
				 dBL2=0;
				 dIBL0=0;
				 dIBL2=0;
				dUBL0=0;
				dUBL2=0;
		return;
	}
	if(bDone)
		return;
	if(		!Energy_Reg[0].Irms |
			!Energy_Reg[0].Vrms |
			!Energy_Reg[0].E	|
			!Energy_Reg[2].Irms |
			!Energy_Reg[2].Vrms |
			!Energy_Reg[2].E		)
	{	
		bStart=false;
		return;
	}

	dI0+=Energy_Reg[0].Irms;
	dU0+=Energy_Reg[0].Vrms;
	dBL0+=(_Mul_Div_U(Energy_Reg[0].Irms,Energy_Reg[0].Irms,Energy_Reg[0].E))>>2;
	dE0+=Energy_Reg[0].E;
	dI2+=Energy_Reg[2].Irms;
	dU2+=Energy_Reg[2].Vrms;
	dE2+=Energy_Reg[2].E;
	dBL2+=(_Mul_Div_U(Energy_Reg[2].Irms,Energy_Reg[2].Irms,Energy_Reg[2].E))>>2;
	i++;

	if( i<TIMES )
		return;
	dI0>>=EXP;
	dU0>>=EXP;
	dE0>>=EXP;
	dI2>>=EXP;
	dU2>>=EXP;
	dE2>>=EXP;
	dBL0>>=EXP;
	dBL2>>=EXP;
/*	dIBL0=_Mul_Div_U(0XFFFFFFFFul,010000ul,dI0);
	dIBL2=_Mul_Div_U(0XFFFFFFFFul,010000ul,dI2);
	dUBL0=_Mul_Div_U(0XFFFFFFFFul,010000ul,dU0);
	dUBL2=_Mul_Div_U(0XFFFFFFFFul,010000ul,dU2);
	dBL0=_Mul_Div_U(dI0,dU0,dE0);
	dBL2=_Mul_Div_U(dI2,dU2,dE2);
*/	
	bStart=false;
	i=0;
	//bDone=true;
}
#endif
/////////////////////////////////////////////////////////////////////////////////////////
void Verify_VIgn()//修改增益
{
	int i;
	for( i=0; i<CS_ALL; i++ )
	{
		if( Energy_Reg[i].Conf.Vgn>0x550000 || Energy_Reg[i].Conf.Vgn<0x300000 )//钳制在4.0到0.0之间zaken
			Energy_Reg[i].Conf.Vgn=0x4d0000;
		if( Energy_Reg[i].Conf.Ign>0x620000 || Energy_Reg[i].Conf.Ign<0x400000 )
			Energy_Reg[i].Conf.Ign=0x540000;
		Energy_Reg[i].Conf.Config=0x020001;
	}
}

#define MAX_DELAY_TIME	30000
void Calibrate_Operation()
{
	static WORD start=0;
	static bool bTemp=false;
	static DWORD ddttCount;
	bool (* pbFunction)(BYTE);

	Energy_Reg[1].dDeltT=0;
	switch( gtOp_5460_Flag.wOprateID )
	{
	case CALIBRATE_DC_OFFSET:
		pbFunction=TM_CS_Set_DC_Offset;
		break;
	case CALIBRATE_AC_OFFSET:
		pbFunction=TM_CS_Set_AC_Offset;
		break;
	case CALIBRATE_AC_GAIN:
		pbFunction=TM_CS_Set_AC_Gain;
		break;
	case CALIBRATE_DEGREE:
		//pbFunction=TM_CS_Set_Degree1;
		//break;
	default:
		gtOp_5460_Flag.wOprateID=0;
		return;	
	}
	if( start==0 )
	{
		Read_CS_Config();
		bTemp=pbFunction(CS_ALL);
		ddttCount=dTCounter;
		gtOp_5460_Flag.bCalibrating=true;
		gtOp_5460_Flag.wCalibrate_Result=0;
		start++;
	}
	else if( Check_All_Data_Ready() )
		{//有校验完成标志
			start=0;
			Read_CS_Config();
			if( Check_Calibrate_Status() )
			{//校验正确!
				gtOp_5460_Flag.wCalibrate_Result=CALIBRATE_RIGHT;
				Clear_CS_Status();
				Command_Convert();
				if(	gtOp_5460_Flag.wOprateID== CALIBRATE_DC_OFFSET )
				{//直流偏置校验完,做交流偏置!
					gtOp_5460_Flag.wOprateID = CALIBRATE_AC_OFFSET;
					return;
				}
				if( gtOp_5460_Flag.wOprateID== CALIBRATE_AC_GAIN )
				{//交流增益校验完!OK!
					Verify_VIgn();
					gtOp_5460_Flag.wOprateID= 0;
					gtOp_5460_Flag.bCalibrating=false;
					gtOp_5460_Flag.wCalibrate_Result= CALIBRATE_RIGHT;
					gtOp_5460_Flag.bNeed_Show_Gain_OK=true;
					return;
				}
				else
				{//偏置校验完!OK!
					gtOp_5460_Flag.wOprateID= 0;
					gtOp_5460_Flag.bCalibrating=false;
					gtOp_5460_Flag.wCalibrate_Result= CALIBRATE_RIGHT;
					gtOp_5460_Flag.bNeed_Show_Offset_OK=true;
				}

				return;
			}
			else
			{//校验出错!
				gtOp_5460_Flag.wCalibrate_Result=CALIBRATE_ERROR;
				Clear_CS_Status();
				return;
			}
		}
		else if( (dTCounter-ddttCount)>MAX_DELAY_TIME )
		{//一直无校验完成标志>30秒
			Read_CS_Config();
			start=0;
			gtOp_5460_Flag.wOprateID=0;
			gtOp_5460_Flag.bCalibrating=false;
			gtOp_5460_Flag.wCalibrate_Result=CALIBRATE_ERROR;
			Clear_CS_Status();
			return;
		}	
}

//周期性电能管理操作
// >1.3S调用一次
CS5460_IVE CS5460_ive;
CALING_ENG_DATA Cal_Eng_Data;

DIAN_LIANG tDian_Liang;
#define CYCLE_ENERGY_INTERVAL	1300
#define CYCLE_ENERGY_SAMPLE_MAX 10000
void Use_Raw_Ive()
{
	CS5460_ive.BeUsed=false;
}

void Convert_Raw_Ive()
{
	int i;
	DWORD dWord;
	short * pShort;

	for( i=0; i<CS_ALL; i++ )
	{
		CS5460_ive.I[i]=(short)(Energy_Reg[i].Irms>>9);	//11
		CS5460_ive.U[i]=(short)(Energy_Reg[i].Vrms>>9);	//11
		dWord=Energy_Reg[i].E>>8;	//10
		pShort=(short *)&dWord;
		CS5460_ive.E[i]=*(++pShort);
	}
	CS5460_ive.BeUsed=false;
}


#ifdef TEST_TIME
static DWORD dCyclePre=0,dCycleNow=0,dCycleMax=0;
#endif

void Cycle_Energy_Operation()
{
#ifdef CS5460ABS_DEVICE

	static DWORD dTCheckCS0,dTCheckCS1;
	static WORD wCheck_Err_Counter=0;
	//1.关于FLASH的操作
	if( gtOp_5460_Flag.bNeed_Save_Config )
	{
		if( FM_Write_Eng_Conf() )
			gtOp_5460_Flag.bNeed_Save_Config=false;
	}
	if( gtOp_5460_Flag.bNeed_Read_Config )
	{
		if( FM_Read_Eng_Conf() )
			gtOp_5460_Flag.bNeed_Read_Config=false;
	}

	//2.记录时间,确定是否SPI操作
	if( (dTCOUNT1-dTCOUNT0)==0xfffffffff )
	{//刚上电情况
		dTCOUNT0=dTCounter;
		dTCOUNT1=dTCOUNT0;
		Energy_Reg[0].dDeltT=0;
		Energy_Reg[2].dDeltT=0;
		dTCheckCS0=dTCheckCS1=dTCOUNT0;
		return;
	}
	dTCOUNT1=dTCounter;
	if( (dTCOUNT1-dTCOUNT0)<CYCLE_ENERGY_INTERVAL )
		return;
	Energy_Reg[1].dDeltT+=dTCOUNT1-dTCOUNT0;
	dTCOUNT0=dTCOUNT1;
	//如果连续超过4次配置自检出错,则退出SPI操作,并报错!
	if( wCheck_Err_Counter >=4 )
	{
		////报错!
		//  return;
	}

	//3.SPI操作

	if( !SYS_LOCK_SPI() )
		return;
#ifdef TEST_TIME
	dCyclePre=dTCounter;
#endif

	if( gtOp_5460_Flag.wOprateID!=0 )
	{//校验CS5460
		Calibrate_Operation();
		wCheck_Err_Counter=0;
		dTCheckCS0=dTCheckCS1=dTCounter;

	}
	else
	{//正常运行中
		if( gtOp_5460_Flag.bNeed_Download_Config )
		{
			if(!gtOp_5460_Flag.bNeed_Read_Config)
			{
				Download_Config();
			}
			SYS_UNLOCK_SPI();
			return;
		}
		Read_CS_Sample();
		if( Check_CS_Status() )
		{
			//Test_Factor();
			Convert_Raw_Ive();
			Clear_CS_Status();
			Energy_Reg[0].dDeltT=Energy_Reg[1].dDeltT;
			Energy_Reg[2].dDeltT=Energy_Reg[1].dDeltT;
			Energy_Reg[1].dDeltT=0;
		}
		else if( Energy_Reg[1].dDeltT>CYCLE_ENERGY_SAMPLE_MAX )
		{
			gtOp_5460_Flag.bNeed_Read_Config=true;
			gtOp_5460_Flag.bNeed_Download_Config=true;
			Use_Raw_Ive();
			Clear_CS_Status();
			Energy_Reg[0].dDeltT=Energy_Reg[1].dDeltT;
			Energy_Reg[2].dDeltT=Energy_Reg[1].dDeltT;
			Energy_Reg[1].dDeltT=0;
		}

		//2000,09,15 增加定时检查CS5460的配置
		if( (Energy_Reg[0].bUsed==true) 
			// && (wCheck_Err_Counter<4) 
			)
		{
			dTCheckCS1=dTCounter;
			if( (dTCheckCS1-dTCheckCS0) > (180000-wCheck_Err_Counter*30000 ) )
			{
				dTCheckCS0=dTCheckCS1;
				if( !TM_Check_CS5460_Config(CS_ALL) )
				{
					gtOp_5460_Flag.bNeed_Read_Config=true;
					gtOp_5460_Flag.bNeed_Download_Config=true;
					if( wCheck_Err_Counter < 4 )
						wCheck_Err_Counter++;
				}
				else
				{
					if( wCheck_Err_Counter > 0 )
						wCheck_Err_Counter--;
				}
			}
		}
		//定时检查CS5460的配置结束

		//保存电能到DS1306的用户RAM去(偏移地址 0xA0) 
		TM_Write_DS_Array( ENERGY_OFFSET, sizeof(DIAN_LIANG),
						(BYTE *)&tDian_Liang);
		if( gtOp_5460_Flag.bNeed_Clear_Energy )
		{
			TM_Clear_Real_Energy();
			gtOp_5460_Flag.bNeed_Clear_Energy=false;
		}
	}//正常运行中结束
	SYS_UNLOCK_SPI();

#ifdef TEST_TIME
	dCycleNow=dTCounter;
	dCycleNow= dCycleNow- dCyclePre;
	if(dCycleNow> dCycleMax)
		dCycleMax= dCycleNow;
#endif
	//4.处理相关量及电能
	Deal_Energy();

#else
	Deal_Others();
#endif

}

void CS5460A_Operating_Show()
{
	if(gtOp_5460_Flag.bNeed_Show_Offset_OK)
	{
		gtOp_5460_Flag.bNeed_Show_Offset_OK=false;
		PopupBox(HWND_NULL,"偏移校验","偏移校验完毕!\n\n先加交流再做增益校验!");
	}
	if(gtOp_5460_Flag.bNeed_Show_Gain_OK)
	{
		gtOp_5460_Flag.bNeed_Show_Gain_OK=false;
		PopupBox(HWND_NULL,"增益校验","\n增益校验完毕!\n请查看校验结果!");
	}
}

void Test_CS5460()
{
	bool bTemp;
	int i,j;
//initialize CS5460
	TM_Initinize_CS5460();

	for( i=0; i<3; i++ )
	{
		bTemp=false;
		bTemp=TM_Check_CS5460_Config((BYTE)i);
	}

//偏置校验
	//bTemp=TM_CS_Set_Dc_Offset(3);
//AC偏置校验
	//bTemp=TM_CS_Set_AC_Offset(3);

//增益校验
	//bTemp=TM_CS_Set_AC_Gain(3);

//角度校验
	for( j=0; j<127; j++ )
	{
		bTemp=TM_CS_Set_Degree(0,BYUP);
		for( i=0; i<3; i++ )
		{
			Cycle_Energy_Operation();
		}
	}
//保存CS5460配置信息
	bTemp=TM_Save_CS5460_Config(3);

	for( i=0; i<3; i++ )
	{
		bTemp=false;
		bTemp=TM_Check_CS5460_Config((BYTE)i);
	}


	Cycle_Energy_Operation();
}

⌨️ 快捷键说明

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