本帖最后由 dcxq13 于 2017-4-18 13:13 编辑
最近在用ATT7022C做一款三相电流表,校表遇到问题。
1.使用校表值为0,读出电压值为320V,实际电压输入值为220V,按照数据手册计算
220/320=0.6875然后再减去1等于-0.3125,因为是小于0所以按照手册要求要乘2的23次方加上2的24次方最好算出校表值为14155776
写入以后重新读取电压值还是显示320,查找不出是为什么!
2.我的ADC增益寄存器值为0,按照手册那就是没有打开增益。
3.我往电压校正寄存器里面写入其他值,读出值会产生变化,照理说校表应该是有写进去了。
下面附上电压采集电路 和我的驱动程序
/**************************写ATT7022********************/
void WR_ATT7022(u8 reg_addr,u32 wr_data)
{
u8 i;
ATT7022_CS=1;
ATT7022_SCLK=0;
reg_addr|=0x80; //最高位写1表示写命令
ATT7022_CS=0;
for(i=0;i<8;i++) //写入命令字
{
ATT7022_SCLK=1;
if(reg_addr&0x80)ATT7022_DIN=1;
else ATT7022_DIN=0;
reg_addr<<=1;
ATT7022_SCLK=0;
}
for(i=0;i<24;i++) //写入数据
{
ATT7022_SCLK=1;
if(wr_data&0x80)ATT7022_DIN=1;
else ATT7022_DIN=0;
wr_data<<=1;
ATT7022_SCLK=0; //Delay5us();
}
ATT7022_CS=1;
}
/*********************初始化ATT7022*********************/
void ATT7022_Init()
{
ATT7022_REST=0;
delay_ms(20);
ATT7022_REST=1;
ATT7022_CS=1;
ATT7022_SCLK=1;
ATT7022_DIN=1;
ATT7022_DOUT=1;
delay_s(1);
}
/**************************读ATT7022********************/
u32 RD_ATT7022(u8 reg_addr)
{
u8 i;
u32 att7022_rdbuf; //数据读取缓存
att7022_rdbuf=0;
ATT7022_CS=1;
ATT7022_SCLK=0;
reg_addr&= 0x7f; //最高位写0表示读命令
ATT7022_CS=0;
for(i=0;i<8;i++) //写入命令字
{
ATT7022_SCLK=1;
if(reg_addr&0x80)ATT7022_DIN=1;
else ATT7022_DIN=0;
reg_addr<<=1;
ATT7022_SCLK=0;
}
ATT7022_SCLK=0;
Delay5us();
for(i=0;i<24;i++) //存储数字
{
ATT7022_SCLK=1;
att7022_rdbuf<<=1;
if(ATT7022_DOUT)att7022_rdbuf=att7022_rdbuf|0x01;
ATT7022_SCLK=0;
}
ATT7022_CS=1;
return att7022_rdbuf;
}
/********************读取三相参数值**********************/
void RD_ATT7022_Three_Phrase_Dat() //芯片数据读出后根据计算公式进行换算
{
//float a,b,c,d;
u32 value_tmp;
u32 toal_value;
if(Protection_Work_State==Protection_Failure)return;
value_tmp=RD_ATT7022(r_Pt);
if(value_tmp>8388608)value_tmp=value_tmp-16777216;
value_tmp=(value_tmp/256); //2的(23-17)次方2的6次方64
T_phrase_Pt=(u16)value_tmp; //合相有功功率
value_tmp=RD_ATT7022(r_St);
if(value_tmp>8388608)value_tmp=value_tmp-16777216;
value_tmp=(value_tmp/64)*100;
T_phrase_St=(u16)value_tmp; //合相视在功率
toal_value=0;
value_tmp=(RD_ATT7022(r_URmsa)/8192.0); //读各相电压有效值,除以2的13次方
A_phrase.r_UR=(u32)value_tmp;
toal_value=value_tmp;
value_tmp=(RD_ATT7022(r_URmsb)/8192.0);
B_phrase.r_UR=(u32)value_tmp;
toal_value=toal_value+(value_tmp);
value_tmp=(RD_ATT7022(r_URmsc)/8192.0);
C_phrase.r_UR=(u32)value_tmp;
toal_value=toal_value+(value_tmp);
toal_value=toal_value/3;
T_phrase.r_UR=(u32)toal_value;
value_tmp=((RD_ATT7022(r_IRmsa)&0x7fffff)/8192.00*0.05)*10; //读取各相电流有效值
A_phrase.r_IR=(u32)value_tmp;
toal_value=value_tmp;
//a=value_tmp;
value_tmp=((RD_ATT7022(r_IRmsb)&0x7fffff)/8192.00*0.05)*10;
B_phrase.r_IR=(u32)value_tmp;
toal_value=toal_value+(value_tmp);
//b=value_tmp;
value_tmp=((RD_ATT7022(r_IRmsc)&0x7fffff)/8192.00*0.05)*10;
C_phrase.r_IR=(u32)value_tmp;
value_tmp=((RD_ATT7022(r_IRmst)&0x7fffff)/8192.00*0.05)*10;
T_phrase.r_IR=(u32)(value_tmp/3);
// T_phrase.r_IR=(u32)toal_value;
// c=value_tmp;
//
//toal_value=toal_value+(value_tmp);
// toal_value=toal_value/3;
value_tmp=RD_ATT7022(r_Pft); //读取合相功率因数
if(value_tmp>8388608)value_tmp=value_tmp-16777216;
value_tmp=(value_tmp/8388608);
T_phrase_Ptf=(u16)value_tmp;
value_tmp=RD_ATT7022(r_Freq); //读取电网工作频率
T_Phrase_Freq=(u16)(value_tmp/8192);
value_tmp=RD_ATT7022(r_Ept); //读取合相有功电能
T_Phrase_Ep=(u16)value_tmp;
value_tmp=RD_ATT7022(0x3f);//读漏电流
Leak_Current_Value=(u16)value_tmp;
}
void ATT7022_CLR() //清除校表数据
{
u8 i;
WR_ATT7022(0xc3,0x000000); //清除软件数据
WR_ATT7022(0xc9,0x000000); //较表数据写使能
WR_ATT7022(0x20,0x000022); //写入脉冲常数3200
WR_ATT7022(0x1e,0x000000); //比差补偿区域设置
WR_ATT7022(0x02,0x000000); //相位补偿区域设置1
WR_ATT7022(0x03,0x000000); //相位补偿区域设置2
WR_ATT7022(0x04,0x000000); //相位补偿区域设置3
WR_ATT7022(0x05,0x000000); //相位补偿区域设置4
WR_ATT7022(0x2A,0x000000); //设置合相能量叠加模式
WR_ATT7022(0x86,0x000000); //A相功率增益0
WR_ATT7022(0x89,0x000000); //A相功率增益1
WR_ATT7022(0x87,0x000000); //B相功率增益0
WR_ATT7022(0x8A,0x000000); //B相功率增益1
WR_ATT7022(0x88,0x000000); //C相功率增益
WR_ATT7022(0x8B,0x000000); //0相功率增益1
for(i=0x0c;i<0x1a;i++)WR_ATT7022(i,0x000000);//区域相位校正
WR_ATT7022(0x1B,14155776); //三相电压校正
WR_ATT7022(0x1C,0x000000);
WR_ATT7022(0x1D,0x000000);
WR_ATT7022(0x26,0x000000); //三相电流校正
WR_ATT7022(0x27,0x000000);
WR_ATT7022(0x28,0x000000);
WR_ATT7022(0x3f,0x000000);
WR_ATT7022(0x2c,0x000000); //第七路ADC使能
// WR_ATT7022(0xb0,0x5678); //电路相序检测使能
// WR_ATT7022(0xae,0x3584);
WR_ATT7022(0xc9,0x000001); //关闭校表使能
WR_ATT7022(0xc6,0x000011); //读电参数使能
}
求大神指教,到底是软件的问题还是硬件的问题,帮我解决了话,我有重谢!
|