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

📄 freescale

📁 Freescale 系列单片机常用模块与综合系统设计
💻
字号:
#include  "PE_Types.h"
#include  "CS5460A.h"
#include  "Master_SPI.h"
#include  "LCD128_64.h"
#include  "delay.h"


//--------全局变量定义-------------------------------------
byte  buf[5];
word  cnt;
dword CurrentRMS,VoltRMS,POWER,ENERGY, COS;

//--------------函数声明----------------------------------------

void Write_CS5460A(byte  *ptr,word n) 
{
  Master_SPI_SendBlock(ptr, n, &cnt); 
}

void Read_CS5460A(byte reg, byte *ptr) 
{
    *ptr=reg;  
    Write_CS5460A(ptr,1);
    Master_SPI_RecvBlock(ptr,0x03,&cnt);  
}

void Clear_DRDY(void) 
{
    buf[0]=0x5e; 
    buf[1]=0xff; 
    buf[2]=0xff; 
    buf[3]=0xff;  
    Write_CS5460A(buf, 4); 
}

void Wait_DRDY_High(void) 
{  
    while(1) 
    {  
        Read_CS5460A(0x1e,buf);   
        Write_CS5460A(buf, 5);
        if( (buf[1]&0x80) != 0 ) break;   
    } 
}

//------------5460初始化-----------------------
void Init5460(void)
{
    delay_nms(5);      
    buf[0]=0xff;            //SYNC1 
    buf[1]=0xff;            //SYNC1 
    buf[2]=0xff;            //SYNC1 
    buf[3]=0xfe;            //SYNC0 
    Write_CS5460A(buf,4);   // 3 1 1 0 
    
    buf[0]=0x40;         
    buf[1]=0x00;            //GI=1  
    buf[2]=0x10;          
    buf[3]=0x61;            //DCLK=MCLK/1,高通     
    Write_CS5460A(buf,4);   //写配置寄存器    
   /**************************************************/
    buf[0]=WRITE|0x20;         
    buf[1]=0x3D;          
    buf[2]=0xC2; 
    buf[3]=0x5C;           
    Write_CS5460A(buf,4);   //电流 交流偏置 校准寄存器
  
    buf[0]=WRITE|0x22;         
    buf[1]=0x1F;        
    buf[2]=0xBB; 
    buf[3]=0x65;               
    Write_CS5460A(buf,4);   //电压 交流偏置 校准寄存器
   /***************************/

    buf[0]=WRITE|0x04;         
    buf[1]=0x29;          
    buf[2]=0x71; 
    buf[3]=0xCA;           
    Write_CS5460A(buf,4);     //电流增益校准寄存器**

    buf[0]=WRITE|0x08;         
    buf[1]=0x40;            
    buf[2]=0x96; 
    buf[3]=0xD3;               
    Write_CS5460A(buf,4);     //电压增益校准寄存器**

    buf[0]=0x5e;          
    buf[1]=0xF0; 
    buf[2]=0x00; 
    buf[3]=0x00; 
   Write_CS5460A(buf,4);  //清除状态寄存器
 
    buf[0]=0x74;                 
    buf[1]=0x80; //DRDY
    buf[2]=0x00; 
    buf[3]=0x00; 
    Write_CS5460A(buf,4);   //写中断屏蔽寄存器   
    
    buf[0]=0x78;
    buf[1]=0x00;
    buf[2]=0x00;
    buf[3]=0x00;                 //缺省值
    Write_CS5460A(buf,4); //写控制寄存器

    buf[0]=0x4c;
    buf[1]=0x00;
    buf[2]=0x34;
    buf[3]=0x9C;
    Write_CS5460A(buf,4); //写EOUT 脉冲输出寄存器
    
    buf[0]=0x4A;
    buf[1]=0x00;
    buf[2]=0x01;                 //每秒钟计算20 次,N=400 
    buf[3]=0x90;
    Write_CS5460A(buf,4); //写CYCLE COUNT 寄存器
	

    Read_CS5460A(0x1e,buf); //读状态寄存器
    buf[0]=0X5E;
    Write_CS5460A(buf,4);   //写状态寄存器
	
    buf[0]=0xe8;
    Write_CS5460A(buf,4);   //启动CS5460A
   
  /*--------校准过程----------------------------
  ---清除DTDY,发送Power_halt 命令*/
    Clear_DRDY() ;

    Wait_DRDY_High() ;
    Clear_DRDY();
    
    buf[0]=0xa0;
    Write_CS5460A(buf,1); //发送POWER_HALT 命令
    
	/*===========================================
	第一阶段:交流偏置校准,方法:将电流电压输入短接,
	读偏置寄存器。
	---------------------------------------------------------------------------------*/
    //电流  交流偏置校准:
    Clear_DRDY();
    
    buf[0]=0xcd ;
    Write_CS5460A(buf,1); //写校准命令寄存器
    Wait_DRDY_High();     //等待校准完成
    
	Read_CS5460A(0x20,buf); //读Iacoff 寄存器
	SetRowCol(1,0);                //第一行第一列
	disp_ch(buf[0]);
   SetRowCol(1,24);                
	disp_ch(buf[1]);
	SetRowCol(1,48);                
	disp_ch(buf[2]);
   SetRowCol(1,72);                
	disp_ch(buf[3]);
    
    //电压  交流偏置校准:
    Clear_DRDY();
    
    buf[0]=0xd5 ;
    Write_CS5460A(buf,1); //写校准命令寄存器    
    Wait_DRDY_High();     //等待校准完成
    
	Read_CS5460A(0x22,buf); //读电压偏置寄存器
	SetRowCol(2,0);                //第一行第一列
	disp_ch(buf[0]);
   SetRowCol(2,24);                
	disp_ch(buf[1]);
	SetRowCol(2,48);                
	disp_ch(buf[2]);
   SetRowCol(2,72);                
	disp_ch(buf[3]);
  
 /*====================================================
 第二阶段:校准交流增益寄存器。方法:将电压和电流输入加
 至满幅,读取增益寄存器的值。
 -----------------------------------------------------*/
   //电流  交流增益校准:
   Clear_DRDY();
   buf[0]=0xce;
   Write_CS5460A(buf,1); //写校准命令寄器
   Wait_DRDY_High(); //等待校准完成
   
   Read_CS5460A(0x04,buf); 
   	SetRowCol(1,0);                //第一行第一列
	disp_ch(buf[0]);
   SetRowCol(1,24);                
	disp_ch(buf[1]);
	SetRowCol(1,48);                
	disp_ch(buf[2]);
   SetRowCol(1,72);                
	disp_ch(buf[3]);
	
   //电压  交流增益校准
   Clear_DRDY();
   buf[0]=0xd6;
   Write_CS5460A(buf,1);; //写校准命令寄器
   Wait_DRDY_High(); //等待校准完成
   
   Read_CS5460A(0x08,buf); 
   	SetRowCol(2,0);                //第一行第一列
	disp_ch(buf[0]);
   SetRowCol(2,24);                
	disp_ch(buf[1]);
	SetRowCol(2,48);                
	disp_ch(buf[2]);
   SetRowCol(2,72);                
	disp_ch(buf[3]);
}

/*-------------------------------------------------------------------------
功能:读交流电压寄存器,并对数据进行处理和校准,返
回交流电压有效值。需根据实际测量范围调整。
---------------------------------------------------------------------------*/
dword  CS5460_GetVoltRMS(void)
{
   byte i,j;
	dword G=1,temp=0;
    Read_CS5460A(READ|LAST_VOLT_RMS,buf);
    for(i=1;i<=3;i++)
    {
        for(j=7; j>=0; j--)
        {
            if( (buf[i] & (1<<j)) != 0 )
                temp+=G;
            G = G/2;
        }
    }
	//软件校准
    VoltRMS = 20*temp*5/3; 
	VoltRMS = (VoltRMS*1542*9864+3320000) / 50000;
	return VoltRMS;
}
	
/*--------------------------------------------------------------------------------
功能:读交流电流寄存器,并对数据进行处理和校准,返
回交流电流有效值。需根据实际测量范围调整。
-----------------------------------------------------------------------------------*/
dword CS5460_GetCurrentRMS(void)
{
   byte i, j;
	dword G=1,temp=0;	
	Read_CS5460A(READ|LAST_CURRENT_RMS,buf);
    for(i=1;i<=3;i++)
    {
        for(j=7;j>=0;j--)
        {
            if( (buf[i]&(1<<j)) != 0 )
                temp+=G;
            G = G/2;
        }
    }
	//软件校准
    CurrentRMS =78*temp*5/30 ;
	CurrentRMS = (55203*CurrentRMS+873) / 20000;

	return CurrentRMS;
}



//-----------软件滤波函数----------------------------------------------
word filter(byte CS)
{
   byte count,i,j;
   dword value_buf[N],temp;
   word  sum=0;
   for  (count=0;count<N;count++)
   {
		if(CS==CS_VRMS)
			value_buf[count] = CS5460_GetVoltRMS();
		else 
			value_buf[count] = CS5460_GetCurrentRMS();
   }
   for (j=0;j<N-1;j++)
   {
      for (i=0;i<N-j-1;i++)
      {
         if ( value_buf[i]>value_buf[i+1] )
         {
            temp = value_buf[i];
            value_buf[i] = value_buf[i+1]; 
            value_buf[i+1] = temp;
         }
      }
   }
   for(count=4;count<N-4;count++)
      sum += value_buf[count];
   return (sum/(N-8));
}

⌨️ 快捷键说明

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