ningting06 发表于 2014-8-12 10:03:20

CS5463如何测电压

我在网上搞了一个程序移植过来,程序大体思路是这样的 先初始化定时器 然后串口 CS5463然后进行校准 最好通过定时器到了一定时间开始只读0X18电压数据寄存器 结果读出来的数据全为0
我这里么有啥工具 我只是想简单的测一个电压 求做过的人指导一下

lxa0 发表于 2014-8-12 14:32:50

把你网上搞了一个程序发上来
把你的硬件图传上来
.............

wujin715 发表于 2014-8-12 19:03:28

好像有个位是开始测量 不过那是测量频率 你怎么连电压都测不出来 你的硬件电路没问题吧

wujin715 发表于 2014-8-12 19:21:15

去年用过 现在这个项目还在 所以就只能把最基本的串口初始化跟读写函数贴出来如果最基本的没问题 剩下的就是看DATASHEET了有时间看看英文的DATAsheet 中文的不清楚
void SpiInit()
{
unsigned char i,j,write_temp;
        SDI=0;
        SCLK=0;
        CS2=0;

        SDO=1;

        for(i=0;i<3;i++)
        {
                write_temp=0xff;
                for(j=0;j<8;j++)
                {
                        write_temp<<=1;
                        SDI=CY;                                                //Any Digital Input Rise/Fall Time < 1us
                        _nop_();
                        SCLK=1;                                                //Rise Time SCLK < 100us
                        _nop_();
//                        delay100us();
                        SCLK=0;                                                //Fall Time SCLK < 100us
                        _nop_();
//                        delay100us();
                }
        }
        write_temp=0xfe;
        for(j=0;j<8;j++)
        {
                write_temp<<=1;
                SDI=CY;                                                //Any Digital Input Rise/Fall Time < 1us
                _nop_();
                SCLK=1;                                                //Rise Time SCLK < 100us
                _nop_();
//                        delay100us();
                SCLK=0;                                                //Fall Time SCLK < 100us
                _nop_();
//                        delay100us();
        }
        CS2=1;
}
/*****************************************
函数名称:SdiWrite
功    能:Write Command & Data to CS5463
参    数:pointer--The Char Array of Command + Data (1 + 3)
返 回 值:无
******************************************/
void SdiWrite (unsigned char *pointer)
{
        unsigned char i,j,write_temp;


        CS2=0;
        for(i=0;i<4;i++)
        {
                write_temp=pointer;
                for(j=0;j<8;j++)
                {
                        write_temp<<=1;
                        SDI=CY;                                                //Any Digital Input Rise/Fall Time < 1us
                        _nop_();
                        SCLK=1;                                                //Rise Time SCLK < 100us
                        _nop_();
//                        delay100us();
                        SCLK=0;                                                //Fall Time SCLK < 100us
                        _nop_();
//                        delay100us();
                }
        }
        SDI=1;
        CS2=1;
}
/*****************************************
函数名称:SdoRead
功    能:Write Command to CS5463 & Read Data from CS5463
参    数:pointer-->The Char Array of Command + Data (1 + 3)
返 回 值:无
******************************************/
void SdoRead (unsigned char *pointer)
{
        unsigned char i,j,cmd;

        CS2=0;

        cmd=pointer;
        for(i=0;i<8;i++)
        {
                cmd<<=1;
                SDI=CY;                                                //Any Digital Input Rise/Fall Time < 1us
                _nop_();
                SCLK=1;                                                //SCLK Rise Time < 100us
                _nop_();
//                delay100us();
                SCLK=0;                                                //SCLK Fall Time < 100us
                _nop_();
//                delay100us();
        }
        SDI=1;
        for(i=1;i<4;i++)
        {
                for(j=0;j<8;j++)
                {
                        SDO=1;                                        //读取数据前先置高
                        pointer<<=1;
                        SCLK=1;
                        _nop_();
//                        delay100us();
                        if(SDO)
                                pointer++;
//                        temp=SDO;
//                        pointer+=temp;
                        SCLK=0;
                        _nop_();
//                        delay100us();;       
                }
        }
        CS2=1;
}

我用的是stc89c52 晶振11.0592MHz

ningting06 发表于 2014-8-13 11:20:53

wujin715 发表于 2014-8-12 19:21
去年用过 现在这个项目还在 所以就只能把最基本的串口初始化跟读写函数贴出来如果最基本的没问题 剩下的 ...

这是SPI协议 这里我是没问题的
void main()
{       
   timer_init();
        com_init();                        //串口初始化
        InitCS5460A();                //CS5460A初始化
        //Calibraton_run();        //通道增益校准
while(1)
{       
        if(flag==1)
        {
       
        RunCS5460A();        //读取转换值
        flag=0;
        }

        }
}


void RunCS5460A()
{
               

        Read_CS5460A(Buf,0x1e);
        if(Buf&0x80)
        {
                Read_CS5460A(Buf,0x18);
                SendSerialData(Buf,3);                  //232V       这里发出的东西始终是0 难道一定要做校准 我在考虑下一步做校准 不过看手册貌似很麻烦
                ClearCS5460A();
        }


else         SendSerial_Data(9);
}

wujin715 发表于 2014-8-13 11:31:07

不用非要校准 有个连续测量 你开了没CS5463芯片初始化没问题吧?

ningting06 发表于 2014-8-13 11:56:48

wujin715 发表于 2014-8-13 11:31
不用非要校准 有个连续测量 你开了没CS5463芯片初始化没问题吧?

void InitCS5460A()//初始化CS5460A
{
       
        RestCS5460A();//复位CS5490A
        Sync_CS5460A();
        Wr_configure();//配置
        Load_Calibraton();
        ClearCS5460A();
        Wr_interrupt();
        Wr_Control();
        Buf = 0xE8;
        Write_CS5460A(Buf,1); //启动CS5460A       
}
这片子 非常不熟悉 还求多多指导指导

wujin715 发表于 2014-8-13 22:06:16

可能还是初始化的问题我把CS5463的初始化贴出来 参考一下5460的
void CS5463Init()
{

        RESET2=0;
        _nop_();

        RESET2=1;        //8个振荡周期大约是2us
        _nop_();
        _nop_();

        SpiInit();
        _nop_();

        delay100us();
/**********************Status Register************************************/
        CmdData=WRITE+15*2;
        CmdData=0x80;                                //Clear DRDY
        CmdData=0x00;
        CmdData=0x00;
        SdiWrite(CmdData);
/***********************Config Register***********************************/
        CmdData=WRITE;
        CmdData=0x00;
        CmdData=0x00;
        CmdData=0x01;                                //K=1
        SdiWrite(CmdData);
/************************Cycle Count Register*****************************/
        CmdData=WRITE+5*2;
        CmdData=0x00;
        CmdData=0x0f;
        CmdData=0xa0;                                //N=4000
        SdiWrite(CmdData);
/********************Control Register*************************************/
        CmdData=WRITE+28*2;                        //Disable CPUCLK
        CmdData=0x00;
        CmdData=0x00;
        CmdData=0x04;
        SdiWrite(CmdData);
/*******************Operational Mode Register*****************************/
        CmdData=WRITE+18*2;
        CmdData=0x00;
        CmdData=0x00;
        CmdData=0x61;                                //Enable IHPF VHPF AFC
        SdiWrite(CmdData);

/*************************Mask Register***********************************/
        CmdData=WRITE+26*2;                        //Mask Register
        CmdData=0x00;
        CmdData=0x00;
        CmdData=0x00;                                //Disable INT
        SdiWrite(CmdData);


        Instruction(START_CONV_C);                //Perform Continuous Computation Cycles
        T_Offset_Calibrate();
}

ningting06 发表于 2014-8-14 11:46:42

wujin715 发表于 2014-8-13 22:06
可能还是初始化的问题我把CS5463的初始化贴出来 参考一下5460的
void CS5463Init()
{


如果我只采样电压 电流采集端是否可以悬空 还有我CS5463的INT是接地的 这样做是否正确?没一点头绪 手册也是英文的 读起来相当吃力

wujin715 发表于 2014-8-14 11:58:25

悬空可以 不过不如接地稳定int不记得了 晚上我回去看看

ningting06 发表于 2014-8-14 14:57:04

wujin715 发表于 2014-8-14 11:58
悬空可以 不过不如接地稳定int不记得了 晚上我回去看看

再打扰你一会哈 ,那个三个16进制读出来如何换算成电压哈? 貌似有点小结果了 悬空状态 02 9D B402 B7 0802 B9 CA02 A6 A2测了四次

embeddev_1 发表于 2014-8-14 15:27:51

wujin715 发表于 2014-8-13 22:06
可能还是初始化的问题我把CS5463的初始化贴出来 参考一下5460的
void CS5463Init()
{


还有些疑惑
cs5463分为校准后和从来没有校准,校准后比较简单

(Vrms/0.6)*V满量程= 实测电压有效值

(Irms/0.6)*I满量程= 实测电压有效值;

现在根据cs5463测得的Pactive寄存器(~1-1)怎么计算实际有功功率?

没有校准的,理论上应该是这样计算
V,I通道最大输入+-250mv,对应有效值176mv

Vrms/1=x/176--> x=276Vrms

x再乘以互感器变比既可以得到源端电压有效值,电流也是类似

现在不明白的就是Pactive寄存器,这个得到一个(-1~1)之间的数,根据这个数怎么反推实际有功功率?

Vrms*Irms=S; PF=P有功/S; {:biggrin:}

ningting06 发表于 2014-8-14 16:07:48

embeddev_1 发表于 2014-8-14 15:27
还有些疑惑
cs5463分为校准后和从来没有校准,校准后比较简单



这不校准 误差也太大了把 相差范围竟然到了+-10V

ningting06 发表于 2014-8-14 16:22:46

embeddev_1 发表于 2014-8-14 15:27
还有些疑惑
cs5463分为校准后和从来没有校准,校准后比较简单



精度如何能高一点 一定要校准才行吗

ningting06 发表于 2014-8-14 16:23:24

wujin715 发表于 2014-8-14 11:58
悬空可以 不过不如接地稳定int不记得了 晚上我回去看看

精度 如何能高一点 是必须校准么?

wujin715 发表于 2014-8-14 17:43:15

embeddev_1 发表于 2014-8-14 15:27
还有些疑惑
cs5463分为校准后和从来没有校准,校准后比较简单



就看你的电路怎么设置的了 比如你设置的220V对应的电压有效值是0.6电流5A对应的有效值是0.6则当Vrms=220V I=5A时 瞬时功率寄存器的值是0.6*0.6=0.36任意时刻瞬时功率寄存器的值等于电压有效值寄存器的值乘以电流有效值寄存器的值   你应该明白了吧

wujin715 发表于 2014-8-14 17:46:32

ningting06 发表于 2014-8-14 16:23
精度 如何能高一点 是必须校准么?

校准是最简单的办法 但是在没有专业仪器的前提下 硬件设计好就差不多了看你是要做什么用了 精度要求多高 高的话搞个标准信号 硬件选择误差范围小的其实CS5463挺好用的

wujin715 发表于 2014-8-14 17:48:00

在要求不高的情况下 可以比较万用表跟芯片的测量电压 然后自己写入校准数值这样可以保证在某个范围内还是比较准确的

ningting06 发表于 2014-8-14 17:52:35

wujin715 发表于 2014-8-14 17:48
在要求不高的情况下 可以比较万用表跟芯片的测量电压 然后自己写入校准数值这样可以保证在某个范围内还是比 ...

好 感谢就这么弄 不然真没有其他方法了{:sad:} {:sad:}

wujin715 发表于 2014-8-14 17:53:03

ningting06 发表于 2014-8-14 14:57
再打扰你一会哈 ,那个三个16进制读出来如何换算成电压哈? 貌似有点小结果了 悬空状态 02 9D B402 B7...

每一位乘以该位的权最终得到的值就是了比如第一个字节你乘以2的8次方 第二个字节你乘以2的16次方 以此类推 具体哪个字节成多少 怎么进位我记不清了 你要是还不清楚 我给你查查 挺好想的

ningting06 发表于 2014-8-14 17:56:11

wujin715 发表于 2014-8-14 17:53
每一位乘以该位的权最终得到的值就是了比如第一个字节你乘以2的8次方 第二个字节你乘以2的16次方 以 ...

好的手册上应该是有的 我仔细研究一下 太感谢网上问了一大圈 你的回答最给力

zhcj66 发表于 2014-8-25 11:16:36

wujin715 发表于 2014-8-14 17:53
每一位乘以该位的权最终得到的值就是了比如第一个字节你乘以2的8次方 第二个字节你乘以2的16次方 以 ...

请问这个芯片测量出来的电压是对应比例的有效值吗?现在我只想测量一个电路中交流点的有效值电压

wujin715 发表于 2014-8-26 19:06:31

zhcj66 发表于 2014-8-25 11:16
请问这个芯片测量出来的电压是对应比例的有效值吗?现在我只想测量一个电路中交流点的有效值电压 ...

可以实现的

y1z2f4 发表于 2014-8-26 21:47:56

收藏,。。。{:lol:}

ningting06 发表于 2014-8-27 17:29:32

wujin715 发表于 2014-8-26 19:06
可以实现的

兄弟 我电压还是不会算 那个24位的数据 该如何转换成真真的电压了? 再帮帮我 纠结的要命啊{:mad:}

wujin715 发表于 2014-8-27 19:45:14

ningting06 发表于 2014-8-27 17:29
兄弟 我电压还是不会算 那个24位的数据 该如何转换成真真的电压了? 再帮帮我 纠结的要命啊...

兄台 看你面相十分投缘 好吧你如果是用51的话 从MSB开始读 读取一个字节 然后让这个值除以2的8次方然后第二个字节除以2的16次方 第三个字节除以2的24次方 将这几个数值加起来就是一个0-1的小数然后你知道怎么算了吧?

ningting06 发表于 2014-8-28 09:34:19

wujin715 发表于 2014-8-27 19:45
兄台 看你面相十分投缘 好吧你如果是用51的话 从MSB开始读 读取一个字节 然后让这个值除以2的8次方然 ...

{:mad:}出来的结果 比我按比例运算出来的结果 还差的远{:mad:} {:mad:} {:mad:} {:mad:} 想死啊

ningting06 发表于 2014-8-28 09:41:51

wujin715 发表于 2014-8-27 19:45
兄台 看你面相十分投缘 好吧你如果是用51的话 从MSB开始读 读取一个字节 然后让这个值除以2的8次方然 ...

兄弟 你看看我这一系列分析数据0428EE   042D40对应38V
                                              056BF2056810对应55V
                                                070F407EB8对应75V
                                                 0ADBF2 0AD57E对应122V
后16位变化超级大 前8位到是相对稳定 相对线性关系还不错 不过按刚才的算法 第一个算出来才7.7V的样子

chliken 发表于 2014-9-25 10:40:25

wujin715 发表于 2014-8-13 11:31
不用非要校准 有个连续测量 你开了没CS5463芯片初始化没问题吧?

想请教下,兄台在做的时候有校准么?方便贴下校准部分的代码么?我正在用CS5463,但是在校准的时候,只有直流电流偏移有读数正常///直流电压偏移,交流电流偏移,交流电压偏移读数均为零///交流电流增益,交流电流增益都为400000,
弄了很久,不知道是怎么回事,在坛子里面多个贴里面请教到这个问题,没有人回复。。。

wujin715 发表于 2014-9-28 22:07:28

chliken 发表于 2014-9-25 10:40
想请教下,兄台在做的时候有校准么?方便贴下校准部分的代码么?我正在用CS5463,但是在校准的时候,只有 ...

东西去年做的校正的程序挺简单的不过因为没有校准设备 而且安装说明的校准出来效果不理想 最后自己往寄存器里写数据校准的 因为时间久了具体才做记不清了 而且最近厂子做设备 没空 怕说错了误人子弟,因为我直接设置滤掉了直流 所以只进行了交流校准我把程序贴出来如果你想好好研究建议把英文DATASHEET里面的SYSTEM CALIBRATION部分研读一下   部分程序 仅供参考:
/*************************AC Offset Calibration***************************/
/*        CmdData=WRITE+26*2;
        CmdData=0x80;                                //Mask Register-->Enable DRDY
        CmdData=0x00;
        CmdData=0x00;
        SdiWrite(CmdData);
        EX1=1;                                                        //开启中断
//        Instruction(POWERUP_HALT);
        Instruction(0xdd);
        while(flag_calib2);

        CmdData=READ+16*2;                        //读取AC偏移量
        SdoRead(CmdData);
        LcdWriteCmd(0x80);
        LcdWriteData('I');
        LcdWriteData('=');
        LcdWriteData(hex/16]);
        LcdWriteData(hex%16]);
        LcdWriteData(hex/16]);
        LcdWriteData(hex%16]);
        LcdWriteData(hex/16]);
        LcdWriteData(hex%16]);

        CmdData=READ+17*2;
        SdoRead(CmdData);       
        LcdWriteCmd(0x88);
        LcdWriteData('V');
        LcdWriteData('=');
        LcdWriteData(hex/16]);
        LcdWriteData(hex%16]);
        LcdWriteData(hex/16]);
        LcdWriteData(hex%16]);
        LcdWriteData(hex/16]);
        LcdWriteData(hex%16]);

        CmdData=WRITE+15*2;                        //Status Register
        CmdData=0x80;                                //Clear DRDY
        CmdData=0x00;
        CmdData=0x00;
        SdiWrite(CmdData);*/

chliken 发表于 2014-9-28 22:12:40

wujin715 发表于 2014-9-28 22:07
东西去年做的校正的程序挺简单的不过因为没有校准设备 而且安装说明的校准出来效果不理想 最后自己往 ...

谢谢指导,我的问题已经解决了,是由于初始化的问题,导致校准的时候不正常

fugeone_copy 发表于 2014-9-28 22:27:38

很好用的片子
页: [1]
查看完整版本: CS5463如何测电压