一、硬件(低速)光耦隔离,测试速率40Kbps较稳定,80Kbps不稳定。
二、MX软件SPI配置
SPI读函数
void Read_ATT7053_B( uint8_t addr, uint8_t *ATTdata, uint8_t len )
{
uint32_t i=0;
ATT7053_B_CS_Low;//片选拉低
HAL_Delay_us(10);
SPI3_ReadWriteByte(addr|Att7053_Readflag); //读地址
for(i=0;i<len;i++)
{
ATTdata[i]=SPI3_ReadWriteByte(0xFF);
}
ATT7053_B_CS_High;//片选拉高
}
SPI写函数
//设置ATT7053参数
void ATT7053_Set( uint8_t addr, uint8_t *ATTdata, uint8_t len )
{
uint8_t i=0;
ATT7053_B_CS_Low;//片选拉低
HAL_Delay_us(10);
SPI3_ReadWriteByte(addr|Att7053_Writeflag); //写地址
for(i=0;i<len;i++)
{
SPI3_ReadWriteByte(ATTdata[len-i-1]);
}
ATT7053_B_CS_High;//片选拉高
}
通讯校验函数//可以不用
uint32_t COMCheckB(uint8_t *Rx_Data,uint8_t len)
{
uint8_t COMChecksum[3]={0,0,0};
uint16_t Rx_Checksum=0,ATT_Checksum=0,Check_OK=0,i=0;
Read_ATT7053_B(COMChecksum_Add,COMChecksum,len);
Rx_Checksum=COMChecksum[1]*256+COMChecksum[2];
ATT_Checksum=COMChecksum[0];//上次通讯的命令字
for(i=0;i<len;i++)
ATT_Checksum+=Rx_Data[i];
if(Rx_Checksum==ATT_Checksum)
{
Check_OK=1;
}
else
{
Check_OK=0;
}
return Check_OK;
}
主函数
void ATT7053_Pro(void)
{
uint8_t ATT_Data_A[3],ATT_Data_B[3];
uint32_t ATT_Rx_Data_A=0,ATT_Rx_Data_B=0,ADC_Data=0;
//读芯片内部ChipID
Read_ATT7053_B(ADDR_ChipID, ATT_Data_B,3);
if(COMCheckB(ATT_Data_B,3)==1)//B路芯片校验通过
{
ATT_Rx_Data_B=(ATT_Data_B[0]<<16)|(ATT_Data_B[1]<<8)|ATT_Data_B[2];
}
if(ATT_Rx_Data_B != ChipID)//如果读取错误,对芯片重启
{
ATT7053_Err_Count++;//累计10次断电重启
ATT7053_Rst();
}else
{
ATT7053_Err_Count=0;
}
Read_ATT7053_B(Rms_U_Add,ATT_Data_B,3);//读取B路电压
if(COMCheckB(ATT_Data_B,3)==1)//校验通过
{
ADC_Data=(ATT_Data_B[0]<<16)|(ATT_Data_B[1]<<8)|ATT_Data_B[2];
AC_Voltage_B=5.2597842755*ADC_Data/10000;
}
}
交流电压有效值寄存器 Rms_U_Add 08H
吐槽一下,这芯片手册校准方法写的地方太隐晦难懂,折腾我半天,实在没办法打厂家电话问出来的。 US0~US23根本不是19位ADC的LSB真实数据,是经过转换后的,乘以K后就能到得到实际电压数据。
注意:5.2597842755是K值系数,算出来写死即可。
已经把分压电阻的比例及误差也计算进去了,挺方便的。
K值校准方法(居然写在文档最下面):
电压、电流都是一样的计算方法
宏定义
#define ChipID 0x7053B0
#define ADDR_ChipID 0x1B
#define DeviceID 0x705321
#define ADDR_DeviceID 0x1C
#define COMChecksum_Add 0x17
#define Rms_U_Add 0x08
#define Att7053_Writeflag 0x80
#define Att7053_Readflag 0