Publicidad

sábado, 17 de junio de 2017

Adj Power Supply with Voltage & Current Meter



El proyecto que traigo a continuación es una ampliación del tutorial sobre fuentes de alimentación y multímetros.

Por un lado vamos a hacer una fuente de alimentación de laboratorio, ajustable, con dos tensiones de salida, una positiva y otra negativa. A la que vamos a añadir un voltímetro y un amperímetro hechos como no, con Arduino.

Hacer un voltímetro con Arduino es muy fácil. Las tensiones de hasta 5 voltios se pueden medir directamente en las entradas analógicas y luego convertir la medida en un valor de tensión. Sirve por ejemplo para medir la carga de una pila.

Pero cuando la tensión que queremos medir es de por ejemplo 30 voltios, hay que atenuar la señal para no dañar el Arduino. Esto se consigue fácilmente con un divisor de tensión.

En la figura de abajo tenemos un voltímetro sencillo. Suponiendo que la corriente que circula hacia la entrada A0 es despreciable, la tensión que medimos en A0 es Vref / 6 es decir que tenemos una atenuación x6, lo que nos permite medir tensiones de hasta 30 voltios. Sustituyendo R2 por una resistencia de 10M tendríamos una atenuación x11.



Pero ¿qué sucede si la tensión que queremos medir es negativa y superior a 5 voltios? Por un lado tenemos que atenuarla y además convertirla en una tensión positiva. Para ello vamos a utilizar un amplificador operacional configurado como amplificador-inversor. Eligiendo las resistencias R3 y R4 de igual valor tenemos una ganancia = -1 con lo que la tensión de salida es igual a la de entrada, pero positiva.



Utilizar amplificadores operacionales para adaptar la señal, añade una pequeña complicación a nuestro circuito, y es que necesitamos una alimentación auxiliar de +-12V ó +-15V para que funcionen correctamente. ¡Qué aburrido sería esto si todo funcionase a la primera!

Para solucionar este problema añadiremos una fuente auxiliar hecha con un par de reguladores L7812 y L7912. Aprovecharemos la salida de +12V para alimentar el Arduino.



Bueno, ya tenemos la parte del voltímetro solucionada. Ahora vamos a por el amperímetro.

Para medir la corriente vamos a utilizar un sensor de efecto Hall ACS-712. Este módulo es capaz de medir corrientes de hasta 5 amperios AC / DC. También hay modelos de 20 y 30 amperios.

Su funcionamiento es muy sencillo, se conecta según el esquema, se alimenta con 5V del Arduino y en el pin Output entrega una tensión proporcional a la corriente que circula por la carga. Esta salida se conecta directamente al Arduino dado que su valor oscila entre 1,5 y 3,5V para el modelo de 5 amperios.

Para saber más sobre sensores de corriente consulta el blog electrodragon y la página de Henry´s Bench



Ya sabemos la teoría sobre cómo hacer un voltímetro y un amperímetro con Arduino, ahora vamos a la práctica.

A continuación el esquema de la fuente de laboratorio con dos tensiones ajustables de manera independiente. Para más información consultar los datasheet de los CI´s LM317 y LM337.




Seguidamente podéis ver la fuente auxiliar de +-12V para el operacional y el Arduino, el divisor de tensión para atenuar la tensión de entrada y el adaptador de señal para poder conectarla a los pines analógicos.


El amplificador operacional utilizado es el LF347N, pero serviría cualquiera de propósito general. 

Como este encapsulado dispone de cuatro amplificadores, he utilizado dos de ellos en la configuración Seguidor de Tensión o Buffer No Inversor,  para aislar la tensión de referencia, de los pines analógicos del Arduino. Con esto conseguimos que la tensión que queremos medir no se vea afectada por conectarla a la entrada analógica de nuestra tarjeta Arduino.

Como buenos observadores que sois, os habréis dado cuenta de que en el divisor de tensión he utilizado un trimmer en lugar de una resistencia. Esto es por dos razones; en primer lugar para modificar la atenuación en función de la tensión que queramos medir, así el mismo circuito serviría para medir tensiones de hasta 30 ó 55 voltios. Y en segundo lugar se consigue afinar la atenuación para que sea lo más precisa posible, es decir que si VCC son 30 voltios, en la entrada del operacional tengamos realmente 5 voltios.



Y por último el esquema completo que incluye la fuente, las alimentaciones auxiliares, el adaptador de señal, el Arduino y un display LCD de 16x2 caracteres ya conocido por todos vosotros de proyectos anteriores.

Alimentamos el Arduino con 12V de la fuente auxiliar a través del pin VIN y con la salida de 5V alimentamos el display y los dos sensores de corriente.  


Un par de observaciones antes de continuar.

En los sensores de corriente hay que tener en cuenta el sentido en el que circula la corriente, ya que éste influye en la medida que se obtiene. Si la corriente fluye como en la imagen, Vout se incrementa con la corriente, si la corriente circula en sentido contrario, Vout se decrementa al subir la corriente que circula por el sensor. El amperímetro aquí expuesto funciona conectando la carga como se muestra en la imagen.

También indicar que estos sensores tiene un pequeño offset. En ausencia de corriente circulando por el sensor, entregan una tensión de salida que puede llevar a medidas erróneas. Para solucionarlo he incluido en el sketch un función que se ejecuta una sola vez al arrancar el Arduino. Esta función lee el valor del offset, lo guarda en una variable y se resta al valor leído para que coincida con el valor real. Para que el cálculo del offset sea correcto hay que tener la precaución de no conectar ninguna carga hasta que Arduino haya finalizado su cálculo.

En segundo lugar indicar un problema que tuve durante el desarrollo del voltímetro, por si a alguno os pasa.
Resulta que en ocasiones la medida daba resultados muy dispares y el display se venía abajo, fallaba, se iba la lectura.

Descubrí que los leds del backlight del display consumen casi 360mA lo que hace que el regulador interno de 5V del Arduino funcione al límite de corriente, lo que ocasiona caídas de tensión por debajo de 5V y un mal funcionamiento general. 

Solución, colocar una pequeña resistencia de 22 ó 47 ohmios a la entrada del backlight para limitar el consumo del mismo. Se pierde algo de brillo en el display, pero se gana en estabilidad y buen funcionamiento.




Una imagen de la fuente terminada





Por problemas de espacio en el display he acortado los nombres de las variables a la hora de mostrarlas por pantalla.

En el Sketch he utilizado VCC e ICC para la tensión y la corriente positivas y VEE e IEE para las negativas. 

La tensión y corriente positivas se muestran como VC e I en la fila superior y VE e I en la fila inferior.


Sketch

/*
  Dual voltage & Current Meter with Auto Offset Adjust
  
*/

#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9); // pins for RS, E, DB4, DB5, DB6, DB7

// Variables for the voltmeter
int RawVCC = 0;
float VCC = 0;
float auxVCC = 0;
int RawVEE = 0;
float VEE = 0;
float auxVEE = 0;

//Variables fot the ammeter
float ICC = 0;
float offset1 = 0;
float IEE = 0;
float offset2 = 0;

boolean ofst = 0;

void setup()
{
lcd.begin(16, 2);
lcd.clear();
}

// Function to calculate ICC offset
// Do not connect any load until Arduino finishes calculating the offset.
float offset1Adj()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("calc. offset");
  lcd.setCursor(0, 1);
  lcd.print("please wait...");
  delay(2000);  // to allow time for stabilizing offset
  for(int i = 0; i < 1000; i++) {
  offset1 = offset1 + (.0264 * analogRead(A3) -13.51);
  delay(2);
  }
  
  return offset1;
}

// Function to calculate IEE offset
float offset2Adj()
{
  
  for(int j = 0; j < 1000; j++) {
  offset2 = offset2 + (.0264 * analogRead(A2) -13.51);
  delay(2);
  }
  ofst = 1; // to calculate offset once at the beginning
  return offset2;
}

  
  

void loop()
{
  if (ofst == 0) 
    {
    offset1 = offset1Adj();
    offset2 = offset2Adj();
    }
    
  float average1 = 0;
  for(int i = 0; i < 1000; i++) {
  average1 = average1 + (.0264 * analogRead(A3) -13.51);
  delay(1);
  }
  
  float average2 = 0;
  for(int j = 0; j < 1000; j++) {
  average2 = average2 + (.0264 * analogRead(A2) -13.51);
  delay(1);
  }
  
  RawVCC = analogRead(A1);
  auxVCC = map(RawVCC, 0, 1023, 0, 300);
  VCC = (auxVCC / 10.0);
  
  RawVEE = analogRead(A0);
  auxVEE = map(RawVEE, 0, 1023, 0, 300);
  VEE = (auxVEE / 10.0);
  
    
  ICC = (average1 - offset1) ; // offset adjust
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("VC=");
  lcd.print(VCC,1);
  if (VCC <10){
    lcd.print("  I=");
    }
  if (VCC >= 10){
    lcd.print(" I=");
    }  
  lcd.print(ICC,0);
  lcd.print("mA");
  
  IEE = (average2 - offset2) ; // offset adjust
  lcd.setCursor(0, 1);
  lcd.print("VE=");
  lcd.print(VEE,1);
  if (VEE <10){
    lcd.print("  I=");
    }
  if (VEE >= 10){
    lcd.print(" I=");
    }  
  lcd.print(IEE,0);
  lcd.print("mA");
  
   
    
}



Links

Henrys Bench: ACS712 Current Sensor

Electrodragon: ACS712 Current Sensor

No hay comentarios.:

Publicar un comentario

Publicidad