Medidor de Voltaje elemental con PIC 16f877

Buen día Amigos. Estoy tratando de hacer un código para hacer un medidor de voltaje con un PIC 16f877 con salida indicadora de 8 leds por el puerto B. La lectura máxima debe ser de 80 Vdc y por eso voy a usar un divisor de tensión que a full escala le entren al pin A3 5v máximo. Pienso que debo dividir esos 5vdc entre 8, de manera de tener 8 posibles salidas con pasos de 10 volts dc desde fuera del divisor de tensión, hasta un máximo de 80Vdc. Como 5/8 = 0.625 estos valores son los que debería registrar y convertir a digital el controlador, pero no estoy seguro de que sea así. El Código sería el siguiente, pero les agradezco que me corrijan los errores que tiene.

Código:
; Codigo para medidor de voltaje elemental.
; Palabra de configuración.
  Device XT_OSC, WDT_OFF, PWRT_ON, BOD_OFF
  DEFINE OSC 4

; Configuracion analogica.
  DEFINE ADC_BITS     10    \'10 bits de resolucion.
  DEFINE ADC_SAMPLEUS 50    \'Tiempo de muestreo en us.
  DEFINE ADC_CLOCK     3    \'Este DEFINE lo recomienda el manual de PBP.  

  Voltaje var word          \'Variable para guardar el resultado.
  ADCON0 = %11000000        \'Para habilitar red interna RC.
  ADCON1 = %10000000        \'Registros ADRESH:ADRESL habilitados.
  ANSELH = %00000000        \'Coloca los siete primeros canales como analógicos.
  Trisa = %11111111         \'Puerto A como entrada.
  Trisb = %00000000         \'Puerto B como salida.
  
; Programa.

  Inicio:
  ADCIN 3, Votaje                \'Lee el canal 3 y lo coloca en Voltaje.
  if Voltaje > 5 Then Uno        \'Para un rango entre 4.375 y 5 va a Dos.
  if Voltaje > 4.375 Then Dos 
  if Voltaje > 3.750 Then Tres   \'Entre 3.750 y 4.375 Va a Tres.
  if Voltaje > 3.125 Then Cuatro \'Entre 3.750 y 3.125 va a cuatro.
  if Voltaje > 2.5 Then Cinco    \'Entre 3.125 y 2.5 va a cinco.
  if Voltaje > 1.875 Then Seis   \'Entre 2.5 y 1.875 va a seis.
  if Voltaje > 1.25 Then Siete   \'Entre 1.875 y 1.25 va a siete.
  Portb = %00000001              \'Si el Voltaje es menor a 1.25 (10 volts)-
                                 \'Enciende el pin bo.
  goto Inicio
 Uno Portb = %10000000           \'Enciende b7
  goto Inicio
 Dos Portb = %01000000           \'Enciende b6
  goto Inicio
 Tres Portb = %00100000          \'Enciende b5
  goto Inicio
 Cuatro Portb = %00010000        \'Enciende b4
  goto Inicio
 Cinco Portb = %00001000         \'Enciende b3
  goto Inicio
 Seis Portb = %00000100          \'Enciende b2
  goto Inicio
 Siete Portb = %00000010         \'Enciende b1
  goto Inicio

  End ...

Disculpen pero donde aparece el símbolo ">" va el símbolo " >" (Mayor que). Pasa que copié y pegué el código desde mi PC. El lenguaje es PiC BASIC PRO. No se si se pueda trabajar en el PIC con esos valores decimales que he colocado. Les agradezco mucho su colaboración. Hasta luego.



Mejor por favor revisan el código adjunto porque hay otros errores cuando copié y pegué. :confused:
 

Adjuntos

  • Codigo Medidor elemental de Voltaje..txt
    1.8 KB · Visitas: 18
Última edición:
Ahí falta convertir a voltaje... ADCIN devuelve un valor del ADC en formato binario determinado por la resolución que en tu caso es de 10 bits, es decir que con un voltaje de 0 a 5V obtendrá de 0 a 1023 (número entero)... por eso falta convertir a voltaje (número de coma flotante).

También puedes comparar directamente en ADC sin necesidad de convertir a voltaje... sería 1023/8 = 127... entonces 127 = 10V, 254 = 20V, etc...

Saludos.
 
Gracias ByAxel. Esto era lo que necesitaba saber. Solo me falta verificar que los DEFINE en la configuración analógica del código son correctos y los registros ADCON0, ADCON1 y ANSELH están bien porque coloque los valores del manual de PBP3 y ellos según parece trabajan con un PIC 16f887 y no con el 16f877 que es el que estoy usando. Si me puedes explicar como convierto el valor digital a número de coma flotante te lo agradezco, aunque con la comparación que me indicaste de la resolución de 1023/8 sería suficiente pero me gustaría saber lo de la coma flotante. Estoy enviando el código corregido por la resolución de 1023 y para un valor medido mayor a este, pongo encendidos todos los leds del puerto B, aunque no se debería subir de ese valor. :) :apreton: (y)
 

Adjuntos

  • Codigo Medidor elemental de Voltaje..txt
    2 KB · Visitas: 42
PBP no soporta directamente números decimales, para esto puedes probar http://melabs.com/resources/fp.htm (FP.ZIP)... no estoy seguro sin funciona bien.

Trabajar con decimales en PICs de 8 bits no lo veo recomendable puesto que consumen mucha memoria... se puede igual trabajar con enteros para obtener decimales... por ejemplo si que quiere sumar 1.45 se utiliza 145 (entero) solo que está multiplicado por 100...
 
Gracias ByAxel. Creo que entendí. Si cada paso de voltaje de mi proyecto son 0.625 volts multiplicado por 100 es 625 (10 volts) y eso corresponde a 127 (10 volts) de la escala de bits pasado a decimal. Así puedo hacer una tabla de valores para tener presente los valores de voltaje que estoy utilizando y tener cierto control de los niveles de voltaje. Un millón de gracias ByAxel. Supongo que para trabajar cómodamente con decimales debe usarse lenguaje C u otro lenguaje similar. Este proyecto puede aplicarse a un indicador de temperaturas desde 0 ºC a 80 ºC (8 niveles) colocando en el divisor de voltaje un termistor y un potenciómetro para calibrar. También puede hacerse un vúmetro con el potenciómetro. Que interesante todo esto. Agradecido altamente por las enseñanzas. Me despido por los momentos. Saludos.
 
Gracias por aclararme eso papirrin. No se que compilador tengo instalado en mi PC. Solo se que para programar en PBP abro en mi PC un icono que dice MicroCode Studio. Feliz día. Saludos.
 
Buenos Días amigos. Hoy les traigo el diagrama en Proteus del Medidor elemental. El codigo lo programe en PBP y lo compilé en el MicroCode Studio. Tuve que corregir algunos errores para que corriera bien. Eliminé los registros ANSEL Y ANSELH porque verifiqué en las hojas de datos y no existen para el 16f877. Si existen en el 16f887. Con el ADCON0 y ADCON1 es suficiente para el 16f877. Otros pequeños cambios están en el código que les envío pero esencialmente es igual al anterior excepto que en el diagrama de Proteus coloqué la salida por el puerto D y no por el puerto B como dice el código que envío, esto lo hago así porque en mi entrenador los leds están en el puerto D y para una futura implementación no tengo que cambiar el código. Todo lo demás está bien. En la entrada analógica A3 le coloqué un potenciómetro alimentado con 9 Volts dc. Esto para que en la simulación al variar el potenciómetro se vayan encendiendo los Leds. Este circuito se puede usar para implementar un proceso industrial ya que si estoy registrando por ejemplo una temperatura en la entrada de algo, que digamos sea alta media o baja u otra entonces a la salida se cierra o abre una válvula que sea, digamos alto medio o bajo u otro. También la entrada puede ser el nivel de un tanque (Sensor) de algún valor y en la salida va a un actuador que llena o vacía mas el tanque. Esta forma de trabajar tengo entendido se usa con la Lógica Difusa porque esta usa la condicional SI.......Condición (Alto, Medio o Bajo) .....ENTONCES ....Condición (Tal o Cual). Gracias por la ayuda que he recibido. Que tengan un feliz día y muchos saludos. :D :D
 

Adjuntos

  • Medidor Elemental de Voltaje..rar
    16.9 KB · Visitas: 161
  • Codigo Medidor elemental de Voltaje..txt
    2 KB · Visitas: 125
Atrás
Arriba