|
最近在用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,以便以后加载
} |
|