Electrical – acs71020 Connecting and reading voltage properly

acarduinoesp32voltage measurement

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.
Proposed schematic
enter image description here
*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 simulation. 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
  {
    char c = Wire.read();    // receive a byte as character
    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 ?

Best Answer

If you get 150mV amplitude (300mVpp) with 230VRMS and the maximum voltage measured by the part is 275mV amplitude then your full scale voltage is actually 230VRMS * (275mV/150mV) = 421.66V. This seems like normal design to me, providing some margin for safety as well as providing a range of measurement values for inputs above and below the 230V nominal.

Does using 421.66 as the full scale voltage give you a reasonable answer?