| 
 
| 本帖最后由 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);          //读电参数使能
 }
 
 
 求大神指教,到底是软件的问题还是硬件的问题,帮我解决了话,我有重谢!
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |