Autor Tema: Voltimetro Arduino para leer su propio voltaje de alimentacion.  (Leído 11408 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado chargerfox

  • PIC10
  • *
  • Mensajes: 17
Voltimetro Arduino para leer su propio voltaje de alimentacion.
« en: 18 de Noviembre de 2018, 23:55:59 »
Buenas Gente. Estoy haciendo un proyecto en arduino y parte de este es leer el voltaje que alimenta al propio arduino pero estoy teniendo problemas, esperaba alguna idea o ayuda acerca de las conecciones o el codigo. Aqui les dejo ambos para que tengan una idea.
Basicamente necesito leer el voltaje de la bateria que alimenta al propio arduino. Arduino pro mini en este caso, con una bateria tipo LIFE de 6.6v 1600mah.

Si uso una bateria externa a la alimentacion el voltimetro funciona perfecto pero no es lo que necesito, Necesito leer el mismo voltaje de alimentacion del arduino.
Ahora si modifico el voltaje de alimentacion de arduino por ejemplo 6v, el voltimetro ya no funciona como devería, sera cuestion de la simulación o las operaciones matematicas etarán mal?


Código: [Seleccionar]
#include <LCD5110_Graph.h>
#include <stdlib.h>

LCD5110 myGLCD(8, 9, 10, 11, 12);

extern uint8_t SmallFont[]; // Indicamos el tipo de fuente SmallFont



//variables para el voltimetro
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; //R1 100K
float R2 = 10000.0; //R2 10K
int value = 0;
char string[8];
//****************************

void setup() {
  //Serial.begin(9600);
 
  pinMode (analogInput, INPUT);  //PIN A0 = ENTRADA voltimetro
  myGLCD.InitLCD();  //inicia la pantalla
  myGLCD.setFont(SmallFont);
  myGLCD.clrScr(); //borra la pantalla
 
}

void loop() {
  value = analogRead(analogInput);
  vout = (value * 5.0) / 1024.0;
  vin = vout / (R2 /(R1 + R2));
 
  myGLCD.print("VOLTAJE: ", 4,10);
  myGLCD.print(dtostrf(vin,5,2,string), 50, 10); //Transforma el float vin en cadena de caracteres para mostrarlo en el display.
  myGLCD.update();
 
  delay(100);

}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #1 en: 19 de Noviembre de 2018, 00:26:32 »
Citar
Ahora si modifico el voltaje de alimentacion de arduino por ejemplo 6v, el voltimetro ya no funciona como devería, sera cuestion de la simulación o las operaciones matematicas etarán mal?

Normalmente el ADC toma 2 valores de referencia para definir el minimo y el maximo, en tu caso el minimo esta dado por GND ( 0V ) y el maximo esta dado por VCC o si seleccionas internamente podes usar una referencia de 1.1V.

¿Que pasa si es VCC tu maximo? Es el problema que tenes vos, por ejemplo supongamos que tenes 4V en VCC, tu ADC tendria un 0 en 0V y 1024 en 4V, lo mismo ocurriria si tuvieras 5V en VCC. 0 para 0V y 1024 para 5V. En fin... siempre leerias el maximo ( 1024 ).

Entonces no sirve referenciarlo a VCC... necesitas configurar tu Arduino (en realidad el ATmega328 ) para que use esa referencia de tension (1.1V) como su MAXIMO... Eso quiere decir que vas a tener que modificar tambien el valor de las resistencias para que el maximo voltaje llegue 1.1V a la entrada del ADC... Pero ahora al variar la tension de VCC tu maximo sigue siendo 1.1V y vas a poder medir tu VCC sin problemas.

Buscando rapidamente por internet creo que  vas a tener que poner en tu setup:

Código: C++
  1. analogReference(INTERNAL);
https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #2 en: 19 de Noviembre de 2018, 13:46:42 »
Voltaje que alimenta al Arduino:

1. Pones como referencia positiva del ADC la propia alimentación Vcc (configuración por defecto)

2. Lees la tensión del regulador interno.

3. Haces la conversión:

   Vcc = 1023 * Vref/ ADC


Ten cuidado para no dividir por cero.

Desconectado chargerfox

  • PIC10
  • *
  • Mensajes: 17
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #3 en: 19 de Noviembre de 2018, 20:08:13 »
Ok he seguido sus consejos y encontre una funcion que hace lo que dicen sobre el Vcc interno (voltaje de referencia):
Aqui el codigo:
PERO TENGO UN PROBLEMA QUE ME ESTA VOLVIENDO LOCO, es simple calculo pero no me sale, Convertir el el valor de readVcc() que esta expresado en milivoltios a voltios con 2 decimales. Se entiende?

LO HICE ASI PERO NO FUNCIONA:

Código: [Seleccionar]
  //VOLTIMETRO********************************
  float voltaje_entrada = 0.0;
  voltaje_entrada = (readVcc() / 1000); // Ejemplo 6v me entrega 5985.0. A su vez / 1000, teoricamente quedaría 5.9850
  char buffer[8];
 
  String s = dtostrf(voltaje_entrada, 1, 2, buffer);
 
  myGLCD.print("VOLTAJE: ", 4,10);
  myGLCD.print(s, 55, 10);
  myGLCD.update();
  //******************************************
 
    long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif 

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH 
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}


Desconectado chargerfox

  • PIC10
  • *
  • Mensajes: 17
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #4 en: 19 de Noviembre de 2018, 21:27:05 »
Encontre la funcion, pero tengo un problema al convertir float a string.

Desconectado chargerfox

  • PIC10
  • *
  • Mensajes: 17
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #5 en: 20 de Noviembre de 2018, 00:54:01 »
Encontre la funcion, pero tengo un problema al convertir float a string.

CREO QUE ENCONTRE LA SOLUCION POR SI ALGUIEN LE HACE FALTA:
Arduino Pro Mini y Display Nokia5110.

Código: [Seleccionar]
  //VOLTIMETRO********************************
  float voltaje_entrada = 0.0;
  voltaje_entrada = readVcc(); // Ejemplo 6v me entrega 5985.0
  voltaje_final = ((voltaje_entrada * 1000) / 1000) / 1000;
  String s = String(voltaje_final, 2);
  myGLCD.print("VOLTAJE: ", 4,10);
  myGLCD.print(s, 55, 10);
  myGLCD.update();
  //******************************************
 
  long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif 

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH 
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #6 en: 06 de Enero de 2020, 11:14:53 »
Hola a todos !!

Alguien en algún momento probó medir la tensión de alimentación al PIC, de otra manera ?

Veo que de esta manera funciona, sin embargo estaría consumiendo permanentemente una pequeña corriente (25 uA) que haría gastar la propia batería. Una mejora a esto sería habilitar este divisor resistivo cada un cierto tiempo para medir tensión de bateria, mediante la activación de un transistor desde el micro.

Vengo investigando sobre esto, y otra opción sería utilizar la función "BROWN-OUT Detection", lo cual pongo su descripción adjunta. El inconveniente es que al estar alimentado el PIC desde un regulador, puede que la tensión de batería baje, y el regulador la mantenga, hasta que la tension de entrada caiga por debajo del voltage mínimo, y a partir de ese punto la saldria del regulador caería a cero, lo cual no serviria utilizar esta funcion.

Agradecería comentarios para ver como lo resolvieron de otra manera, si es que alguien le encontró la vuelta.

Saludos
« Última modificación: 06 de Enero de 2020, 11:18:37 por Simon21 »
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #7 en: 06 de Enero de 2020, 22:13:17 »
Hola que tensión nominal tiene la batería?
Y que regulador utilizas?

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #8 en: 07 de Enero de 2020, 11:04:23 »
Buen día Robert,

La tensión nominal es de 4.5 V, ya que son 3 pilas de 1.5V.

Con respecto al regulador es el MCP1812, con 2.8 V de salida regulada y un Dropout Voltage de 500 mV.

INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #9 en: 07 de Enero de 2020, 17:00:43 »
Eso te dará una tensión de algo más de 4.5 voltios con las pilas cargadas y apenas 2.4 voltios con las pilas descargadas. La tensión varía casi linealmente con la pérdida de carga de las pilas.

Con baterías de NiMh es distinto, la tensión se mantendrá casi siempre a 3.6v.

https://www.i-ciencias.com/pregunta/47661/funcion-para-describir-el-voltaje-de-la-bateria-alcalina-en-corriente-constante--de-la-carga

 

* Nimhcharakteristikrp.png
(13.15 kB, 466x411 - visto 1775 veces)


Un saludo.
« Última modificación: 07 de Enero de 2020, 17:03:54 por Picuino »

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #10 en: 07 de Enero de 2020, 18:53:02 »
En mi caso, voy a utilizar 3 pilas de 1.5 V en serie para obtener 4.5 V.

La curva es la que adjunto en la imagen a continuación.


* battery.jpg
(71.45 kB, 756x599 - visto 1796 veces)


Estoy pensando que la mejor alternativa es colocar un divisor resistivo con 1 resistencia de 10 M y otra de 3.3 M para obtener 1.1 V en el punto central a medir.

Con esos valores altos de resistencia lograría una corriente de 0.33 uA como para evitar descargar la batería.

Otra opción es activar el divisor resistivo desde una salida del PIC al momento de hacer la medición y luego dejarlo desactivado (tambien adjunto otra imagen), pero para ello debo solucionar el inconveniente que no ingrese ninguna tensión al micro al momento que el transistor quede abierto, evitando quemar la entrada con una tensión de 4.5 V (ya que el micro es alimentado por un regulador de 2.8V).


* divisor.jpg
(154.89 kB, 1063x779 - visto 1815 veces)


Saludos   
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #11 en: 07 de Enero de 2020, 21:14:26 »
Lamentablemente ese divisor resistivo tiene una impedancia muy alta respecto de la impedancia de entrada del microcontrolador.
Por lo tanto la tensión en el punto medio se vendrá abajo.
La idea es muestrear la tensión a intervalos, con un transistor MOSFET de muy baja potencia y bajo Vgs. Así puedes accionarlo con 3.3V

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #12 en: 08 de Enero de 2020, 11:19:50 »
Lamentablemente ese divisor resistivo tiene una impedancia muy alta respecto de la impedancia de entrada del microcontrolador.
Por lo tanto la tensión en el punto medio se vendrá abajo.
La idea es muestrear la tensión a intervalos, con un transistor MOSFET de muy baja potencia y bajo Vgs. Así puedes accionarlo con 3.3V

Hola Robert !

Acá en el datasheet encontré algo respecto a lo que me dices.

 

* impedance.jpg
(89.04 kB, 1292x816 - visto 1766 veces)


De todas formas, al ser una tensión continua la que estoy midiendo, no creo que afecte demasiado al tiempo de carga del capacitor.

En fines prácticos, habría que ver hasta que valores resistivos en el divisor, hacen una buena medición.  :undecided: :undecided:
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #13 en: 08 de Enero de 2020, 11:55:45 »
La idea es muestrear la tensión a intervalos, con un transistor MOSFET de muy baja potencia y bajo Vgs. Así puedes accionarlo con 3.3V

Porque un Mosfet y no un BJT ? En este caso me parece que con el BJT tendría menos perdidas en la salida y podría conmtuarlo muy facilmente desde la salida del PIC.

Saludos
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Respuesta #14 en: 08 de Enero de 2020, 14:00:13 »
Al parecer la impedancia de entrada del ADC, es de 10K aprox. por lo tanto la resistencia pull-up del divisor resistivo debe tener al menos el mismo valor, así podrás leer  la mitad del valor de la tensión de alimentación.
La idea de usar un MOSFET y no un BJT, es que el primero consume una corriente despreciable de Gate.


 

anything