用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开始工作 }
其余程序暂时省略......
凯特网版权声明:以上内容允许转载,但请注明出处,谢谢!