搜索
bottom↓
回复: 31

CS5463如何测电压

[复制链接]

出0入0汤圆

发表于 2014-8-12 10:03:20 | 显示全部楼层 |阅读模式
我在网上搞了一个程序移植过来,程序大体思路是这样的 先初始化定时器 然后串口 CS5463  然后进行校准 最好通过定时器到了一定时间开始只读0X18电压数据寄存器 结果读出来的数据全为0
我这里么有啥工具 我只是想简单的测一个电压 求做过的人指导一下

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2014-8-12 14:32:50 | 显示全部楼层
把你网上搞了一个程序发上来
把你的硬件图传上来  
.............

出0入0汤圆

发表于 2014-8-12 19:03:28 | 显示全部楼层
好像有个位是开始测量 不过那是测量频率 你怎么连电压都测不出来 你的硬件电路没问题吧

出0入0汤圆

发表于 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[i];
                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[0];
        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[i]<<=1;
                        SCLK=1;
                        _nop_();
//                        delay100us();
                        if(SDO)
                                pointer[i]++;
//                        temp=SDO;
//                        pointer[i]+=temp;
                        SCLK=0;
                        _nop_();
//                        delay100us();;       
                }
        }
        CS2=1;
}

我用的是stc89c52 晶振11.0592MHz

出0入0汤圆

 楼主| 发表于 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[0]&0x80)
        {
                Read_CS5460A(Buf,0x18);  
                SendSerialData(Buf,3);                  //232V         这里发出的东西始终是0 难道一定要做校准 我在考虑下一步做校准 不过看手册貌似很麻烦
                ClearCS5460A();
        }


else         SendSerial_Data(9);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-8-13 11:31:07 来自手机 | 显示全部楼层
不用非要校准 有个连续测量 你开了没  CS5463芯片初始化没问题吧?

出0入0汤圆

 楼主| 发表于 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[0] = 0xE8;
        Write_CS5460A(Buf,1); //启动CS5460A       
}
这片子 非常不熟悉 还求多多指导指导

出0入0汤圆

发表于 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[0]=WRITE+15*2;
        CmdData[1]=0x80;                                //Clear DRDY
        CmdData[2]=0x00;
        CmdData[3]=0x00;
        SdiWrite(CmdData);
/***********************Config Register***********************************/
        CmdData[0]=WRITE;
        CmdData[1]=0x00;
        CmdData[2]=0x00;
        CmdData[3]=0x01;                                //K=1
        SdiWrite(CmdData);
/************************Cycle Count Register*****************************/
        CmdData[0]=WRITE+5*2;
        CmdData[1]=0x00;
        CmdData[2]=0x0f;
        CmdData[3]=0xa0;                                //N=4000
        SdiWrite(CmdData);
/********************Control Register*************************************/
        CmdData[0]=WRITE+28*2;                        //Disable CPUCLK
        CmdData[1]=0x00;
        CmdData[2]=0x00;
        CmdData[3]=0x04;
        SdiWrite(CmdData);
/*******************Operational Mode Register*****************************/
        CmdData[0]=WRITE+18*2;
        CmdData[1]=0x00;
        CmdData[2]=0x00;
        CmdData[3]=0x61;                                //Enable IHPF VHPF AFC
        SdiWrite(CmdData);

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


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

出0入0汤圆

 楼主| 发表于 2014-8-14 11:46:42 | 显示全部楼层
wujin715 发表于 2014-8-13 22:06
可能还是初始化的问题我把CS5463的初始化贴出来 参考一下5460的
void CS5463Init()
{

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

出0入0汤圆

发表于 2014-8-14 11:58:25 来自手机 | 显示全部楼层
悬空可以 不过不如接地稳定  int不记得了 晚上我回去看看

出0入0汤圆

 楼主| 发表于 2014-8-14 14:57:04 | 显示全部楼层
wujin715 发表于 2014-8-14 11:58
悬空可以 不过不如接地稳定  int不记得了 晚上我回去看看

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

出0入0汤圆

发表于 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;

出0入0汤圆

 楼主| 发表于 2014-8-14 16:07:48 | 显示全部楼层
embeddev_1 发表于 2014-8-14 15:27
还有些疑惑
cs5463分为校准后和从来没有校准,校准后比较简单

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

出0入0汤圆

 楼主| 发表于 2014-8-14 16:22:46 | 显示全部楼层
embeddev_1 发表于 2014-8-14 15:27
还有些疑惑
cs5463分为校准后和从来没有校准,校准后比较简单

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

出0入0汤圆

 楼主| 发表于 2014-8-14 16:23:24 | 显示全部楼层
wujin715 发表于 2014-8-14 11:58
悬空可以 不过不如接地稳定  int不记得了 晚上我回去看看

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

出0入0汤圆

发表于 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  任意时刻瞬时功率寄存器的值等于电压有效值寄存器的值乘以电流有效值寄存器的值   你应该明白了吧

出0入0汤圆

发表于 2014-8-14 17:46:32 | 显示全部楼层
ningting06 发表于 2014-8-14 16:23
精度 如何能高一点 是必须校准么?

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入53汤圆

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

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

出0入0汤圆

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

可以实现的

出0入0汤圆

发表于 2014-8-26 21:47:56 | 显示全部楼层
收藏,。。。

出0入0汤圆

 楼主| 发表于 2014-8-27 17:29:32 | 显示全部楼层

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2014-9-25 10:40:25 | 显示全部楼层
wujin715 发表于 2014-8-13 11:31
不用非要校准 有个连续测量 你开了没  CS5463芯片初始化没问题吧?

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

出0入0汤圆

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

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

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

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2014-9-28 22:27:38 来自手机 | 显示全部楼层
很好用的片子
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 04:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表