Multímetro de Banco - Versión 1.0

Después de realizar el multímetro de banco anterior, he decidido mejorar el mismo creando este nuevo proyecto en su versión 1.0, lo cual quiere decir que con el tiempo se irá mejorando y agregando funciones.
En este link se puede leer el principio de funcionamiento (lo que es medición y procesamiento de la señal), ya que funciona igual. http://electgpl.blogspot.com.ar/2014/04/multimetro-de-banco-con-datalogger.html
Se le incorpora la medición de frecuencia lo cual también pueden encontrarlo en el siguiente link http://electgpl.blogspot.com.ar/2014/03/frecuencimetro-hasta-30khz.html
Por último se le agrega la medición de diodos, y continuidad visual (se le puede agregar alerta acústica donde está el led, con un transistor y un buzzer).
El funcionamiento de todo el sistema es en base a un menú, el cual se realiza con la sentencia Switch Case, y se opera mediante un único pulsador.
Al presionar el pulsador se incrementa la variable menú en una unidad, y cambia de Case en la sentencia Switch, dentro de cada Case se procede a realizar la función especifica. Como se pueden imaginar se puede incrementar la cantidad de Cases para incrementar la cantidad de funciones.
Por el momento no he realizado funciones (lo cual quedaría mucho mas prolijo) porque mi idea es que sea de fácil comprensión para aquellos que recién se inician.
Se utiliza un multiplexor/demultiplexor Analógico 4051 que cumple la función de switchear digitalmente la entrada analógica del MCU para cambiar las diferentes funciones, el mismo se comanda por las direcciones binarias.
El circuito funciona con 5V por ejemplo provenientes de un puerto USB o de un pack de pilas (Con su regulador de tensión a 5V).


#include <16F883.h>
#device adc=10
#FUSES XT,NOWDT
#use delay(clock=4000000)
#include <LCD.C>
void main(){
   int16 valorADC, frecuencia;
   int menu=1;
   float corriente, tension, diodos, temperatura;
   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   lcd_init();
   while(TRUE){      
      if(input(PIN_C1)==1){
         delay_ms(200);
         menu++;
         if(menu>6)
         menu=1;
      }    
      switch(menu){
      case 1:
         lcd_gotoxy(1,1);
         printf(lcd_putc,"VOLTIMETRO    DC");
         output_low(pin_c4);
         output_low(pin_c5);        
         set_adc_channel(0);
         delay_us(20);
         valorADC = read_adc();
         tension = 5.0 * valorADC / 1024.0;        
         lcd_gotoxy(1,2);
         printf(lcd_putc,"VM:10V    %1.3fV",tension*2);
         break;
      case 2:
         lcd_gotoxy(1,1);
         printf(lcd_putc,"AMPERIMETRO   DC");
         output_high(pin_c4);
         output_low(pin_c5);
         set_adc_channel(0);
         delay_us(20);
         valorADC = read_adc();
         corriente = (5.0 * valorADC / 1024.0) * 0.2118;  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"IM:1A     %1.3fA",corriente);
         break;
      case 3:
         lcd_gotoxy(1,1);
         printf(lcd_putc,"FRECUENCIMETRO  ");
         set_timer1(0);
         setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
         delay_ms(500);
         setup_timer_1(T1_DISABLED);
         frecuencia=get_timer1();
         lcd_gotoxy(1,2);
         printf(lcd_putc,"       %6lu Hz",frecuencia*2);
         break;
      case 4:
         lcd_gotoxy(1,1);
         printf(lcd_putc,"DIODOS Y LEDS   ");
         output_low(pin_c4);
         output_high(pin_c5);
         set_adc_channel(0);
         delay_us(20);
         valorADC = read_adc();
         diodos = 5.0 * valorADC / 1024.0;        
         lcd_gotoxy(1,2);
         printf(lcd_putc,"          %1.3fV",diodos);
         break;
      case 5:
         lcd_gotoxy(1,1);
         printf(lcd_putc,"TEMPERATURA     ");
         output_high(pin_c4);
         output_high(pin_c5);
         set_adc_channel(0);
         delay_us(20);
         valorADC = read_adc();
         temperatura = (5.0 * valorADC / 1024.0) * 100;        
         lcd_gotoxy(1,2);
         printf(lcd_putc,"          %2.1f°C",temperatura);
         break;      
      case 6:
         lcd_gotoxy(1,1);
         printf(lcd_putc,"CONTINUIDAD     ");
         lcd_gotoxy(1,2);
         if(input(PIN_C2)==0){
            printf(lcd_putc,"CIRCUITO CERRADO");
            output_high(pin_c3);
         }
         else{  
            printf(lcd_putc,"CIRCUITO ABIERTO");
            output_low(pin_c3);
         }           
         break;        
      default:
         lcd_gotoxy(1,1);
         printf(lcd_putc,"    **ERROR**   ");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"   [REINICIAR]  ");     
      }
   }
}

9 comentarios:

  1. Respuestas
    1. Hola, podes poner hasta 1.06A ya que la R que usa como shunt es de 4.7R, si vas a hacer circular 1A, tene en cuenta la potencia de la resistencia.
      Al menos 5W cerámica.
      Saludos.

      Borrar
  2. Exelente trabajo, didáctico y útil para quienes trabajamos en electrónica....Felicitaciones y Dios los bendiga...

    ResponderBorrar
  3. Mi estimado amigo,seria bueno ampliar la medida de 0.01 a 100voltios...bendiciones y muchas gracias

    ResponderBorrar
    Respuestas
    1. Buen dia!, es verdad, tengo que actualizar este medidor, últimamente me dedique a hacer el de alterna y deje medio perdido este. Pero ya lo voy a retomar!
      Saludos.

      Borrar
  4. saludo a este circuito de le puede agregar para medir corriente alterna

    ResponderBorrar
  5. Muy bueno ¡!!!!.e encanta q use un LCD
    Alguna vez arme uno parecido, también basado en pic, era medio complicada la visualización por q eran 4 displays de 7 segmentos. SuperProbe creo q se llamaba

    ResponderBorrar