I am using an ACS71020ACS71020 3.3V3 V I2C version hooked up to an ESP32. I have connected the IC as proposed in the datasheet. RsenseRsense used is 1.8k ohm8 kΩ as proposed in the evaluation board user manual for 230-240 VRMSVRMS.
With connecteda load iconnected I get reasonable results for IrmsIRMS when reading register 0x20, but Vrms areVRMS is much lower than expected, and iI guess as a result the P rmsRMS is also not correct.
Above is my implementation (I2C pull-ups are present) It.
It is also stated that the maximum voltage for the VINPVINP pin is 0.275 V. I I measured RsenseRsense with multi metera multimeter and got something around 0.100 V rmsRMS (Whichwhich will not be close to 0.275 V in aplitudeamplitude). So i
I thought that might be an issue and I tried to recreate the scenario in LtSpice :
And indeed it showsshowed that the the voltage across R5 would be around 0.100 VrmsVRMS. WasI was not sure of the role of R3 and R5 , thereforeso I tried to removeremoving them and got ~0.290 V max amplitude ,amplitude; changing RsenseRsense to 1.7k7 kΩ would yield ~0.275 V max amplitude exactly.
I have removed R3 and R5 from my PCB, but iI still get resultsgot pretty similar as with them.results (willI will attach resultthe results later,when i when I get my hands on the test pcbPCB again)
Regarding the code, maybe iI am doing something wrong there as well. But, 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.be:
- Read the values from the VRMS and IRMS registers;
- Transform them from Q
number()
format tofloat
; - Multiply VRMS by 325 (full-scale voltage, or should it 230?) and IRMS by 30 as I have a 30 A AC71020 version.
I expect that the values would oscillate based on at which time of the cycle they are being read by the ESP32,therefore therefore they should by averaged.
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;
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 2two 1 mega ohmMΩ resistors really needed on the VINNVIN line ? Am Am I missing something crucial in the code part?
UPDATE: OkOK, in order to improve improve performance a bit and let the IC to actualy do it'sits 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-scale voltage should be then considered to be 736.86351184 V. Where does this number come from, how can iI verify it ?