# acs71020 Connecting and reading voltage properly

I am using an ACS71020 3.3V I2C version hooked up to ESP32. I have connected the IC as proposed in the datasheet. Rsense used is 1.8k ohm as proposed in the evaluation board user manual for 230-240 VRMS. With connected load i get reasonable results for Irms when reading register 0x20, but Vrms are much lower than expected, and i guess as a result the P rms is also not correct. *Above is my implementation (I2C pull-ups are present) It is also stated that maximum voltage for the VINP pin is 0.275. I measured Rsense with multi meter and got something around 0.100 V rms(Which will not be close to 0.275 V in aplitude). So i thought that might be an issue and tried to recreate the scenario in LtSpice . And indeed it shows that the the voltage across R5 would be around 0.100 Vrms. Was not sure of the role of R3 and R5 , therefore tried to remove them and got ~0.290 V max amplitude , changing Rsense to 1.7k would yield ~0.275 V max amplitude exactly. I have removed R3 and R5 from my PCB, but i still get results pretty similar as with them.(will attach result later,when i get my hands on test pcb again)

Regarding the code, maybe i am doing something wrong as well. But as far as I understand the basic flow would be. Read the values from VRMS IRMS registers. Transform them from Q number() format to Float and then Multiply Vrms by 325(Full scale voltage,or should it by 230 ? ) and Irms by 30 as i have a 30 amps AC71020 version. I expect that the values would oscillate based on which time of cycle they are being read by ESP32,therefore they should by averaged.

Code snippet :

void acs171020_read_2_15Bytes(byte address) {
uint16_t Irms;
uint16_t Vrms;
byte buff[4];
Wire.beginTransmission(0x66);
Wire.write( 0x20);
Wire.endTransmission();
Wire.requestFrom(0x66, 4);
int nrrr = 0;
while (Wire.available())   // slave may send less than requested
{
buff[nrrr++] = c;
}

Vrms = (buff[1] << 8) + buff[0];
bitClear(Vrms, 15);
Irms = (buff[3] << 8) + buff[2];
bitClear(Irms, 15);

float testVRM =  ((float)Vrms) * 0.00003051757; //or /32768.0
float testVRMMM = qToFloat<uint16_t>(Vrms, 15);

// both give same value
testVRMMM = testVRMMM *325;

float testIRM = qToFloat<uint16_t>(Irms, 14);// ((float)Irms) * 0.00006103515;

float testIRMS =  ((float)Irms) * 0.00006103515; //or /32768.0
testIRMS = testIRMS * 30;


To sum up : Are 2 1 mega ohm resistors really needed on the VINN line ? Am I missing something crucial in the code part?

UPDATE: Ok, in order to improve improve performance a bit and let the IC to actualy do it's job, I have enabled the customer mode and set in the register 0x1C to make an average of 62 samples per minute. Then I read 0x27 once a second. The Q to float value is now ~0.3121337891 so to get 230 the full scale voltage should be then considered 736.86351184 V. Where does this number come from, how can i verify it ?

• A colleague and I were just looking into this same issue an hour before you posted -- what chances! Will post anything we learn. Also, I believe all of your units should be 'V' instead of 'mV'. – calcium3000 Nov 18 '19 at 19:30
• Will look forward to hearing from you. And yes it should be just V(fixed). – Miaso Nov 20 '19 at 17:03