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

📄 ade7758_dx.c.svn-base

📁 一个基于UCOS/2操作系统开发的实际产品(电力负控)的代码
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
		   } 
		return sum/num;
}

/*********************************************************************************************************
** 函数名称: Select_Blank
** 功能描述: 在三组校表数据中选择正确的数据
**
** INPUT: 
** OUTPUT: 
********************************************************************************************************/
uint32 Select_Blank (uint32 addr,uint32 num)
{
	uint8 bak1[16],bak2[16];
	uint32 ii = 0;
	uint32 retdata = 0;
	
		Read_2408(addr+BANK1,num);
		memcpy(bak1,i2c_buf,num);
		Read_2408(addr+BANK2,num);
		memcpy(bak2,i2c_buf,num);
		Read_2408(addr,num);
		
        if (memcmp(bak1,bak2,num) OR memcmp(bak1,i2c_buf,num) OR memcmp(bak2,i2c_buf,num))
           {
           		if (memcmp(bak1,bak2,num))    ii += 1;
           		if (memcmp(bak1,i2c_buf,num)) ii += 2;
           		if (memcmp(bak2,i2c_buf,num)) ii += 4;
           		switch (ii)
           		  {
           		  	 case 0:
           		  	 case 1:
           		  	 case 2:
           		  	 case 4:      
           		  	      break;
           		  	 case 3:
           		  	 case 5:
           		  	      break;  
           		  	 case 6:
           		  	      memcpy(i2c_buf,bak1,num);
           		  	      break;
           		  	 case 7:
           		  	      retdata = 0xEE; 
           		  	      break;
           		  	 default:break;          	                 	       
           		  }
           }
        return retdata;   
}

/*********************************************************************************************************
** 函数名称: Read_Now_Data
** 功能描述: 读ADE7758内的实时数据
**
** INPUT: 
** OUTPUT: now_data[]
********************************************************************************************************/
void Read_Now_Data(void)
{
	uint32 phase;
	fp64   ww;
	uint64 ii;
	uint32 voltage,current[4],power[3];  

	uint32 bianbi;			   			
	uint32 xiangxian;  		   			
	fp64   watt,va;	
	uint16 temp_75;	   			
	
static uint8 mmode;	
uint8 vartest[3];  

uint32 mean_factor;
uint32 num;
uint8 calculate_F_flag;

              	vartest[0]=0x00;
         	vartest[1]=0x00;
         	vartest[2]=0x00;
         	comvar_buf[0]=0x00;
         	comvar_buf[1]=0x00;
         	comvar_buf[2]=0x00;
          
     //----------------------------------------          
        bianbi = prog_data[I_BIANBI]*0x100 + prog_data[I_BIANBI+1];
        //bianbi = 1;
        if (bianbi>10000) bianbi = 1;
       
        if ((apcfden_buf<0x100) OR (apcfden_buf>0xFFF))
           { 
        		ii = Select_Blank(APCFDEN_ADDR,2);
        		if (ii==0) apcfden_buf = (i2c_buf[0]<<8) + i2c_buf[1];
        		      else apcfden_buf = 0x1000; 
	       }	
        
        if ((varcfden_buf<0x100) OR (varcfden_buf>0xFFF))
           {
        		ii = Select_Blank(VARCFDEN_ADDR,2);
        		if (ii==0) varcfden_buf = (i2c_buf[0]<<8) + i2c_buf[1];
        		      else varcfden_buf = 0x1000;
           }
    //-----------------------------------------           		
		for (phase=0;phase<3;phase++)
		    {
		     	calculate_F_flag=1;///
		     	Read_ADE7758 (phase+0x0D,3);    			//电压
		        ii = spi_buf[0]*0x10000 + spi_buf[1]*0x100 + spi_buf[2];
		        if (ii>=0x800000) ii = -ii;		    
		        ww = ii & 0xFFFFFF;
		        ww = (220*ww*10000)/Voltage_AD_Ref;	
		        ii = ww;
		        vol[phase] = ii;
		        if(ii>3000000) ii=2200000;	
		        voltage = ii;
		        Write_Array(ad_data+phase*33,ii,4); ///0x010800=264.00V
		        if(Array_BCDtoHEX(ad_data+phase*33,3)>vol_high_limit)//电压越上极限
		        {
		        	//comvar_buf[0]=bitset(comvar_buf[0],phase,1);
		        	vartest[0]=bitset(vartest[0],phase,1);
		        	comvar_buf[0]=vartest[0];
		        }
		        else if(Array_BCDtoHEX(ad_data+phase*33,3)>vol_high)//电压越上限
		        {
		        	//comvar_buf[0]=bitset(comvar_buf[0],phase+4,1);
		        	vartest[0]=bitset(vartest[0],phase+4,1);
		        	comvar_buf[0]=vartest[0];
		        }
		        else if(Array_BCDtoHEX(ad_data+phase*33,3)<vol_low_limit)//电压越下极限
		        {
		        	//comvar_buf[1]=bitset(comvar_buf[1],phase,1);
		        	vartest[1]=bitset(vartest[1],phase,1);
		        	vartest[1]=bitset(vartest[1],phase,1);
		        	comvar_buf[1]=vartest[1];
		        }
		        /*end*/
		       
		  //---------------
		    	Read_ADE7758 (phase+0x0A,3);    //电流
		    	ii = spi_buf[0]*0x10000 + spi_buf[1]*0x100 + spi_buf[2];
		    	if (ii>=0x800000) ii = -ii;
		        ww = ii & 0xFFFFFF;
		        if(state_ade7758 & 0x020000)
		        {
		            ww=0;	
		        }
		        ww = bianbi*(15*ww*1000)/Current_AD_Ref;	
		        ii = ww;
		        if(ii<1350) calculate_F_flag=0;// 9%Ib
		        if(ii>65000*(bianbi)) ii=60000*bianbi;//电流上限制
		        current[phase] = ii;
		        Write_Array(ad_data+phase*33+4,ii,4);
		 //------------- 
		       num = (prog_data[I_LOW_LIMIT]*0x100 + prog_data[I_LOW_LIMIT+1]) * 100;
		       if (num > Array_BCDtoHEX(ad_data+phase*33+4,3)) 
		       {
			      
				vartest[1]=bitset(vartest[1],phase+4,1);
		        	vartest[1]=bitset(vartest[1],phase+4,1);
		        	comvar_buf[1]=vartest[1];
		       }					
		        
		 //--------------- 
		      
		    	Read_ADE7758 (phase+0x01,2);    //有功电量
		    	ii = spi_buf[0]*0x100 + spi_buf[1];
		    	xiangxian = 0;
		    	if (ii>=0x8000)
		    	   {ii = -ii; xiangxian = 1;}	
		    	
		    	ww = ii & 0xFFFF; 
		    	ww = bianbi*ww*((POWER_DIV*(1000))/(4*APCF_CONST*(fp64)apcfden_buf))/10;			
		    	
		    	watt = ww;		          
		    	if ((float_dl[phase][0]>=1) OR (float_dl[phase][0]<0)) float_dl[phase][0] = 0;
		    		    	
		    	ww += float_dl[phase][0];
		    	ii = ww;
		    	float_dl[phase][0] = ww - ii;
		    	Write_Array(ad_data+phase*33+23,ii,3);
				    	
		 //---------------      	
		       	Read_ADE7758 (phase+0x04,2);     		//无功电量
		    	ii = spi_buf[0]*0x100 + spi_buf[1];
		    	if (ii>=0x8000)			
		    	   {
		    	      ii = -ii;
		    	      if (xiangxian==0) ad_data[phase*33+32] = 4;
		    	      			   else ad_data[phase*33+32] = 3;
		    	   }
		    	 else 
		    	   {
		    	      if (xiangxian==0) ad_data[phase*33+32] = 1;
		    	      			   else ad_data[phase*33+32] = 2;
		    	   }
		       	ww = ii & 0xFFFF; 		       
		    	ww = bianbi*ww*((POWER_DIV*(1000))/(4*VARCF_CONST*(fp32)varcfden_buf))/10;		
		    	if ((float_dl[phase][1]>=1) OR (float_dl[phase][1]<0)) float_dl[phase][1] = 0;
		    	ww += float_dl[phase][1];
		    	ii = ww;
		    	float_dl[phase][1] = ww - ii;
		    	Write_Array(ad_data+phase*33+26,ii,3);
		    			    	
		 //---------------      	
		       	Read_ADE7758 (phase+0x07,2);     	//视在电量
		    	ii = spi_buf[0]*0x100 + spi_buf[1];
		    	ww = ii; 
		    	ww = bianbi*ww*((POWER_DIV*(1000))/(4*VARCF_CONST*(fp32)varcfden_buf))/10;				
		    	va = ww;		         
		    	if ((float_dl[phase][2]>=1) OR (float_dl[phase][2]<0)) float_dl[phase][2] = 0;
		    	ww += float_dl[phase][2];
		    	ii = ww;
		    	float_dl[phase][2] = ww - ii;
		    	Write_Array(ad_data+phase*33+29,ii,3);
		    	
		//-----------------
				if (va<1E-30) {watt = 0; va = 1;}
				
		        if (watt>va) watt = va;
		        ww = watt*10000/va;		//功率因数
		        
		        ii = ww;
		        if(ii==10000) ii=9999;
		        if(calculate_F_flag==0) ii=0;
		        Write_Array(ad_data+phase*33+8,ii,3);
		        if(ii<power_low)///var is bigger than low_limit
		        {
		            	//comvar_buf[1]=(comvar_buf[1])|(bitset(comvar_buf[1],(4+phase),1));
		            	vartest[2]=bitset(vartest[2],(4+phase),1);
		            	comvar_buf[2]=vartest[2];
		        }
		        else if(ii>power_high)
		        {
		            	//comvar_buf[1]=(comvar_buf[1])|(bitset(comvar_buf[1],(4+phase),1));
		            	vartest[2]=bitset(vartest[2],phase,1);
		            	comvar_buf[2]=vartest[2];
		        }
		        	
		//-----------------
				ww = current[phase];			//视在功率
				ww *= voltage;       	
		       	ww /= 10000*1000; 		
		       	ii = ww;//4173
		       	Write_Array(ad_data+phase*33+19,ii,4);
		       	
		//-----------------       	
		    	watt = ww*(watt/va);			//有功功率      	
		       	ii = watt;
		       	active_power[phase]=ii;
		       	Write_Array(ad_data+phase*33+11,ii,4);
		       	
		//------------------
		    	va = sqrt(fabs(ww*ww-watt*watt));//无功功率
		    	ii = va;
		    	reactive_power[phase]=ii;
		    	Write_Array(ad_data+phase*33+15,ii,4);
		    }//phase
		//------------------			//N 线电流			
		    ww  = fabs((fp32)current[0]-(fp32)current[1]) * fabs((fp32)current[0]-(fp32)current[1]);
		    ww += fabs((fp32)current[2]-(fp32)current[1]) * fabs((fp32)current[2]-(fp32)current[1]);
		    ww += fabs((fp32)current[0]-(fp32)current[2]) * fabs((fp32)current[0]-(fp32)current[2]);
		    ww = sqrt(ww/2);
            ii = ww;
            current[3] = ii;
            Write_Array(ad_data+99,ii,4);
        //-----------------
            Read_ADE7758 (FREQ,2);	//电网频率
            ii = (spi_buf[0]&0x0F)*0x100 + spi_buf[1];
            if (ii == 0) ii = 1;
            ii = 1000000000/(ii*96);
            //if ((ii<4500) OR (ii>5500)) 
            if ((ii<4500) OR (ii>7500)) 
               {
                  if (++mmode>3) mmode = 0;
                  spi_buf[0] = mmode;
           		  Write_ADE7758(MMODE,1);    
                  ///ii = 1000000000/5000/96;
                  ii = 1000000000/2083/96;///5000Hz
               }
            Write_Array(ad_data+103,ii,2);
       //-----------------			//总有功功率
            memset(ad_data+108,0,4); 
            for(phase=0;phase<3;phase++) Array_Add_BCD(ad_data+108,ad_data+phase*33+11,4);         
       //-----------------		//总无功功率
            memset(ad_data+112,0,4); 
            for(phase=0;phase<3;phase++) Array_Add_BCD(ad_data+112,ad_data+phase*33+15,4);    
       //-----------------			//总视在功率
            memset(ad_data+116,0,4); 
            for(phase=0;phase<3;phase++) Array_Add_BCD(ad_data+116,ad_data+phase*33+19,4); 
       //-----------------			//总功率因数
            ww = Array_BCDtoHEX(ad_data+108,4);
            ii = Array_BCDtoHEX(ad_data+116,4);
            if (ii == 0) ii = 1;
            ww = ww*10000/ii;
            ii = ww;  
            if(ii>=10000) ii=9999;
            mean_factor=ii;//9000
            
            Write_Array(ad_data+105,ii,3); 
       //-----------------				//三相电流不平衡率
            ww = (current[0]+current[1]+current[2])*3;
            if (ww < 1E-30) ww = 1;
            ww = current[3]*10000/ww;
            ii = ww;
            Write_Array(ad_data+122,ii,2);
       //----------------			//当前温度
            Read_tcn75(TEMP75,2);
            ad_data[121] = i2c_buf[0]<<1;///1B 80=27.5 degree
            ad_data[121]+= i2c_buf[1]>>7;
            temp_75 = ad_data[121]/2*100;///2750
            ad_data[121] = (uint16)(temp_75)%100;
            ad_data[120] = (uint16)(temp_75)/100;       
        
      //-------------------
            ii = (vol[0]>vol[1]) ? vol[0]:vol[1];		//三相电压不平衡率
            ii = (ii>vol[2]) ? ii:vol[2];
            ww = ii;
            ii = (vol[0]<vol[1]) ? vol[0]:vol[1];
            ii = (ii<vol[2]) ? ii:vol[2];
            ww = (ww-ii)*10000/ww;
            ii = ww;
            if (ii>=10000) ii = 9999;							
            Write_Array(ad_data+124,ii,2);
      //-------------------
      		ii = ad_data[32];///quadrant of phase A b c													
      		if (ad_data[65]==ad_data[98]) ii = ad_data[65];
      		state_buf[0] &= 0xCE;///11001110
      		 //comvar_buf[0] &= 0x7F;//无功感性
      		switch (ii)
      		    {
      		    	case 1:
      		    		 break;
      		    	case 2:
      		    	     state_buf[0] |= 0x11;///容性 反有功
      		    	     //comvar_buf[0] |= 0x80;//无功容性
      		    		 break;
      		    	case 3:
      		    		 state_buf[0] |= 0x30;///反无功 反有功
      		    		 break;
      		    	case 4:
      		    	     state_buf[0] |= 0x21;///容性 反无功
      		    	      //comvar_buf[0] |= 0x80;//无功容性
      		    		 break;
      		    	default:break;	 	 	 	 
      		    }
      //-------------------
            new_power_flag = TRUE;         
}

/*********************************************************************************************************
** 函数名称: Adjust_ADE7758_Key
** 功能描述: 调整ADE7758的参数,达到校表的目的,用按键的方式校表
**
** INPUT: 
** 
********************************************************************************************************/
void Adjust_ADE7758_Key (void)
{
	
	uint32 phase;
	uint32 reg1,reg2;
	uint32 temp;
	
	fp32   ww;
	//--------------------
			
		spi_buf[0] = 0x40;					//software reset
		Write_ADE7758(OPMODE,1);
		Delay_Ms_Stop(1);
		
		spi_buf[0] = 0x00;					//Enable HPE and LPF;
		Write_ADE7758(OPMODE,1);			//Enable the frequency outputs APCF and VARCF;
		Delay_Ms_Stop(1);					//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
		
		//---------------
		i2c_buf[0] = 0xAA;
		i2c_buf[1] = 0xAA;
		Write_2408(FINISH_FLAG_ADDR,2);		//写校表开始标志
		
		Lcd_On(0);									
 /**************
       **名称: 标定电流
 	   **第一步:去除偏移 
	   **		测试条件:三相电压200V;三相电流0A;三相功率因数1.0
	   **第二步:调整增益
	   ** 		测试条件:三相电压200V;三相电流1.5A;三相功率因数1.0
****************/
//------------------
//理论显示 0.00000A
//------------------
       Beep(1000);
  
       Xiao_Biao11();
      
   				//显示电流 1步

	   while(key_z != KEY4) {;Process_PCF8574(); 

⌨️ 快捷键说明

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