📄 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 + -