guoxiao69 发表于 2011-8-22 14:21:55

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

最近在用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;
        write_cs5463(0xa0,0xfe,0xfe,0xfe); //停止AD转换
        write_cs5463(comm1,0xfe,0xfe,0xfe); //发校准命令
        while((a&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,以便以后加载
}

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

johnny_zi 发表于 2012-8-1 09:41:08

我也想知道怎么样校正,能说下不?

fxk1220 发表于 2012-12-7 09:32:48

我测的电流也有偏差,校准的话,还行,不知道为什么电流的线性不是太好,

marshallemon 发表于 2012-12-7 09:52:07

上电路图,线性问题的解决应该先解决输入阻抗问题

fxk1220 发表于 2012-12-8 15:56:33

已经查到原因了,是寄存器的配置问题
把内问滤波打开就好了。

壹嵿岥煱 发表于 2013-6-18 22:07:29

fxk1220 发表于 2012-12-8 15:56 static/image/common/back.gif
已经查到原因了,是寄存器的配置问题
把内问滤波打开就好了。

兄弟,我在做xs5463,不过不准,加个QQ请教下你,可以吗?
页: [1]
查看完整版本: CS5463电压电流线性差,求用过的人给指点。