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

📄 ade7758_dx.c.svn-base

📁 一个基于UCOS/2操作系统开发的实际产品(电力负控)的代码
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
/*********************************************************************************************************
** 函数名称: Read_ADE7758
** 功能描述: 读ADE7758寄存器内的数据
********************************************************************************************************/
void Read_ADE7758 (uint32 address, uint32 number)
{
	uint32 ii;
		
		Clr_Pin(SPI_CLK);
		Delay_100us_Stop(1);
		Clr_Pin(SEL_ADE7758);
		Delay_100us_Stop(1);	
		SPI_S_Byte(address);
		Delay_100us_Stop(1);
		for(ii=0;ii<number;ii++) spi_buf[ii] = SPI_R_Byte();
		Delay_100us_Stop(1);
	    Set_Pin(SEL_ADE7758);
	    Delay_100us_Stop(1);	
	    Set_Pin(SPI_CLK);
	    Clrwdt();    
}

/*********************************************************************************************************
** 函数名称: Write_ADE7758
** 功能描述: 写ADE7758寄存器内的数据
********************************************************************************************************/
void Write_ADE7758 (uint32 address, uint32 number)
{
	uint32 ii;
	
	    Clr_Pin(SPI_CLK);
	    Delay_100us_Stop(1);
		Clr_Pin(SEL_ADE7758);
		Delay_100us_Stop(1);
		SPI_S_Byte(address+0x80);
		Delay_100us_Stop(1);
		for(ii=0;ii<number;ii++) SPI_S_Byte(spi_buf[ii]);
		Delay_100us_Stop(1);
		Set_Pin(SEL_ADE7758);
		Delay_100us_Stop(1);
		Set_Pin(SPI_CLK);
    Clrwdt(); 		
}

/*********************************************************************************************************
** 函数名称: Initial_ADE7758
** 功能描述: 初始化ADE7758的参数
**
** INPUT: 
** 
********************************************************************************************************/
void Initial_ADE7758 (void)
{
	uint32 ii,phase;
	
	   
		spi_buf[0] = 0x40;					
		Write_ADE7758(OPMODE,1);
		Delay_Ms_Stop(1);
		
		Initial_ADE7758_Noreset();
		
		spi_buf[0] = 0x00;
	    spi_buf[1] = 0x00;
	    Write_ADE7758(APCFNUM,2);
	    Write_ADE7758(VARCFNUM,2);
	    	
		//----插入标定参数的数据-----
		ii = Select_Blank(FINISH_FLAG_ADDR,2);
		if (i2c_buf[0]!=0x55 OR i2c_buf[1]!=0x55) ii = 0xEE;
		
		if (ii==0)
		   {
		    ii |= Select_Blank(IRMSOS_ADDR,6);
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AIRMSOS,2);
	    	spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	    	Write_ADE7758(BIRMSOS,2);
	   		spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	    	Write_ADE7758(CIRMSOS,2);
	       }	
	    if (ii==0)
	       {   
	    	ii |= Select_Blank(IGAIN_ADDR,6);
	        spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AIGAIN,2);
	    	spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	    	Write_ADE7758(BIGAIN,2);
	    	spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	    	Write_ADE7758(CIGAIN,2);
	       }
	    if (ii==0)
	       {
	        ii |= Select_Blank(VRMSOS_ADDR,6);
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AVRMSOS,2);
	    	spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	    	Write_ADE7758(BVRMSOS,2);
	    	spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	    	Write_ADE7758(CVRMSOS,2);
	       }	   
	    if (ii==0)
	       {
	        ii |= Select_Blank(VRMSGAIN_ADDR,6);
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AVRMSGAIN,2); 
	    	spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	   	 	Write_ADE7758(BVRMSGAIN,2);
	    	spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	    	Write_ADE7758(CVRMSGAIN,2);  
	       }    
	    if (ii==0)
	       {
	       	ii |= Select_Blank(APCFDEN_ADDR,2);
	       	apcfden_buf = (i2c_buf[0]<<8) + i2c_buf[1];
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(APCFDEN,2); 
	       }
	    if (ii==0)
	       {
	        ii |= Select_Blank(WG_ADDR,6);
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AWG,2);
	    	spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	    	Write_ADE7758(BWG,2);
	    	spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	    	Write_ADE7758(CWG,2);
	       }	      
	    if (ii==0)
	       {
	        ii |= Select_Blank(PHCAL_ADDR,3);
	    	spi_buf[0] = i2c_buf[0];
	    	Write_ADE7758(APHCAL,1);
	    	spi_buf[0] = i2c_buf[1];
	   		Write_ADE7758(BPHCAL,1);
	    	spi_buf[0] = i2c_buf[2];
	    	Write_ADE7758(CPHCAL,1); 
	       }    	   
		if (ii==0)
		   {
		    ii |= Select_Blank(WATTOS_ADDR,6);
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AWATTOS,2);
	    	spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	    	Write_ADE7758(BWATTOS,2);
	    	spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	    	Write_ADE7758(CWATTOS,2); 
	       }	    
	    if (ii==0)
	       {
	        ii |= Select_Blank(VARCFDEN_ADDR,2);
	        varcfden_buf = (i2c_buf[0]<<8) + i2c_buf[1];
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(VARCFDEN,2); 
	       }	
	    if (ii==0)
	       {
	        ii |= Select_Blank(VARG_ADDR,6);
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AVARG,2);
	   		spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	    	Write_ADE7758(BVARG,2);
	    	spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	    	Write_ADE7758(CVARG,2);
	       }	   
	    if (ii==0)
	       {
	        ii |= Select_Blank(VAROS_ADDR,6);
	        spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AVAROS,2);
	    	spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	    	Write_ADE7758(BVAROS,2);
	    	spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	    	Write_ADE7758(CVAROS,2); 
	       }	
	    if (ii==0)
	       {
	        ii |= Select_Blank(VAG_ADDR,6);
	    	spi_buf[0] = i2c_buf[0];
	    	spi_buf[1] = i2c_buf[1];
	    	Write_ADE7758(AVAG,2);
	    	spi_buf[0] = i2c_buf[2];
	    	spi_buf[1] = i2c_buf[3];
	    	Write_ADE7758(BVAG,2);
	    	spi_buf[0] = i2c_buf[4];
	    	spi_buf[1] = i2c_buf[5];
	   		Write_ADE7758(CVAG,2); 
	   	   }

	   	//---------------------------------
	   	for (phase=0;phase<3;phase++)
		    {
		     	Read_ADE7758 (phase+0x0D,3);    								 //电压
		       
		    	Read_ADE7758 (phase+0x0A,3);    								 //电流
		    	
		    	Read_ADE7758 (phase+0x01,2);     								//有功电量
		    	
		       	Read_ADE7758 (phase+0x04,2);     								//无功电量
		    	
		       	Read_ADE7758 (phase+0x07,2);     								//视在电量
		    	
		    }
		
            Read_ADE7758 (FREQ,2);												//电网频率
           											
           	Read_ADE7758(TEMP,1);												//当前温度
              
        //---------------------------------
	   	Read_ADE7758(RSTATUS,3);			//Clear all interrupt flags   
	   	
		spi_buf[0] = 0x00;					
		spi_buf[1] = 0x00;					
		spi_buf[2] = 0x00;
		Write_ADE7758(MASK,3);//
		Read_ADE7758(RSTATUS,3);			//Clear all interrupt flags     
}		

/*********************************************************************************************************
** 函数名称: Initial_ADE7758_Noreset
** 功能描述: 初始化ADE7758的参数,但不产生复位信号
**
** INPUT: 
** 
********************************************************************************************************/
void Initial_ADE7758_Noreset (void)
{
	
	    spi_buf[0] = 0x00;					//Enable HPE and LPF;
		Write_ADE7758(OPMODE,1);			//Enable the frequency outputs APCF and VARCF;
								//Put ADE7758 in normal operation mode;
		
		spi_buf[0] = 0x00;				//Disable digital integrator
		Write_ADE7758(GAIN,1);				//Disable PGA gain
		
		spi_buf[0] = 0x00;				//Phase A is used to be the source of the measurement of the voltage line frequency使用过程中根据实际情况更改
		Write_ADE7758(MMODE,1);				//Disable PEAK detection    
		
		spi_buf[0] = 0x00;					//Sample data rate is 26.0ksps
		Write_ADE7758(WAVMODE,1);			//VARCF is set to Var
		
		spi_buf[0] = 0x3C;					//3P4L
		Write_ADE7758(COMPMODE,1);			//Include all three phases in the APCF and VARCF pulse outputs
											//Setting APCF output pin in absolute mode
											//Setting VARCF output pin in the unsigned mode
											//Disable the no_load threshold
		spi_buf[0] = 0xF8;//FREQ NOT PERIOD,DEFAULT 78H;
		Write_ADE7758(LCYCMODE,1);	//All phases are used for counting the number of zero crossing
					        //Read-with-reset for all the WATTHR,VARHR and VAHR register
								
		spi_buf[0] = 40;
		Write_ADE7758(WDIV,1);
		Write_ADE7758(VARDIV,1);
		Write_ADE7758(VADIV,1);
}

/*********************************************************************************************************
** 函数名称: Read_Reg
** 功能描述: 读寄存器值累加,然后平均
**
** INPUT: 
** 
********************************************************************************************************/
uint32 Read_Reg(uint32 reg)
{
	uint32 sum = 0;
	uint32 temp;
	uint32 ii = 128;
		
		Clrwdt();
		Delay_Ms_Stop(100);	
		Clrwdt();
		Read_ADE7758(reg,3);	
		while(ii--) 
		   	{
		   		Delay_Ms_Stop(1);
		   		Read_ADE7758(reg,3);	  
		   		temp = spi_buf[0]*0x10000 + spi_buf[1]*0x100 + spi_buf[2]; 
		   		if (temp>=0x800000)
		   		   {
		   		     temp = (-temp) & 0x7FFFFF;	
		   		     sum -= temp;
		   		   }
		   		  else	sum += temp;
		    }  
		if (sum>=0x80000000)
		   {
		     sum = -sum; 
		     sum >>= 7;
		     sum = -sum;   
		   }  
		  else sum >>= 7;
		  
		return sum;
}

/*********************************************************************************************************
** 函数名称: Save_Reg
** 功能描述: 保存标定修正值
**
** INPUT: 
** 
********************************************************************************************************/
void Save_Reg(uint32 data,uint32 spi_reg,uint32 iic_reg)
{
		spi_buf[0] = data>>8;
		spi_buf[1] = data;
	    Write_ADE7758(spi_reg,2); 	
	    i2c_buf[0] = spi_buf[0];
	    i2c_buf[1] = spi_buf[1];
	    Write_2408(iic_reg,2);	
}

/*********************************************************************************************************
** 函数名称: Read_Period
** 功能描述: 捕获脉冲输出周期。单位为ms
********************************************************************************************************/
uint32 Read_Period (uint32 type,uint32 num)
{
	uint32 sum = 0;
	uint32 ii = num;
	
	    Clrwdt();
	    Delay_Ms_Stop(500);	
	    Clrwdt();
	    
		if (type)
		   {
		      T1CCR = 0x30;			
		      T1IR	= 0x20;						 //clear CR0 interrupt flag
		      
		      T1TCR = 0x03;
			  T1TCR	= 0x01;						 //start TIME1
			  Clrwdt();
			  while(!(T1IR & 0x20));			
			  T1IR  = 0x20;						//clear CR0 interrupt flag
			  
			  T1TCR = 0x03;
			  T1TCR	= 0x01;						 //start TIME1
			  Clrwdt();
			  while(!(T1IR & 0x20));			
			  T1IR  = 0x20;						//clear CR0 interrupt flag
			  
			  while(ii--)
			     {
			  		T1TCR = 0x03;
			  		T1MR0 = 0xFFFFFFFF;      
			  		T1TCR = 0x01;
			  		Clrwdt();
			  		while(!(T1IR & 0x20));
			  		T1IR  = 0x20;					//clear CR0 interrupt flag
			  		sum += T1CR1;
			  	 }
		   }   
		  else
		   {
		   	  T1CCR = 0x06;	
		      T1IR	= 0x10;						//clear CR0 interrupt flag
		      
		      T1TCR = 0x03;
			  T1TCR	= 0x01;					 	//start TIME1
			  Clrwdt();
			  while(!(T1IR & 0x10));			
			  T1IR  = 0x10;						//clear CR0 interrupt flag
			  
			  T1TCR = 0x03;
			  T1TCR = 0x01;
			  Clrwdt();
			  while(!(T1IR & 0x10));			
			  T1IR  = 0x10;						//clear CR0 interrupt flag
			  while(ii--)
			     {
			  		T1TCR = 0x03;
			  		T1MR0 = 0xFFFFFFFF;      
			  		T1TCR = 0x01;
			  		Clrwdt();
			  		while(!(T1IR & 0x10));
			  		T1IR  = 0x10;					//clear CR0 interrupt flag
			  		sum += T1CR0;
			  	 }

⌨️ 快捷键说明

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