最近在用这个芯片,碰到一些问题,请各位指点指点···
1. 在指定电压范围内输入交流信号到芯片的VIN±、IIN±脚。 例如:电压/电流通道最大输入电压为±250mV,
为适应更大的电压范围,系数取0.6, 则输入交流信号为150mV,实际上一般取110mV
2. 在串口上发0xa0命令(停止计算,中止A/D转换)
3. 在串口上发0xd6命令(电压通道AC增益校准命令)
4. 在串口上发0x1e命令, 读状态寄存器内的DRDY位。为1,则表示校准已完成,不为1则等待。
5. 校准完成(这时Vrms寄存器值近似等于0.6),在串口上发0x08命令,去读电压通道AC增益寄存器值并把它
存到存储器中
这是资料上关于电压AC增益的一段话, 按照他的要求,我给电压输入通道给150mV AC电压,然后执行AC增益校准, 可是问题出来了,校准后读出来的AC增益寄存器的值一直都是默认值 0x400000,如果Vrms的值是满量程的0.6我倒也没话说, 可是我读出来的是 0x95xxxx~0x96xxxx , (0xFFFFFF*0.6 = 0x999999).
我的程序应该没有问题, 因为用这个程序执行了DC偏移校准,能看到有效果,程序如下,等好了再把完整的程序发上来:
另外,还一个问题,读取到的Vrms 和Irms的0:16位数值不稳定,是硬件问题还是其他什么原因?
/****************************************************************************
* 名称:correct_cs5463()
* 功能:CS5463校准,将校准结果存入flash
* 入口参数:
* 出口参数:无
* 校准命令: 直流电压偏移: 0xD1---0x06 直流电流偏移: 0xC9---0x02
交流电压偏移: 0xD5---0x22 交流电流偏移: 0xCD---0x20
* 交流电压增益: 0xD6---0x08 交流电流增益: 0xCE---0x04
****************************************************************************/
void CS5463_Correct(u8 comm1, u8 comm2, u8 reg_indexh,u8 reg_indexl)
{
u8 a[3];
CS5463_Write_Nbytes(0xa0,0xfe,0xfe,0xfe);//停止AD转换
CS5463_Write_Nbytes(comm1,0xfe,0xfe,0xfe);//发校准命令 0xD1电压DC偏移校准0xC9电流通道DC偏移校准
while((a[0]&0x80) != 0x80)
{
CS5463_Read_Nbytes(0x1e,a,a+1,a+2);//等待校准完成 读状态寄存器
}
CS5463_Read_Nbytes(comm2,a,a+1,a+2); //读校准后的偏移值 电压:0x06电流:0x02
sys.reg[reg_indexh] = a[0];
sys.reg[reg_indexl] = (a[1] << 8);
sys.reg[reg_indexl] += a[2];
Reg_To_Eeprom(sys.reg[reg_indexh],reg_indexh);
Reg_To_Eeprom(sys.reg[reg_indexl],reg_indexl);
}
main() 函数里初始化,校准 :
CS5463_Init();
//CS5463_Correct(0xD1,0x06,VDCOFF_H,VDCOFF_L); // 电压DC偏移
//CS5463_Correct(0xC9,0x02,IDCOFF_H,IDCOFF_L); // 电流DC偏移
CS5463_Correct(0xD6,0x08,VGN_H,VGN_L);// 电压AC增益
//CS5463_Correct(0xD2,0x08,VGN_H,VGN_L);// 电压DC增益
//CS5463_Correct(0xCE,0x04,VGN_H,VGN_L);// 电流AC增益
//CS5463_Reset();
CS5463_Write_Nbytes(Vdcoff+WRITE_OFFSET,
sys.reg[VDCOFF_H],(sys.reg[VDCOFF_L]>>8),
(sys.reg[VDCOFF_L]&0xFF)); //电压偏移
CS5463_Write_Nbytes(Idcoff+WRITE_OFFSET,
sys.reg[IDCOFF_H],(sys.reg[IDCOFF_L]>>8),
(sys.reg[IDCOFF_L]&0xFF)); // 电流偏移
CS5463_Write_Nbytes(Vgn+WRITE_OFFSET,
sys.reg[VGN_H],(sys.reg[IDCOFF_L]>>8),
(sys.reg[VGN_L]&0xFF)); // 电压增益
//CS5463_Write_Nbytes(Poff+WRITE_OFFSET,0x00,0x0d,0x4b); // 功率偏移
CS5463_Init();
主循环读取相关寄存器值:
switch (run_index)
{
case 0:// 30ms
CS5463_Read_Nbytes(Vrms,&buff[0],&buff[1],&buff[2]);
CS5463_Read_Nbytes(Irms,&buff[3],&buff[4],&buff[5]);
CS5463_Read_Nbytes(Pactive,&buff[6],&buff[7],&buff[8]);
CS5463_Read_Nbytes(Vdcoff,&buff2[0],&buff2[1],&buff2[2]);
CS5463_Read_Nbytes(Idcoff,&buff2[3],&buff2[4],&buff2[5]);
CS5463_Read_Nbytes(Vgn,&buff2[6],&buff2[7],&buff2[8]);