ACS712 sensor de corriente a 1.1v iref

Estoy armando una fuente de alimentación y quiero medir voltaje y corriente, el voltaje lo mido siempre con un divisor resistivo, con la referencia interna del atmega328 a 1.1v. Las lecturas son bastante aceptables para mi.

El problema es con la corriente, estoy probando distintos métodos, el primero fue medir la corriente desde el shunt del buck converter que voy a usar, el mismo tiene una resistencia de 0.010 ohms. Use un amplificador operacional con una ganancia alta, pero sigo teniendo problemas con las mediciones a bajos mA, (no son precisos).

Probé con un shunt externo de 0.1 ohm, sin el op amp y es bastante "aceptable" pero tengo tambien un modulo ACS712 de efecto hall que quiero probar, el problema es que el sensor es de 5v. pero mi referencia ya esta seteada a 1.1v.

Se me ocurrió intentar con un divisor resistivo a la salida y tratar de calibrarlo, pero leyendo me encontré con un código que parece que lo hace por software. La verdad es que quisiera entender lo que hace el código ya que cambia cosas a bajo nivel y realmente no se que es lo que hace.

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1125300L / result; // Back-calculate AVcc in mV
  return result;
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println( readVcc(), DEC );
  delay(1000);
}

depues le acopla:

unsigned int ADCValue;
double Voltage;
double Vcc;

Vcc = readVcc()/1000.0;
ADCValue = analogRead(0);
Voltage = (ADCValue / 1024.0) * Vcc;

Me gustaría tener una idea de lo que hace la función readVcc() del primer código adjunto.

Pero esa es una tecnica para leer la tensión de alimentación cuando estas trabajando con la referencia de 1.1Volts
Nada mas. No sirve para medir sensores ni lo que tu quieres.
Si quieres hacerlo usa divisor resisitivo.

Desde el momento en que pasas a Referencia 1.1V todo se lleva a 1.1V.

surbyte:
Pero esa es una tecnica para leer la tensión de alimentación cuando estas trabajando con la referencia de 1.1Volts
Nada mas. No sirve para medir sensores ni lo que tu quieres.
Si quieres hacerlo usa divisor resisitivo.

Desde el momento en que pasas a Referencia 1.1V todo se lleva a 1.1V.

Gracias por la pronta respuesta!

Y para peor... no olvides que el ACS712 tiene una salida respecto de 2.5V en condiciones normales.
O sea... sera 1.10/2 = 0.55V

surbyte:
Y para peor... no olvides que el ACS712 tiene una salida respecto de 2.5V en condiciones normales.
O sea... sera 1.10/2 = 0.55V

Entonces si alimento el ACS712 con 5v y la salida es de 2.5v, puedo usar un divisor a la salida, que a un máximo de 5v me de entregue 1.1v eso es lo que me dices? Gracias nuevamente.

Exactamente eso debes hacer.

Bueno, funciona, pero lo descarto porque es muy impreciso a niveles bajos de corriente, de 500 mA para abajo las mediciones varían mucho. para medir Amperios esta bien pero mA no.
Me quedo con el shunt externo de 0.1 ohm.

Les dejo los valores que use, por si alguien necesita en algún momento hacer lo mismo con la referencia de 1.1v

R1: 3300 ohm.
R2: 1000 ohm.

float mVxAmp= 0.023;  // En mi caso, el sensor es de 20A, el cual especifica 100mV por Amper. 
                // ahora al usar un divisor para 1.1v se traduce a 23mV por Amper.
void ACS_getamps()
{
 for (int i = 0; i < 1000; ++i)  //se realizan 1000 muestras para promediar. ( esto no es necesario pero mejora la medicion) 
 {
  ACS_mV = (analogRead(A0) * (1.1/1023.0)-0.58); // "0.58" puede variar dependiendo del voltaje de entrada del sensor
  amps+= ACS_mV/mVxAmp; 
 }
 amps/=1000;
   
}

Saludos!