首页交流分享用CS5460A测量三相交流电流

用CS5460A测量三相交流电流

时间2015-06-09 19:52:07发布caterwang分类交流分享浏览2935

 

    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,如果将它们的增益设置也一样,测量的时候是无差别的。

CS5460~1.JPG2。测量值显示电路,用了三只四位的共阴数码管,用MAX7219来驱动,MAX7219的硬件及软件都比较简单,网上有很多资料及源程序,但是要注意一点,MAX7219只能直接驱动共阴的数码管,如果您想要用共阳的话,势必是需要增加硬件成本的,这里就不在过多说了。 

CS5460~2.JPG最后附我的源程序:

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开始工作
}

 

其余程序暂时省略......

 

 

凯特网版权声明:以上内容允许转载,但请注明出处,谢谢!

展开全文READ MORE
CS5460单片机
基于STC11F04E单片机的信号发生器2----程序设计 TTL电路与COMS电路基础

游客 回复需填写必要信息