搜索
bottom↓
回复: 6

CS5463电压电流线性差,求用过的人给指点。

[复制链接]

出0入0汤圆

发表于 2011-8-22 14:21:55 | 显示全部楼层 |阅读模式
最近在用CS5463做一个产品,功能基本完成了,就是线性很差。电压电流线性都不好。线性度能差百分之几了都。不同电压输入时,电压RMS寄存器值的计数:
输入:230.9            寄存器:7ACFA6   
输入:208.1            寄存器:6DA9AA
输入:162.6            寄存器:52D11C
输入:117              寄存器:37E1C0
输入:71.9             寄存器:1EF778
在0V输入时,寄存器的值显示为:1855C
也按照手册进行校准了。
校准顺序是:
1、不加电压电流,先对电压和电流通道进行DC偏移校准。校准的结果大概就是0xFFXXXX(高字节0xFF,中,低字节有些变化)
2、不加电压电流,进行AC偏移校准,校准结果跟DC校准的差不多
3、加满量程(230V,5A),进行增益校准,校准结果出入很大,比如第一次校准电流增益,结果是0x3F20CD ,第二次再校准可能就变成0X582222,相差很多。
进行完这3步校准后测试输入电压与寄存器的值。结果就如上面所述,输入越小时,采样值就越小(随着输入变小,线性度越差)
相关的程序如下:
#include "spi.h"
#include "cs5463.h"
#include "flash.h"


static        void        delays(u8        i)
{
        u16 j,k;
        for(j=0; j<i; j++)
        {
                for(k=0; k<50000; k++);
        }       
}
//cs5463初始化配置       
void        init_cs5463(void)
{
        RCC->APB2ENR|=1<<2;       //PORTA时钟使能          
        RCC->APB2ENR|=1<<5;      //PORTD时钟使能
        RCC->APB2ENR|=1<<4;      //PORTC时钟使能
               
        GPIOA->CRL&=0XFFF0FFFF;
        GPIOA->CRL|=0X00030000;//PA4,推挽输出        
        GPIOA->ODR|=1<<4;    //PB12上拉

        GPIOC->CRH&=0XFFFFF0FF;
        GPIOC->CRH|=0X00000300;//PC10,推挽输出
        GPIOC->ODR |= 1<<10;
//        GPIOD->CRL&=0XFFFFF0FF;
//        GPIOD->CRL|=0X00000300;//PD2,推挽输出
          cs5463_cs = 0;
        delays(1);
        cs5463_rst = 1;
        delays(100);
        cs5463_rst = 0;
        delays(200);
        cs5463_rst = 1;         //复位CS5463

        SPI1_ReadWriteByte(0xff);
        SPI1_ReadWriteByte(0xff);
        SPI1_ReadWriteByte(0xff);
        SPI1_ReadWriteByte(0xfe); //以上4个命令初始化串口

        SPI1_ReadWriteByte(0x5e);//写状态寄存器命令
        SPI1_ReadWriteByte(0x80);
        SPI1_ReadWriteByte(0x00);
        SPI1_ReadWriteByte(0x00);//0x800000写入状态寄存器,高位在前

        SPI1_ReadWriteByte(0x40);//写配置寄存器命令
        SPI1_ReadWriteByte(0x00);
        SPI1_ReadWriteByte(0x00);
        SPI1_ReadWriteByte(0x01);//0x000001写入配置寄存器,高位在前,配置K=1等功能

        SPI1_ReadWriteByte(0x4a);//写配置AD转换数的命令
        SPI1_ReadWriteByte(0x00);
        SPI1_ReadWriteByte(0x0f);  
        SPI1_ReadWriteByte(0xa0);//写入0x000fa0到周期计数寄存器,以配置N=4000

        SPI1_ReadWriteByte(0x74);//写中断屏蔽命令
        SPI1_ReadWriteByte(0x00);
        SPI1_ReadWriteByte(0x00);
        SPI1_ReadWriteByte(0x00);//写入0x000000到中断屏蔽寄存器,屏蔽INT引脚中断

        SPI1_ReadWriteByte(0x64);//写操作模式配置命令
        SPI1_ReadWriteByte(0x00);
        SPI1_ReadWriteByte(0x00);
        SPI1_ReadWriteByte(0x01);//写入0x000001激活自动在线频率测量等功能 电压电流不开启HPF,不禁止负脉冲
               
        SPI1_ReadWriteByte(0xe8);//启动转换命令,执行连续计算周期                               
}
/****************************************************************************
* 名称:read_cs5463()
* 功能:读取CS5463寄存器中的值并存储到相应存储区
* 入口参数:commm 读寄存器命令         buf 读出数据存储区
* 出口参数:无
****************************************************************************/
void        read_cs5463(u8 comm, u8 *dh, u8 *dm, u8 *dl)
{

        SPI1_ReadWriteByte(comm);
        *dh = SPI1_ReadWriteByte(0xfe);
        *dm = SPI1_ReadWriteByte(0xfe);
        *dl = SPI1_ReadWriteByte(0xfe);//读配置寄存器
}
/****************************************************************************
* 名称:write_cs5463()
* 功能:配置CS5463相关寄存器
* 入口参数:comm1 comm2 comm3 comm4命令
* 出口参数:无
****************************************************************************/
void        write_cs5463(u8 comm1, u8 datah, u8 datam, u8 datal)
{
        SPI1_ReadWriteByte(comm1);
        SPI1_ReadWriteByte(datah);
        SPI1_ReadWriteByte(datam);
        SPI1_ReadWriteByte(datal);
}
/****************************************************************************
* 名称:correct_cs5463()
* 功能:CS5463校准,将校准结果存入flash
* 入口参数:
* 出口参数:无
****************************************************************************/
void        correct_cs5463(u8        comm1, u8        comm2, u8        i)
{
        u8 a[3];
        write_cs5463(0xa0,0xfe,0xfe,0xfe); //停止AD转换
        write_cs5463(comm1,0xfe,0xfe,0xfe); //发校准命令
        while((a[0]&0x80) != 0x80)
        {
        read_cs5463(0x1e,a,a+1,a+2); //等待校准完成
        }
        read_cs5463(comm2,a,a+1,a+2);//读校准后寄存器值
        SPI_Flash_Write(a,(50+(i*3)),3);//校准结果写入flash,以便以后加载
}

出0入0汤圆

发表于 2012-3-5 17:27:10 | 显示全部楼层
回复【楼主位】guoxiao69  
-----------------------------------------------------------------------

读数据的时候每次都要写0xfe进去清楚寄存器的
s32 CS5463_ReadReg(u8 reg_addr, u16 sign)
{
        s32 result;
       
        if (reg_addr > 31)
                return 0;
        AD_nCS_RESET();
        CS5463_transmit(reg_addr<<1);
        result = CS5463_transmit(0xfe);
        result <<= 8;
        result += CS5463_transmit(0xfe);
        result <<= 8;
        result += CS5463_transmit(0xfe);
        AD_nCS_SET();
        if (sign &&  (result & (1ul<<23)))
                result += 0xff000000;
               
        return result;
}

出0入0汤圆

发表于 2012-8-1 09:41:08 | 显示全部楼层
我也想知道怎么样校正,能说下不?

出0入0汤圆

发表于 2012-12-7 09:32:48 | 显示全部楼层
我测的电流也有偏差,校准的话,还行,不知道为什么电流的线性不是太好,

出0入85汤圆

发表于 2012-12-7 09:52:07 | 显示全部楼层
上电路图,线性问题的解决应该先解决输入阻抗问题

出0入0汤圆

发表于 2012-12-8 15:56:33 | 显示全部楼层
已经查到原因了,是寄存器的配置问题
把内问滤波打开就好了。

出0入0汤圆

发表于 2013-6-18 22:07:29 | 显示全部楼层
fxk1220 发表于 2012-12-8 15:56
已经查到原因了,是寄存器的配置问题
把内问滤波打开就好了。

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

本版积分规则

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

GMT+8, 2024-4-20 09:48

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

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