raosibin 发表于 2014-8-14 17:11:33

求助:关于AT7022EU读数不准的问题

1. 整个应用中只用到了电压的测量,电流通道没有用到;第7路AD用到
2. 程序中SPI的通讯读写都是正确的;
3. 下面是校表程序

void ATT_Adjust(void)
{
BSP_SPIx_WriteOneData(0xC3, 0x000000);                  // 清校表数据
BSP_SPIx_WriteOneData(0xC9, 0x00005A);                  // 打开校准数据写

BSP_SPIx_WriteOneData(0x01, 0xB9D5);                     // 填写模式配置寄存器, 开启Ua,Ub,Uc,I0通道
                                                                                  // 三相三线时Ub有效值数据源选择ub通道,有效值慢速更新                                                         
BSP_SPIx_WriteOneData(0x03, 0xF804);                        // 填写EMU单元配置寄存器
BSP_SPIx_WriteOneData(0x31, 0x3437);                     // 填写模拟模块使能寄存器, 打开AD通道高通, 开TPS, BOR功能
BSP_SPIx_WriteOneData(0x02, 0x0180);                     // 各路电压增益均为8

BSP_SPIx_WriteOneData(NUM_HFCONST, 0x16D);          // 高频脉冲输出设置
   
BSP_SPIx_WriteOneData(NUM_UGAINA, 0x0000);          // A相电压增益
BSP_SPIx_WriteOneData(NUM_UGAINB, 0x0000);          // B相电压增益
BSP_SPIx_WriteOneData(NUM_UGAINC, 0x0000);          // C相电压增益
BSP_SPIx_WriteOneData(NUM_GAINADC7, 0x0000);      // 第七路ADC输入信号增益
   
BSP_SPIx_WriteOneData(0xC9, 0x000001);                   //关闭校准数据写
}

4. 在A相接入27.5V交流电压(通过交流变压器220V变比而来),其它未接

5. 测试程序
voidATT7022EU_test1(void)
{
/* =================================================================================================== */
/* 读ATT7022EU校表寄存器                                                                               */

BSP_SPIx_WriteOneData(0xC6, 0x00005A);                                    // 写特殊命令0xc6,参数0x00005A,读ATT7022EU校表寄存器
printf("读校表寄存器\r\n");

printf("读校表参数寄存器起始标志0XAAAA = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_ADJFLAG));

printf("\r\n1.模式配置寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_MODECFG));      
printf("2.EMU单元配置寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_EMUCFG));
printf("3.模拟模块使能寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_MODULECFG));   
printf("4.ADC增益配置寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_PGACTRL));

printf("5.高频脉冲输出设置寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_HFCONST));

printf("6.A相电压增益寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UGAINA));
printf("7.B相电压增益寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UGAINB));
printf("8.C相电压增益寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UGAINC));
printf("9.第七路ADC输入信号增益寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_GAINADC7));

// ADC offset校正 (地址:0x2A~0x2F)
printf("\r\nA相电压通道ADC offset校正寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UOFFSETA));
printf("B相电压通道ADC offset校正寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UOFFSETB));
printf("C相电压通道ADC offset校正寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UOFFSETC));

// 有效值offset校正 (地址:0x24~0x29)
printf("\r\nA相电压有效值offset校正寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UARMSOFFSE));
printf("B相电压有效值offset校正寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UBRMSOFFSE));
printf("C相电压有效值offset校正寄存器 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_UCRMSOFFSE));

printf("单个读校表寄存器结束\r\n");
printf("\r\n============================================\r\n");

BSP_Delay_Nms(1000);

/* 读ATT7022EU校表寄存器结束                                                                           */
/* =================================================================================================== */


/* =================================================================================================== */
/* 读ATT7022EU计量参数寄存器                                                                           */

BSP_SPIx_WriteOneData(0xC6, 0x000000);                                    // 写特殊命令0xc6,参数0x000000,读ATT7022EU计量参数寄存器
printf("单个读计量参数寄存器\r\n");
printf("设备ID号 = 0x%x\r\n",BSP_SPIx_ReadOneData(0));

printf("A相电压有效值UaRms = %d\r\n",BSP_SPIx_ReadOneData(NUM_UARMS)/8192);
printf("B相电压有效值UbRms = %d\r\n",BSP_SPIx_ReadOneData(NUM_UBRMS)/8192);
printf("C相电压有效值UcRms = %d\r\n",BSP_SPIx_ReadOneData(NUM_UCRMS)/8192);
printf("零线电流I0通道有效值I0Rms = %d\r\n",BSP_SPIx_ReadOneData(NUM_I0RMS)/8192);
printf("线频率FREQ = %d\r\n",BSP_SPIx_ReadOneData(NUM_FREQ)/8192);

printf("\r\nA相电压通道ADC采样数据Ua = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_SAMPLE_UA));
printf("B相电压通道ADC采样数据Ub = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_SAMPLE_UB));
printf("C相电压通道ADC采样数据Uc = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_SAMPLE_UC));
   
printf("\r\n温度传感器的输出TPSD = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_TPSD));
printf("断相、相序、SIG等标志状态 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_SFLAG));
printf("通讯校验和 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_COMCHKSUM));
printf("校表数据校验和 = 0x%x\r\n",BSP_SPIx_ReadOneData(NUM_CHKSUM));

printf("\r\n============================================\r\n");
BSP_Delay_Nms(1000);
/* 读ATT7022EU计量参数寄存器结束                                                                     */
/* =================================================================================================== */
}

6. 显示的结果是(通过串口助手显示)

读校表寄存器
读校表参数寄存器起始标志0XAAAA = 0xaaaa

1.模式配置寄存器 = 0xb9d5
2.EMU单元配置寄存器 = 0xf804
3.模拟模块使能寄存器 = 0x3437
4.ADC增益配置寄存器 = 0x180
5.高频脉冲输出设置寄存器 = 0x16d
6.A相电压增益寄存器 = 0x0
7.B相电压增益寄存器 = 0x0
8.C相电压增益寄存器 = 0x0
9.第七路ADC输入信号增益寄存器 = 0x0

A相电压通道ADC offset校正寄存器 = 0x0
B相电压通道ADC offset校正寄存器 = 0x0
C相电压通道ADC offset校正寄存器 = 0x0

A相电压有效值offset校正寄存器 = 0x0
B相电压有效值offset校正寄存器 = 0x0
C相电压有效值offset校正寄存器 = 0x0
单个读校表寄存器结束

============================================
单个读计量参数寄存器
设备ID号 = 0x7122a0
A相电压有效值UaRms = 8
B相电压有效值UbRms = 0
C相电压有效值UcRms = 0
零线电流I0通道有效值I0Rms = 0
线频率FREQ = 49

A相电压通道ADC采样数据Ua = 0x12c4
B相电压通道ADC采样数据Ub = 0x274
C相电压通道ADC采样数据Uc = 0xa0

温度传感器的输出TPSD = 0xd9
断相、相序、SIG等标志状态 = 0xe1f
通讯校验和 = 0x2c0059
校表数据校验和 = 0x2fdf5

7. 问题:
   1. 通过读取的电压和实际的电压相差大约是3.3~3.5倍,感觉正好是芯片的供电电压3.3V,不过从技术文档上看,好像不需要再乘以这个电压系数
      是直接读取有效值寄存器
   2ADC增益寄存器0x02,设置采样通道ADC放大倍数;这个值是根据什么来设置的呢?原理图是厂家提供的参考接法
   3. 每次下载程序后,必须要断电再程序启动,才可以读出正确的数据



bi大痣 发表于 2014-8-14 17:28:39

你试试在V2P和V2N两个脚上加个上拉电阻。

raosibin 发表于 2014-8-14 17:38:22

bi大痣 发表于 2014-8-14 17:28
你试试在V2P和V2N两个脚上加个上拉电阻。

硬件应该不会有问题吧,这个是和厂家提供的原理图是一样的

bi大痣 发表于 2014-8-15 08:54:16

raosibin 发表于 2014-8-14 17:38
硬件应该不会有问题吧,这个是和厂家提供的原理图是一样的

不确定!我也是在Datasheet上面看到的!不知道我看的是不是最新版本的。再说这个试一下也很方便。

raosibin 发表于 2014-8-15 09:50:22

bi大痣 发表于 2014-8-15 08:54
不确定!我也是在Datasheet上面看到的!不知道我看的是不是最新版本的。再说这个试一下也很方便。 ...

我看了文档,是要将R631和R641处接地。刚试了下,问题依旧;其实在做这个之前我还让厂家确认了下,能否可以这样用,厂家说可以的。现在我怀疑是不是前置电阻的原因呢?有的地方我看到是110K,而厂家提供的参考图中,前置电阻有110K的,也有39K*9=351K;会不会是这个原因呢,351/110 = 3.19;从寄存器中读到值乘上这个系数,就比较接近了。按道理来说,这个应该可以通过改变ADC增益(0x2)会有所变化,实际上ADC放大倍数为1无数据,为2时数据减半(比8时)

sos9616 发表于 2014-12-25 14:25:38

raosibin 发表于 2014-8-15 09:50
我看了文档,是要将R631和R641处接地。刚试了下,问题依旧;其实在做这个之前我还让厂家确认了下,能否可 ...

你好,由于不能发你的私信,只能通过这种方式跟你交流,计量芯片 ATT7022B 的相关资料还在吗?能不能借我参考一下。
今年大学刚毕业,知识量有限,数据手册有好多名词看不懂理解不进去,领导这边催着又急,时间有限,实在迫不得已。

raosibin 发表于 2015-5-22 08:54:40

sos9616 发表于 2014-12-25 14:25
你好,由于不能发你的私信,只能通过这种方式跟你交流,计量芯片 ATT7022B 的相关资料还在吗?能不能借我 ...

官网上就有

raosibin 发表于 2015-5-22 08:56:45

这个问题已解决,设计没有问题,只是输入参考电压过低,测量低电压时不准确,当初的设计是为了测500V交流

raosibin 发表于 2015-5-22 08:57:55

这个问题已解决,设计没有问题,只是输入参考电压过低,测量低电压时不准确,当初的设计是为了测500V交流
页: [1]
查看完整版本: 求助:关于AT7022EU读数不准的问题