Instrumento de medición para fuentes


Este proyecto se trata de un medidor destinado a utilizarse en fuentes de alimentación, ya que es el uso mas frecuente, pero se podría usar simplemente como multímetro externo.
Es un medidor que nos proporciona el valor de Tensión, Corriente y Potencia de una carga para tensión continua.
Los parámetros eléctricos para los cuales fue diseñado este dispositivo son de 0 a 30Vdc y de 0 a 3Adc, lo cual nos sera de utilidad para casi cualquier proyecto de laboratorio de electrónica.
El dispositivo posee como corazón un microcontrolador PIC16F883, pero podría cambiarse por algún otro microcontrolador con el mismo pinout.
En nuestro desarrollo utilizamos dos canales ADC a 10bit de resolución, uno para la medición de tensión y otro para la medición de corriente, donde luego se realiza el producto de ambos para obtener la potencia.
En el caso de la tensión se ha utilizado un divisor resistivo para garantizar un fondo de escala a 5V en la entrada del ADC cuando la medición sea de 30V en las puntas.
En el caso de la corriente se ha utilizado un amplificador operacional ya que se implementa como shunt una resistencia cerámica de 0.33Ohm 5W, debido a que el fondo de escala (3A) sera la corriente que circula por esta resistencia y la caída en la misma sera de 999mV, se debe amplificar para que este fondo de escala se convierta en 5V.
Esta idea de reducir y amplificar la señal, o bien, re-acondicionar la señal, se utiliza para aprovechar al máximo la resolución del ADC interno del microcontrolador, ya que si solo usáramos de 0 a 1V en el caso del amperímetro, estaríamos desaprovechando 4/5 del ADC y los saltos entre valores serian demasiado grandes.
Como protección de los dos canales ADC, se utiliza un diodo zener de 5V1.
El firmware es sencillo, simplemente debe leer los ADC y luego debe realizar la conversión matemática de compensación del atenuador (en el caso del voltímetro) y del amplificador (en el caso del amperímetro).
Se ha incorporado una función para calcular la media o promedio de mediciones, este proceso aumenta la estabilidad de medición en los dígitos menos significativos.






#include <16F883.h>
#device adc=10
#use delay(int=4000000)
#include <LCD.C>
void main(){
   setup_adc_ports(sAN0|sAN1|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   lcd_init();
   int i;
   int16 vecCorr[10], vecVolt[10];
   int16 auxCorr=0, auxVolt=0;
   int16 currentADC, voltajeADC;
   float current, voltaje, power;
   while(TRUE){
      for(i=0;i<10;i++){
         set_adc_channel(0);
         delay_us(200);
         currentADC=read_adc();
         vecCorr[i]=currentADC;
         set_adc_channel(1);
         delay_us(200);
         voltajeADC=read_adc();
         vecVolt[i]=voltajeADC;
      }
      auxCorr=0;
      auxVolt=0;
      for(i=0;i<10;i++){ 
         auxCorr=vecCorr[i]+auxCorr;
         auxVolt=vecVolt[i]+auxVolt;
      } 
      delay_ms(500);
      current=(5.0*(auxCorr/10)/1023.0)/1.6665;
      voltaje=((5.0*(auxVolt/10)/1023.0)/0.151)-(current/10);
      power=voltaje*current;
      lcd_gotoxy(1,1);
      if(voltaje>9.999)
         printf(lcd_putc," %02.2fV %02.3fA ",voltaje,current);
      else
         printf(lcd_putc,"  %02.2fV %02.3fA",voltaje,current);
      lcd_gotoxy(1,2);
      if(power>9.999)
         printf(lcd_putc,"     %02.2fW      ",power);
      else
         printf(lcd_putc,"      %02.2fW     ",power);
   }
}



52 comentarios:

  1. Excelente tu trabajo, una pregunta es muy complicado reprogramar el pic para que llegue a 5 ampers, es que yo no tengo ni idea de programacion de pic?. Saludos y gracias.

    ResponderEliminar
    Respuestas
    1. Si, de echo podes circularle 5A, lo que sucede es que en lugar de caer 1V en la R de 0R33, van a caer 1,66V, pero con el ajuste del segundo amplificador operacional se puede calibrar, tenes que medir corriente con otro amperimetro como patron de calibracion asi calibras este.
      Saludos.

      Eliminar
  2. Muchas gracias por responderme, saludos y feliz año!!!

    ResponderEliminar
  3. Hola estoy armando una fuente, quisiera saber si se puede utilizar el pic16f628a para realizar este proyecto, ya que en la linea 7 me da error, saludos.

    ResponderEliminar
    Respuestas
    1. Hola, el problema con el 16f628A es que no posee ADC, es el modulo indispensable para este proyecto ya que se basa en la medición de parámetros analógicos.
      Podrías usar otro MCU que no sea el 16F883, pero que tenga ADC.
      Saludos.

      Eliminar
  4. Gracias por responder y solucionar mi problema, lo he cambiado por el 16f88 y va joya el programa...

    ResponderEliminar
  5. Hola Sebastian.. disculpa, una consulta... en la imagen del PCB se ve la conexión al Cristal pero en el esquemático no esta y bueno en el programa marca el OSC interno.

    ResponderEliminar
    Respuestas
    1. Hola buen día, es correcto, lo que sucede que en las pruebas también use otros micros y digamos que el PCB quedo con la opción de usar o no el cristal, entonces se lo termine dejando por si alguien quiere aumentar la frecuencia y demás.
      Saludos.

      Eliminar
  6. Saludos, podria indicarme que programa usa para compilar? Ya que quiero usar un PIC16F877a

    ResponderEliminar
    Respuestas
    1. Hola este programa esta realizado en C bajo el compilador CCS, podes buscar cualquier IDE que soporte CCS, en este caso yo estoy usando PCWH.
      http://www.ccsinfo.com/ccsfreedemo.php
      Saludos!

      Eliminar
    2. Gracias por su respuesta, Oiga trata de compilar en el MikroC y me arroja error en varias lineas e igual en compilerC.

      Eliminar
    3. Hola como estas?, el programa esta compilado con CCS no con MikroC, por lo que no te va a compilar nunca con MikroC, tenes que usar el compilador CCS.
      Saludos.!

      Eliminar
  7. Hola sebastian te cuento tengo pensado usar una fuente ATX la salida de 12v que me entrega 20A max. 240w con el siguiente circuito "Fuente SMPS (Switching Mode Power Supply) con SG3524" para obtener los voltages +30 /-30 3A 180W y poder ajustarla con este circuito que propusiste puedo usar dos de estos sin problemas uno para el voltage positivo y otro para el negativo?

    ResponderEliminar
    Respuestas
    1. Hola, si, podes. El problema es que vas a tener que usar un amplificador operacional inversor (alimentado con +/-12V) para que invierta 180° la señal y puedas medir sin problemas ya que no podes poner una tension negativa en un ADC.
      Saludos.

      Eliminar
  8. hola gastie muito do projeto eu posso usa esse cod para uma fonte de 12 vots por 200aperes automotiva. muito obrigando

    ResponderEliminar
    Respuestas
    1. Olá, esta montagem é de baixa potência e corrente, você precisa montar uma rede isolada com uma alça isolados de energia sensor de corrente. Saudações.

      Eliminar
  9. AMIGO EU TO QUERENDO USA UM PROJETO PARA UMA FONTE AUTOMOTIVA DE 12 VOTS ´POR 200 APERES COMO FAÇO UM PROJETOR DESSE ESSE PROJETOR SERVE. BAO TARDE

    ResponderEliminar
  10. AMIGO EU TO QUERENDO USA UM PROJETO PARA UMA FONTE AUTOMOTIVA DE 12 VOTS ´POR 200 APERES COMO FAÇO UM PROJETOR DESSE ESSE PROJETOR SERVE. BAO TARDE

    ResponderEliminar
    Respuestas
    1. Olá, ele está servindo, mas note que você precisa shunt alta atual Tene ONU para senti-los 200A. Saudações.

      Eliminar
  11. Buenas como hago para pasarlo al 16f877a

    ResponderEliminar
    Respuestas
    1. Tenes que cambiar 3 lineas:

      #include <16F883.h> ----> #include <16F877A.h>
      .
      #use delay(int=4000000) ----> #use delay(clock=4000000)
      .
      setup_adc_ports(sAN0|sAN1|VSS_VDD); ----> setup_adc_ports(all_analog);

      Tene en cuenta que el 16F877A lleva clock externo (el cristal con los capacitores).

      Saludos!

      Eliminar
  12. buenas disculpa pero lo necesito como hago para poder medir 10 amper ya lo cambie para el 16f877 pero no entiendo bien la parte del operacional

    ResponderEliminar
    Respuestas
    1. Hola, tendrías que poner dos resistencias de 0.1R 5W en paralelo, para obtener 0.05R 10W, con ella vas a poder medir 10A sin problemas, ya que 10A en 0.05R son 5W de disipación y vas a obtener una caída de tensión de 500mV a 10A, por lo que el Amplificador Operacional tiene que amplificar x10 para obtener 5V a fondo de escala. Tendrías que cambiar la resistencia de 2k7 que esta junto a un preset por una de 10k.
      Luego en el programa cambiar esta linea: current=(5.0*(auxCorr/10)/1023.0)/1.6665;
      Por esta otra linea: current=(5.0*(auxCorr/10)/1023.0)*2;, ejemplo si tenes un consumo de 5A, en la R de 0.05R caerán 250mV, en el amplificador sera x10, quedando 2.5V y al multiplicarlo por 2, nos mostrara 5A.
      Saludos.

      Eliminar
  13. muchisimas gracias y saludos disculpa las molestias ahora lo pruebo cualquier cosa te comento.

    ResponderEliminar
    Respuestas
    1. Por Nada!, cualquier cosa avísame! Saludos.

      Eliminar
  14. una ultima consulta las resistencias entonces son de una decima de ohm?

    ResponderEliminar
    Respuestas
    1. Hola, si, la resistencias son de 0.1 Ohms, en paralelo dará 0.05Ohms Que es lo mismo que 50mOhms

      Saludos.

      Eliminar
  15. buenas soy yo de nuevo te consulte para 10 amper tengo el problema que la caida de voltaje en las resistencias es de 0.5 v pero a tope me sale 7.5 amper no se si hay que usar otro operacional o cambiar el codigo

    ResponderEliminar
    Respuestas
    1. Hola, podes corroborar esto con otro instrumento a modo patrón de calibración?, es decir, poner un amperímetro externo a este circuito y corroborar que están circulando 10A y en este circuito lees 7.5A?.
      Igual... podes medir tensión con el voltimetro sobre la resistencia de shunt y por ley de ohm (conoces el valor de la resistencia) I=V/R, la tensión que lees sobre el valor de la R, te va la corriente que circula.

      Eliminar
  16. lo que mas creo que es es el calculo de la formula ya que al poner el zener se limita a 7 y pico amperios . te agradeceria una orientacion

    ResponderEliminar
    Respuestas
    1. Hola, el zener en la entrada del MCU es para que no pases de 5V sino quemas el microcontrolador, al microcontrolador no le llega "corriente" sino tensión, le llega un valor entre 0 y 5V. Este valor viene del operacional que amplifica la tensión que mide en la resistencia de shunt. Si tenes una resistencia de 0.05 Ohms y circulan 7.5A por ella, entonces vas a tener una caída de tensión de V=I*R=7.5A*0.05R=0.375V en la resistencia, luego pasa por el amplificador (cambiando el preset de 2k7 por uno de 10k) tendrías una ganancia de hasta 10 veces, osea en la salida tendrían 3.75V. Estas usando el valor de 0.05R (dos R de 0.1 en paralelo) o estas usando otro valor?, estas usando el preset de 2k7 o uno de 10k en el amplificador operacional?, tene en cuenta que el amplificador operacional esta alimentado con 5V por lo que nunca te va a dar mas que ello (lo comento por lo que me decís de los 7V y el zener).

      Eliminar
  17. exactamente amigo el problema era la alimentacion del operacional .!! luego de ccambiar eso ya me funciono ...
    ahora quisiera preguntarte otra cosa . yo programo con el mini pro programer tl86cc . y puedo borrar los pic 16f877a y 16f648a . en el 877 una vez grabe y ando cuando quise volver a grabarlo me sale este error "error data addres_:0x000000 buff_valor:0xFF ic_val:0x10" y con el 16f648a que nunca lo grabe ni nada a la primera vez me sale lo mismo y no termina de quemarlo .

    ResponderEliminar
    Respuestas
    1. Hola, si a veces da ese error, usualmente es cuando el microcontrolador esta en mal estado, y ya esta inservible, pero en otros casos puede ser algún mal conexionado en el programador y el micro, lo que yo hago es probar con otro micro, si anda bien, entonces ya la culpa sera del microcontrolador en mal estado.
      Saludos.

      Eliminar
  18. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  19. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  20. buenas te puedo preguntar de donde sacas la formula de corriente y tension el 1.665 y el 0.151

    ResponderEliminar
    Respuestas
    1. Hola, esas constantes salen en el caso de la corriente, es factor de multiplicación que sale del amplificador operacional ya que se esta amplificando la caída de tensión en el shunt para aprovechar el rango de medición del ADC.
      En el caso de la tensión es porque se esta atenuando la tensión de medición con una red resistiva, por ello hay que compensar esas dos variables.
      Saludos

      Eliminar
  21. a mi no me funciona, estoy usando un pic 18f2550 y cambien
    #include <16F883.h> ----> #include <18F2550.h>
    .
    #use delay(int=4000000) ----> #use delay(clock=20M)
    .
    setup_adc_ports(sAN0|sAN1|VSS_VDD); ----> setup_adc_ports(all_analog);

    y agregue el #fuses XT
    y nada que me funciona en lo real, que puedo hacer?

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Hola, te posteo el programa para el 18F2550:

      #include <18F2550.h>
      #device adc=10
      #use delay(crystal=20000000, clock=5000000)
      #include
      void main(){
      setup_adc_ports(AN0_TO_AN1|VSS_VDD);
      setup_adc(ADC_CLOCK_DIV_2);
      lcd_init();
      int i;
      int16 vecCorr[10], vecVolt[10];
      int16 auxCorr=0, auxVolt=0;
      int16 currentADC, voltajeADC;
      float current, voltaje, power;
      while(TRUE){
      for(i=0;i<10;i++){
      set_adc_channel(0);
      delay_us(200);
      currentADC=read_adc();
      vecCorr[i]=currentADC;
      set_adc_channel(1);
      delay_us(200);
      voltajeADC=read_adc();
      vecVolt[i]=voltajeADC;
      }
      auxCorr=0;
      auxVolt=0;
      for(i=0;i<10;i++){
      auxCorr=vecCorr[i]+auxCorr;
      auxVolt=vecVolt[i]+auxVolt;
      }
      delay_ms(500);
      current=(5.0*(auxCorr/10)/1023.0)/1.6665;
      voltaje=((5.0*(auxVolt/10)/1023.0)/0.151)-(current/10);
      power=voltaje*current;
      lcd_gotoxy(1,1);
      if(voltaje>9.999)
      printf(lcd_putc," %02.2fV %02.3fA ",voltaje,current);
      else
      printf(lcd_putc," %02.2fV %02.3fA",voltaje,current);
      lcd_gotoxy(1,2);
      if(power>9.999)
      printf(lcd_putc," %02.2fW ",power);
      else
      printf(lcd_putc," %02.2fW ",power);
      }
      }

      Eliminar
  22. Hola como podría hacer para medir voltaje negativo ya que en el adc no me tomará negativo

    ResponderEliminar
    Respuestas
    1. Hola, asi como esta no porque la tensión entra directamente (atenuada) al ADC, lo que tendrías que hacer es agregar una etapa intermedia con amplficador operacional como diferencial, y ahí no importaría si es negativa o positiva la tensión ya que mediría el delta o la diferencia de potencial.
      Saludos.

      Eliminar
  23. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  24. Hola, tengo un divisor de tensión y en el lcd solo me muestra voltaje=0,es decir, varío el potenciómetro y no muestra algo distinto en el display, qué hace falta o en qué estoy fallando gracias.

    #include <16lf1786.h>
    #device adc=12
    #fuses XT,NOWDT
    #fuses
    #use delay(clock=4000000)
    #define LCD_ENABLE_PIN PIN_B3
    #define LCD_RS_PIN PIN_B1
    #define LCD_RW_PIN PIN_B2
    #define LCD_DATA4 PIN_B4
    #define LCD_DATA5 PIN_B5
    #define LCD_DATA6 PIN_B6
    #define LCD_DATA7 PIN_B7

    #include

    void main()
    {
    int16 q;
    float p;
    setup_adc_ports(sAN0);
    setup_adc(ADC_CLOCK_INTERNAL);
    lcd_init();

    for(;;)
    {
    set_adc_channel(0);
    delay_us(100);
    q=read_adc();
    p=5.0*q/4096.0;
    printf(lcd_putc, "\nVoltaje=%01.2fV",p);
    delay_ms(100);
    }


    }

    ResponderEliminar
    Respuestas
    1. Es raro deberia andar, dejame ver cuando llego a casa la simulacion porque no tengo ese MCU para probarlo.
      Saludos.

      Eliminar
  25. buenas sebastian soy jose de caracas venezuela me podras ayudar con esta pregunta meservira la pantalla lcd nuemro (TM161ADA6) GRACIAS POR TU RESPUESTA

    ResponderEliminar
    Respuestas
    1. Hola habría que ver el datasheet para ver que comandos y registros tiene. Si es compatible con el controlador Hitachi HD44780 entonces no hay problema, si no es compatible hay que hacer una biblioteca distinta que lo controle. Saludos.

      Eliminar