用CS5460A测量三相交流电流
CS5460的资料只要百度下就能出来一大堆,介绍怎样与MCU连接,怎样读取有效值等,应有尽有,刚好我用CS5460A来做了个项目,是用来测量四线三相制中三相电流值的。来这里分享下:
首先说下项目要求:
用于三相四线制供电线路中,用来检测显示供电线路A,B,C三相中的正常电流和特波电流。
当A,B,C三相中任意一相满足以下突变条件时,继电器执行相应的动作;
当线路中有正常电流值,不论电流大小,继电器不动作;
当线路突变电流值在2A[可设置]以上,然后回落,再上升,再回落,连续4次回到原值且时间在2S内,继电器吸合0.1S[可设置]再释放(断开);
当线路有突变电流,不论电流值大小,只要次数不是4次和时间不在2S内回到原值,继电器不动作。
1.CS5460A与MCU的接口电路,MCU我用的是STC89C52RC,一直用STC的单片机来做开发,其一个主要的原因的编程比较简单,虽然不支持仿真,却是我的最爱。
为了测量三相的电流,用了三片CS5460A,但实际上我们只需要两片就可以实现四路电流的测量,因为电流和电压通道都是电压型A/D,如果将它们的增益设置也一样,测量的时候是无差别的。
2。测量值显示电路,用了三只四位的共阴数码管,用MAX7219来驱动,MAX7219的硬件及软件都比较简单,网上有很多资料及源程序,但是要注意一点,MAX7219只能直接驱动共阴的数码管,如果您想要用共阳的话,势必是需要增加硬件成本的,这里就不在过多说了。
最后附我的源程序:
1.1 main.c
/*************************************************************************************************
时间:2012年1月15日
作者:王凯
说明:
1.基于CS5460A的三相流电流值的检测(测量),当发生电流突变时发出报警;
2.硬件,ST89C52RC,AT24C02,CS5460A,共阴数码管,MAX7219
**************************************************************************************************/
#include <reg52.h>
#include <math.h>
#include <Float.h>
#include <intrins.h>
#include <Max7219.h>
#include <AT24C08.h>
#include <CS5460A.H>
#include <Program2.h>
/**********************主函数*******************************/
void main()
{
//-------------------------------------外部设备IC初始化------------------------------------------------
unsigned char k,temp; //循环时的变量
InitialMax7219(1); //MAX7219初始化
InitialMax7219(2);
SysInsatll(); //系统(中断及IO口)初始化
x24c08_init(); //24c08初始化子程序
//-------------------------------------上电对显示设备进行自检-------------------------------------------
for(k=0;k<12;k++) //显示8.8.8.8.8.8.8.8.8.8.8.8.
{
DisDat[k]=8;
Dot[k]=1;
}
temp=0x08; //LED灯循环点亮
for(k=0;k<4;k++)
{
DisDat[12]=temp<<k;
Del10ms(2);
}
//------------------------------------变量初始化------------------------------------------------------
ReadPar(); //读取设定的参数
DisDat[12]=0x40;
KeyTemp=0;
JDFlag=0x00;
CS5460A=1;
CS5460B=1;
CS5460C=1;
//初始化CS5460并启动A/D转换
Re5460ABC=0; //发复位脉冲,并持续10ms以上
Del10ms(2);
Re5460ABC=1;
Reset5460(); //校准寄存器
Reset5460(); //校准寄存器
Start5460();
ClearPar();
// DisDat[12]=0x40;
//================主循环===================================
while(1)
{
_nop_();
if(KeyTemp) //有按键则不执行除显示程序及中断外的其他任务
{
KeyReader();
}
else //没有按键
{
if(SetFlag) //在设置状态(不读取5460的值,第1位LED显示P,第2位显示步骤号,第3位、第8位到第12位LED都不显示)
{
DisDat[1]=16;
DisDat[2]=SETNUM;
DisDat[3]=17;
for(k=8;k<12;k++)
DisDat[k]=17;
EX0=0;
}
else if(DatReady) //没有在设置状态且有新的数据产生时刷新显示数据
{
DataOper(); //读取电流有效值(变比为1),读出的值存在CTVA,CTVB,CTVC中,单位是mA
Operating(); //数据计算(突变检测),输入参数为CTVA,CTVB,CTVC
DisDatDo(CTVA,0); //计算处理显示数据及真实值计算(x上变比)
DisDatDo(CTVB,4);
DisDatDo(CTVC,8);
DatReady = 0;
EX0 = 1; //开外部中断0,继续接收A/D数据
TongBu();
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
}
}
}
}
/**********************定时中断0服务子程序[用于显示控制及10ms计时]*******************************/
//1.可以通过设置Time门限控制LED数码管闪烁位的频率;
void DisPlayTimeInt0(void) interrupt 1 //计时,精确到10ms
{
bit EX_0;
EX_0=EX0;
EX0=0;
if(DisFlag==DIGNUM) //闪烁控制
{
Time++;
}
if(Time>=6)
Time=0;
if(SetFlag) //超时计数(设置时如果30s内没有动作则直接退出)
if(TimeOut++>3000)
{
SetFlag=0;
DisFlag=0;
SETNUM=0;
ReadPar(); //读取参数设定值
ClearPar();
EX_0=1;
DatReady=1;
}
if(TimeFlag) //进入预控制状态
{
TimeTempA1++; //计周期时间
}
TH0=0xd8;
TL0=0xf0;;
TF0=0;
DisPlay(); //显示子程序
EX0=EX_0;
}
/**********************外部中断1服务子程序[用于键盘扫描]*******************************/
//用于按键扫描,键值存在KeyTemp中
void KeyScan(void) interrupt 2
{
EX1=0;
KeyPort=KeyPort|0x0f; //低四位变高,高四不管他;
KeyCtrl=0;
_nop_();
KeyTemp=KeyPort; //取低四位到temp;
KeyTemp=KeyTemp^0xff; //取出有效的键值
while((KeyPort&0x0f)!=0x0f);//等待按键释放
TimeOut=0; //超时计数器清0
IE1=0;
}
/**********************外部中断0服务子程序[读测量值]*******************************/
void Int0Int(void) interrupt 0
{
DatReady=1;
EX0=0;
}
1.2 CS5460A.H------------CS5460A读写函数
#define ZerVer 2000 //校0密码
#define FulVer 2005 //5A校满度密码
#define ClrRam 3000 //清RAM除
#define DatCTV 100 //回落的误差值
#define GatN 10 //最小可识别电流值
#define SenCTV 6 //不识别区
#define LEDNUM 13 //总的LED数码管数量
sfr KeyPort=0x90; //键盘接口
sbit KeyCtrl=P3^3; //键盘控制接口
unsigned char xdata DIGNUM=1; //当前被点亮的数码管编号
unsigned char idata Time=0; //用于控制数码管闪烁频率的(设置时才用的)
unsigned char xdata DisFlag=0; //闪烁位号(从1开始,最大为12--12位LED),为0时表示不闪烁
unsigned char xdata DisDat[13]; //={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x01,0x02,0x78};
//显示用的数组,最后一个是用于驱动发光二极管的
//DisDat[12]=0x78时灯全亮,DisDat[12].6->D111,,DisDat[12].5->D112,,DisDat[12].4->D113,,DisDat[12].3->D114,
unsigned char xdata Dot[12]; //用于表示当前的LED是否要显示小数点,0时不显示,1时显示小数点
bit SetFlag=0; //设置状态标志,1时表在设置状态,0时没在设置状态
unsigned char xdata SETNUM=0; //参数设置编号 0--6,同时也用于参数存储
bit DatReady = 0; //1时说明A/D转换完成
long int idata CTVA,CTVB,CTVC; //电流有效值
unsigned char xdata KeyTemp; //按键扫描中间变量(0表示没有按键按下,1表示UP,2表示DOWN,4表示MOVE,8表示ENTER)
unsigned long int xdata CTRate,CTGate,CTTimeH,CTTimeL,JDTime; //电流变比,电流门限,突变持续时间,突变回落时间,继电器闭合时间
unsigned char xdata JDFlag; //继电器预输出状态变量,低三位有效,1表示进入预输出状态,0表示没有
//unsigned char TimeCounterA; //用于记录总的突变次数的
unsigned char xdata CounterAH1,CounterAL1,CounterAH2,CounterAL2,CounterAH3,CounterAL3,CounterAH4,CounterAL4; //用于记录突变及回落次数的
bit TimeFlag; //为1时开始突变电流持续时间计时
unsigned long int idata CTValA1,CTValB1,CTValC1,CTVAL,CTVal2; //上一次的电流值(真实值)
unsigned int TimeOut = 0; //超时计算器
//unsigned int idata TimeTempA; //计数(总时间)
unsigned int idata TimeTempA1; //计数(单周期时间)
//1.CS5460A接口定义
sbit CS5460A = P3^4;
sbit CS5460B = P3^5;
sbit CS5460C = P3^6;
sbit SDI5460 = P1^5;
sbit SDO5460 = P1^6;
sbit SCLK5460 = P3^7;
sbit Re5460ABC = P1^7;
sbit JDCtrl = P1^4;
//7.变量定义
//CS5460A寄存器读定义
#define ConfigRd 0 //0x00 //配置寄存器
#define IDCOffsetRd 2 //0x02 //直流电流0点
#define IGainRd 4 //0x04 //电流增益
#define VDCOffsetRd 6 //0x06 //直流电压0点
#define VGainRd 8 //0x08 //电压增益
#define CycleCounterRd 10 //0x0a //记数寄存器
#define PulseRateRd 12 //0x0c //电能脉冲速率寄存器
#define IRd 14 //0x0e //直流电流寄存器
#define VRd 16 //0x10 //直流电压寄存器
#define PowerRd 18 //0x12 //功率寄存器
#define EnergyRd 20 //0x14 //电能寄存器
#define IrmsRd 22 //0x16 //交流电流寄存器
#define VrmsRd 24 //0x18 //交流电压寄存器
#define TimeBaseRd 26 //0x1a //时基寄存器
#define POffsetRd 28 //0x1c //功率0点
#define StatusRd 30 //0x1e //状态寄存器
#define IACOffsetRd 32 //0x20 //交流电流0点
#define VACOffsetRd 34 //0x22 //交流电压0点
#define MaskRd 52 //0x34 //屏蔽寄存器
#define ContrlRd 56 //0x38 //控制寄存器
//CS5460A寄存器写定义
#define ConfigWr 64 //0x40 //配置寄存器
#define IDCOffsetWr 66 //0x42 //直流电流0点
#define IGainWr 68 //0x44 //电流增益
#define VDCOffsetWr 70 //0x46 //直流电压0点
#define VGainWr 72 //0x48 //电压增益
#define CycleCounterWr 74 //0x4a //记数寄存器
#define PulseRateWr 76 //0x4c //电能脉冲速率寄存器
#define IWr 78 //0x4e //直流电流寄存器
#define VWr 80 //0x50 //直流电压寄存器
#define PowerWr 82 //0x52 //功率寄存器
#define EnergyWr 84 //0x54 //电能寄存器
#define IrmsWr 86 //0x56 //交流电流寄存器
#define VrmsWr 88 //0x58 //交流电压寄存器
#define TimeBaseWr 90 //0x5a //时基寄存器
#define POffsetWr 92 //0x5c //功率0点
#define StatusWr 94 //0x5e //状态寄存器
#define IACOffsetWr 96 //0x60 //交流电流0点
#define VACOffsetWr 98 //0x62 //交流电压0点
#define MaskWr 116 //0x74 //屏蔽寄存器
#define ContrlWr 120 //0x78 //控制寄存器
//------------------------------------------------------------------------------
//电流读取值
ulint idata IrmsABC[3];
union //AD值读取值
{
unsigned long int AdWord;
unsigned char AdByte[4];
}data AdDat;
union //存储器读写用
{
unsigned long int RamWord;
unsigned char RamByte[4];
}data RamDat; //普通程序读写5460数据暂存
//------------------------------------------------------------------------------
unsigned char bdata SftDat; //移位字节
sbit SftBit7=SftDat^7; //移位7
sbit SftBit6=SftDat^6;
sbit SftBit5=SftDat^5;
sbit SftBit4=SftDat^4;
sbit SftBit3=SftDat^3;
sbit SftBit2=SftDat^2;
sbit SftBit1=SftDat^1;
sbit SftBit0=SftDat^0; //移位0
unsigned char bdata SftDat1; //移位字节
sbit Sft1Bit7=SftDat1^7; //移位7
sbit Sft1Bit6=SftDat1^6; //移位6
sbit Sft1Bit5=SftDat1^5; //移位5
sbit Sft1Bit4=SftDat1^4; //移位4
sbit Sft1Bit3=SftDat1^3; //移位3
sbit Sft1Bit2=SftDat1^2; //移位2
sbit Sft1Bit1=SftDat1^1; //移位1
sbit Sft1Bit0=SftDat1^0; //移位0
/*******************************************************
CS5460A驱动程序集
*******************************************************/
//读5460,高位在前
void Read5460(void) //读出的数据存在SftDat中
{
uchar kk;
SftDat=0;
SDI5460=1; //低八位
for(kk=0;kk<7;kk++)
{
SCLK5460=1;
_nop_();
SftBit0=SDO5460;//8
SCLK5460=0; //SCK=0到新数据到来的最大时间为50ns
SftDat<<=1;
_nop_();
}
SCLK5460=1;
_nop_();
SftBit0=SDO5460; //8
SCLK5460=0; //SCK=0到新数据到来的最大时间为50ns
_nop_();
}
//写5460 ,先写高位,要写的字节数据放在SftDat中
void Write5460(uchar Dat)
{
uchar kk;
SftDat=Dat;
for(kk=0;kk<8;kk++)
{
SDI5460=SftBit7;//8
_nop_(); //在SCK=1之前,数据建立时间要大于50ns,2008.08.01
SCLK5460=1;
_nop_();
SCLK5460=0;
SftDat<<=1;
_nop_();
}
SDI5460=1;
}
//写5460
void Write5460Int0(uchar RegAddr)
{
uchar kk;
SftDat1=RegAddr;
for(kk=0;kk<8;kk++)
{
SDI5460=Sft1Bit7;//8
_nop_(); //在SCK=1之前,数据建立时间要大于50ns,2008.08.01
SCLK5460=1;
_nop_();
SCLK5460=0;
SftDat1<<=1;
_nop_();
}
SDI5460=1;
}
//专为void WriteRegister(uchar Addr5460,uchar ABC)服务
void WriteRamDat(uchar Addr5460)
{
Write5460(Addr5460);//写地址
Write5460(RamDat.RamByte[1]);//高八位
Write5460(RamDat.RamByte[2]);//中八位
Write5460(RamDat.RamByte[3]);//低八位
}
//写5460寄存器;8,2,1,11分别写A,B,C及ABC
void WriteRegister(uchar Addr5460,uchar ABC)
{
switch(ABC)
{
case 1:
CS5460C=0;
WriteRamDat(Addr5460);
//Write5460(Addr5460);//写地址
//Write5460(RamDat.RamByte[1]);//高八位
//Write5460(RamDat.RamByte[2]);//中八位
//Write5460(RamDat.RamByte[3]);//低八位
CS5460C=1;
break;
case 2:
CS5460B=0;
WriteRamDat(Addr5460);
//Write5460(Addr5460);//写地址
//Write5460(RamDat.RamByte[1]);//高八位
//Write5460(RamDat.RamByte[2]);//中八位
//Write5460(RamDat.RamByte[3]);//低八位
CS5460B=1;
break;
case 3:
CS5460A=0;
WriteRamDat(Addr5460);
//Write5460(Addr5460);//写地址
//Write5460(RamDat.RamByte[1]);//高八位
//Write5460(RamDat.RamByte[2]);//中八位
//Write5460(RamDat.RamByte[3]);//低八位
CS5460A=1;
break;
case 4:
CS5460A=0;
WriteRamDat(Addr5460);
//Write5460(Addr5460);//写地址
//Write5460(RamDat.RamByte[1]);//高八位
//Write5460(RamDat.RamByte[2]);//中八位
//Write5460(RamDat.RamByte[3]);//低八位
CS5460A=1;
CS5460B=0;
WriteRamDat(Addr5460);
//Write5460(Addr5460);//写地址
//Write5460(RamDat.RamByte[1]);//高八位
//Write5460(RamDat.RamByte[2]);//中八位
//Write5460(RamDat.RamByte[3]);//低八位
CS5460B=1;
CS5460C=0;
WriteRamDat(Addr5460);
//Write5460(Addr5460);//写地址
//Write5460(RamDat.RamByte[1]);//高八位
//Write5460(RamDat.RamByte[2]);//中八位
//Write5460(RamDat.RamByte[3]);//低八位
CS5460C=1;
break;
default:
break;
}
}
void TongBu(void)
{
CS5460A=0;
Write5460(0xff);//串口重新初始化
Write5460(0xff);//串口重新初始化
Write5460(0xff);//串口重新初始化
Write5460(0xfe);//串口初始化结束
CS5460A=1;
CS5460B=0;
Write5460(0xff);//串口重新初始化
Write5460(0xff);//串口重新初始化
Write5460(0xff);//串口重新初始化
Write5460(0xfe);//串口初始化结束
CS5460B=1;
CS5460C=0;
Write5460(0xff);//串口重新初始化
Write5460(0xff);//串口重新初始化
Write5460(0xff);//串口重新初始化
Write5460(0xfe);//串口初始化结束
CS5460C=1;
}
//复位5460
void Reset5460(void)
{
RamDat.RamWord=0x84;
WriteRegister(ConfigWr,4);//0x84,软件复位
Del10ms(2);
RamDat.RamWord=800;
WriteRegister(CycleCounterWr,4);//0x7d0,周期记数
//-----------------------------------------------------------------
//-----------------------------------------------------------------
RamDat.RamWord=0x800000;
WriteRegister(MaskWr,4);//0x800000,屏蔽寄存器
//-----------------------------------------------------------------
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
//-----------------------------------------------------------------
//-----------------------------------------------------------------
RamDat.RamByte[1]=x24c08_read(40);
RamDat.RamByte[2]=x24c08_read(41);
RamDat.RamByte[3]=x24c08_read(42);
TongBu();
WriteRegister(IACOffsetWr,3);//A相10倍交流电流0点
RamDat.RamByte[1]=x24c08_read(43);
RamDat.RamByte[2]=x24c08_read(44);
RamDat.RamByte[3]=x24c08_read(45);
TongBu();
WriteRegister(IACOffsetWr,2);//B相10倍交流电流0点
RamDat.RamByte[1]=x24c08_read(46);
RamDat.RamByte[2]=x24c08_read(47);
RamDat.RamByte[3]=x24c08_read(48);
TongBu();
WriteRegister(IACOffsetWr,1);//C相10倍交流电流0点
/*
RamDat.RamByte[1]=x24c08_read(30);
RamDat.RamByte[2]=x24c08_read(31);
RamDat.RamByte[3]=x24c08_read(32);
TongBu();
WriteRegister(IGainWr,3);//A相10倍交流电流增益
RamDat.RamByte[1]=x24c08_read(33);
RamDat.RamByte[2]=x24c08_read(34);
RamDat.RamByte[3]=x24c08_read(35);
TongBu();
WriteRegister(IGainWr,2);//B相10倍交流电流增益
RamDat.RamByte[1]=x24c08_read(36);
RamDat.RamByte[2]=x24c08_read(37);
RamDat.RamByte[3]=x24c08_read(38);
TongBu();
WriteRegister(IGainWr,1);//C相10倍交流电流增益
*/
}
void Start5460(void)
{
TongBu();
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4);//清零状态寄存器
CS5460A=0;
Write5460(0xd8);//正常工作
CS5460A=1;
CS5460B=0;
Write5460(0xd8);//正常工作
CS5460B=1;
CS5460C=0;
Write5460(0xd8);//正常工作
CS5460C=1;
TongBu();
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4);//清零状态寄存器
CS5460A=0;
Write5460(0xe8);//AD开始转换
CS5460A=1;
CS5460B=0;
Write5460(0xe8);//AD开始转换
CS5460B=1;
CS5460C=0;
Write5460(0xe8);//AD开始转换
CS5460C=1;
TongBu();
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4);//清零状态寄存器
}
void Read5460Int0(void)
{
uchar kk;
SftDat1=0;
SDI5460=1; //低八位
for(kk=0;kk<7;kk++)
{
SCLK5460=1;
_nop_();
Sft1Bit0=SDO5460; //8
SCLK5460=0; //SCK=0到新数据到来的最大时间为50ns
SftDat1<<=1;
_nop_();
}
SCLK5460=1;
_nop_();
Sft1Bit0=SDO5460; //8
SCLK5460=0; //SCK=0到新数据到来的最大时间为50ns
}
//-----------------------------------------------------------------
//专为void ReadRegInt0(uchar Addr5460,char ABC)服务
void ReadAdDat(uchar Addr5460)
{
Write5460Int0(Addr5460);
Read5460Int0();
AdDat.AdByte[1]=SftDat1;//高八位
Read5460Int0();
AdDat.AdByte[2]=SftDat1;//中间八位
Read5460Int0();
AdDat.AdByte[3]=SftDat1;//低八位
}
//读5460寄存器Va,Vb,Vc,Ia,Ib,Ic,读直流时判断最高位符号
void ReadRegInt0(uchar Addr5460,char ABC)
{
AdDat.AdByte[0]=0;
/*
switch(ABC)
{
case 1:
CS5460C=0;
break;
case 2:
CS5460B=0;
break;
case 3:
CS5460A=0;
break;
default:
break;
}
Write5460Int0(Addr5460);
Read5460Int0();
AdDat.AdByte[1]=SftDat1;//高八位
Read5460Int0();
AdDat.AdByte[2]=SftDat1;//中间八位
Read5460Int0();
AdDat.AdByte[3]=SftDat1;//低八位
switch(ABC)
{
case 1:
CS5460C=1;
break;
case 2:
CS5460B=1;
break;
case 3:
CS5460A=1;
break;
default:
break;
}
*/
switch(ABC) //这个结构更省程序空间
{
case 1:
CS5460C=0;
ReadAdDat(Addr5460);
/*
Write5460Int0(Addr5460);
Read5460Int0();
AdDat.AdByte[1]=SftDat1;//高八位
Read5460Int0();
AdDat.AdByte[2]=SftDat1;//中间八位
Read5460Int0();
AdDat.AdByte[3]=SftDat1;//低八位
*/
CS5460C=1;
break;
case 2:
CS5460B=0;
ReadAdDat(Addr5460);
/*
Write5460Int0(Addr5460);
Read5460Int0();
AdDat.AdByte[1]=SftDat1;//高八位
Read5460Int0();
AdDat.AdByte[2]=SftDat1;//中间八位
Read5460Int0();
AdDat.AdByte[3]=SftDat1;//低八位
*/
CS5460B=1;
break;
case 3:
CS5460A=0;
ReadAdDat(Addr5460);
/*
Write5460Int0(Addr5460);
Read5460Int0();
AdDat.AdByte[1]=SftDat1;//高八位
Read5460Int0();
AdDat.AdByte[2]=SftDat1;//中间八位
Read5460Int0();
AdDat.AdByte[3]=SftDat1;//低八位
*/
CS5460A=1;
break;
}
}
//专为void ReadRegister(uchar Addr5460,uchar ABC)服务
void ReadRamDat(uchar Addr5460)
{
Write5460(Addr5460); //写地址
Read5460();
RamDat.RamByte[1]=SftDat; //高八位
Read5460();
RamDat.RamByte[2]=SftDat; //中间八位
Read5460();
RamDat.RamByte[3]=SftDat; //低八位
}
//读5460寄存器Va,Vb,Vc,Ia,Ib,Ic,读直流时判断最高位符号
void ReadRegister(uchar Addr5460,uchar ABC)
{
RamDat.RamByte[0]=0;
/*
switch(ABC)
{
case 1:
CS5460C=0;
break;
case 2:
CS5460B=0;
break;
case 3:
CS5460A=0;
break;
}
Write5460(Addr5460); //写地址
Read5460();
RamDat.RamByte[1]=SftDat; //高八位
Read5460();
RamDat.RamByte[2]=SftDat; //中间八位
Read5460();
RamDat.RamByte[3]=SftDat; //低八位
switch(ABC)
{
case 1:
CS5460C=1;
break;
case 2:
CS5460B=1;
break;
case 3:
CS5460A=1;
break;
}
*/
switch(ABC)
{
case 1:
CS5460C=0;
ReadRamDat(Addr5460);
/*
Write5460(Addr5460); //写地址
Read5460();
RamDat.RamByte[1]=SftDat; //高八位
Read5460();
RamDat.RamByte[2]=SftDat; //中间八位
Read5460();
RamDat.RamByte[3]=SftDat; //低八位
*/
CS5460C=1;
break;
case 2:
CS5460B=0;
ReadRamDat(Addr5460);
/*
Write5460(Addr5460); //写地址
Read5460();
RamDat.RamByte[1]=SftDat; //高八位
Read5460();
RamDat.RamByte[2]=SftDat; //中间八位
Read5460();
RamDat.RamByte[3]=SftDat; //低八位
*/
CS5460B=1;
break;
case 3:
CS5460A=0;
ReadRamDat(Addr5460);
/*
Write5460(Addr5460); //写地址
Read5460();
RamDat.RamByte[1]=SftDat; //高八位
Read5460();
RamDat.RamByte[2]=SftDat; //中间八位
Read5460();
RamDat.RamByte[3]=SftDat; //低八位
*/
CS5460A=1;
break;
}
//-----------------------------------------------------------------
}
/*
//清零状态寄存器
void Write5460K(void)
{
unsigned char kk;
SDI5460=1;
for(kk=0;kk<8;kk++)
{
_nop_(); //在SCK=1之前,数据建立时间要大于50ns,2008.08.01
SCLK5460=1;
_nop_();
SCLK5460=0;
_nop_();
}
}
*/
/**********************************************************************************
时间:2012.1.8
作者:王凯
说明:
1.复位、同步、读/写校准寄存器、写控制寄存器、清状态寄存器、启动CS5460A进行A/D转换;
2.没有参数传递
sbit CS5460A = P3^4;
sbit CS5460B = P3^5;
sbit CS5460C = P3^6;
sbit SDI5460 = P3^0;
sbit SDO5460 = P3^1;
sbit SCLK5460 = P3^7;
sbit Re5460ABC = P1^7;
sbit JDCtrl = P1^5;
***********************************************************************************/
/*
void CS5460AInstall(void)
{
Re5460ABC=0; //发复位脉冲,并持续10ms以上
Del10ms(2);
Re5460ABC=1;
Reset5460(); //校准寄存器
Start5460();
}
*/
//校零子程序
//-----------------------------------------------------------------
void VeriZero(void)
{
TongBu(); //同步
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
CS5460A=0; //校准前进行上电暂停
CS5460B=0; //校准前进行上电暂停
CS5460C=0; //校准前进行上电暂停
Del10ms(1);
Write5460(0xa0);
Del10ms(1);
CS5460A=1;
CS5460B=1;
CS5460C=1;
TongBu(); //同步
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
//10倍增益交流零点校准
CS5460A=0; //写三片5460校验字节,B4=V=1,B3=I=1,B2=R=1,B1=G=0,B0=Q=1
CS5460B=0;
CS5460C=0; //B4=V=1,B3=I=1,B2=R=1,B1=G=0,B0=Q=1
Del10ms(1);
Write5460(0xcd); //Calibration:11011001,
Del10ms(1);
CS5460A=1;
CS5460B=1;
CS5460C=1; //10倍增益交流零点校准
Del10ms(1);
//-----------------------------------------------------------------
INT0=1;
while(INT0);
TongBu(); //同步
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
//-----------------------------------------------------------------
ReadRegister(IACOffsetRd,3); //读A相交流电流零点
x24c08_write(40,RamDat.RamByte[1]); //高八位
x24c08_write(41,RamDat.RamByte[2]); //中八位
x24c08_write(42,RamDat.RamByte[3]); //中八位
//-----------------------------------------------------------------
ReadRegister(IACOffsetRd,2); //读B相交流电流零点
x24c08_write(43,RamDat.RamByte[1]); //高八位
x24c08_write(44,RamDat.RamByte[2]); //中八位
x24c08_write(45,RamDat.RamByte[3]); //中八位
//-----------------------------------------------------------------
ReadRegister(IACOffsetRd,1); //读C相交流电流零点
x24c08_write(46,RamDat.RamByte[1]); //高八位
x24c08_write(47,RamDat.RamByte[2]); //中八位
x24c08_write(48,RamDat.RamByte[3]); //中八位
RamDat.RamWord=0x800000;
WriteRegister(MaskWr,4); //开A/D转换中断
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
Reset5460();
Start5460(); //5460开始工作
}
///*
//校满度子程序
void VerifyIdFull(void)
{
//EX0=0;
TongBu(); //同步
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
CS5460A=0; //校准前进行上电暂停
CS5460B=0; //校准前进行上电暂停
CS5460C=0; //校准前进行上电暂停
Del10ms(1);
Write5460(0xa0);
Del10ms(1);
CS5460A=1;
CS5460B=1;
CS5460C=1;
TongBu(); //同步
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
//10倍增益交流增益校准
CS5460A=0;
CS5460B=0;
CS5460C=0;
Del10ms(1);
Write5460(0xce);
Del10ms(1);
CS5460A=1;
CS5460B=1;
CS5460C=1;
Del10ms(1);
//-----------------------------------------------------------------
INT0=1;
while(INT0);
TongBu(); //同步
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
//-----------------------------------------------------------------
ReadRegister(IGainRd,3); //读A相交流电流增益
x24c08_write(30,RamDat.RamByte[1]); //高八位
x24c08_write(31,RamDat.RamByte[2]); //中八位
x24c08_write(32,RamDat.RamByte[3]); //中八位
//-----------------------------------------------------------------
ReadRegister(IGainRd,2); //读B相交流电流增益
x24c08_write(33,RamDat.RamByte[1]); //高八位
x24c08_write(34,RamDat.RamByte[2]); //中八位
x24c08_write(35,RamDat.RamByte[3]); //中八位
//-----------------------------------------------------------------
ReadRegister(IGainRd,1); //读C相交流电流增益
x24c08_write(36,RamDat.RamByte[1]); //高八位
x24c08_write(37,RamDat.RamByte[2]); //中八位
x24c08_write(38,RamDat.RamByte[3]); //中八位
RamDat.RamWord=0x800000;
WriteRegister(MaskWr,4); //开A/D转换中断
RamDat.RamWord=0xffffff;
WriteRegister(StatusWr,4); //清零状态寄存器
Reset5460();
Start5460(); //5460开始工作
}
其余程序暂时省略......
凯特网版权声明:以上内容允许转载,但请注明出处,谢谢!
