Autor Tema: Presicion del conversor A/D  (Leído 7363 veces)

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

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
Presicion del conversor A/D
« en: 25 de Febrero de 2004, 02:14:00 »
Hola a todos
Estoy haciendo un termometro con el 16F818 y el sensor de temperatura LM335. Para leer este sensor uso la instruccion ADCIN, la cual me entrega la medicion en una var de tipo byte, con la que me da  255 para una tencion de 5v, por lo tanto puedo obtener el valor de la tencion en incrementos de 5/255= 19.6mV
Pero como el sensor me entrega 10mV/ºC, no puedo tener la precicion de 1 grado, y menos de una decima de grados. Asi que lo que quiero saber es como puedo hacer para achicar el rango de voltaje a medir y poder consegir mayor presicion, creo que eso se controla con las Vref de los registros asociados a la convercion A/D, pero no entiendo mucho de esto, asi que espero sus respuestas para solucionar esto.......

Desconectado jorgeansuini

  • PIC18
  • ****
  • Mensajes: 340
RE: Presicion del conversor A/D
« Respuesta #1 en: 25 de Febrero de 2004, 12:13:00 »
Buenas:

Si utilizas un 16f818 podés usar el a/d a 10 bits osea 1024 cuentas,por otro lado, depende hasta que valor de temperatura vas a medir pero podes desplazar la vref a un valor menor a vdd,como ser a 2,5volt y asi tendrias "pasos " de tension mas pequeños.-
saludos
Jorge

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Presicion del conversor A/D
« Respuesta #2 en: 25 de Febrero de 2004, 17:14:00 »
Hola Jorge
El rango de tension a medir es de 2,73 a 3,93V.
Te cuento que decidi provar la medicion de 10 bits y hice el siguiente programita:
asm
   device pic16F818,INTRC_OSC,WDT_OFF,PWRT_OFF,LVP_OFF,PROTECT_OFF,MCLR_OFF
endasm

define osc 8
DEFINE ADC_BITS 16 "Numero de bits en el resultado ADCIN
DEFINE ADC_CLOCK 3 "ADC clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 "ADC sampling time in microseconds

tension var word
decenas var byte
c var byte
unidades var byte
d var byte
decimales var byte
u var byte
i var word

INTCON = 0
OSCCON = %01110000
OSCTUNE = 0
SSPCON[5] = 0
ADCON1 = %00001110
TRISA = %00101111
TRISB = %00000000

SENSA:ADCIN 0,tension
      decenas = tension / 100
      lookup decenas,[126,48,109,121,51,91,31,112,127,115],c
      unidades = (tension - decenas*100) / 10
      lookup unidades,[126,48,109,121,51,91,31,112,127,115],d
      decimales = (tension - decenas*100) // 10
      lookup decimales,[126,48,109,121,51,91,31,112,127,115],u
      GOSUB DISPLAY
      GOTO SENSA
     
DISPLAY:for i=0 to 100
           porta.4=1
           portb = c
           pause 1
           porta.4=0
           porta.7=1
           portb = d
           pause 1
           porta.7=0
           porta.6=1
           portb = u
           pause 1
           porta.6=0
        next i
        return

Pero hace cualquier cosa
El problema esta en las varibles no?
que me dices???

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Presicion del conversor A/D
« Respuesta #3 en: 26 de Febrero de 2004, 05:48:00 »
Copiaste tal cual aqui el programa ??
Porque si es asi deberia darte un error el compilador, por variable inexistente...

En el tramo:

SENSA:ADCIN 0,tencion
decenas = tension / 100

Tienes dos variables diferentes, por lo tanto no es loco que te de cualquier cosa, si estas leyendo una variable que vaya a saber como se actualiza.

Por otro lado debes escribir ADC_BITS 10 en el define, no 16...

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Presicion del conversor A/D
« Respuesta #4 en: 26 de Febrero de 2004, 14:39:00 »
Si copie el programa tal cual, pero cuando vi como havia puesto tension me dio tanta verguenza que lo cambie y en esa parte me lo pase de largo.
Entonces defino ADC_BITS 10, y el resultado de la medicion lo guardo en una var de tipo word. No tengo en claro si puedo hacer estas cosas con las variables porque no se como trabaja el pbp( no tendrian que agregar un careto avergonzado).
Ya tengo un LM35, asi que voy a poner la Vref- en 0V y veo en que valor pongo la Vref+, otra cosita, ¿con este pic no se puede regular la Vref con algun registro no?


Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Presicion del conversor A/D
« Respuesta #5 en: 26 de Febrero de 2004, 15:35:00 »
No se si tendra referencia de tension interna regulable, no tengo la hoja de datos...
De todos modos asegurate que estes trabajando como dice la hoja de datos, normalmente las tensiones de referencia no estan activas, solo cuando programas los registros adecuadamente se activan.

No hay careto avergonzado porque no es necesario aqui.
Verguenza no es no saber y preguntar, sino saber y no ayudar
...

Lo que si es extraño que te lo haya compilado sin darte errores, sera un bug ??

PD: Usas la tabla Lookup para buscar el dato a enviar al display?
Porque no agregas los valores de A a F y muestras en hexadecimal el valor convertido directo?
Eso te ayudara a ver como te esta ayudando el tema de la referencia de tension...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jorgeansuini

  • PIC18
  • ****
  • Mensajes: 340
RE: Presicion del conversor A/D
« Respuesta #6 en: 26 de Febrero de 2004, 21:26:00 »
Buenas:
te mando el codigo de un termometro que funciona,solo deberias adaptar la rutina de display para que la haga multiplexada

"****************************************************************
"*  Name    : termometro.BAS                                    *
"*  Author  : Jorge ansuini                                     *
"*  Notice  : Copyright (c) 2004 jorge ansuini                  *
"*          : All Rights Reserved                               *
"*  Date    : 26/02/2004                                        *
"*  Version : 1.0                                               *
"*  Notes   : medicion de temperatura con lm35 y 16f977         *
"*          :                                                   *
"****************************************************************
    define osc 8
    digit1 VAR Byte
    digit2 VAR Byte
    digit3 VAR Byte
    veces var byte
    cuenta var word
    intermedia VAR word
   
      TRISA = %11111111  
   ADCON1 = %10001110    
   ADCON0 = %11000101   
    TRISB = %00000000
    TRISC = %00000000
    TRISD = %00000000

    symbol digi1=portb
    symbol digi2=portc
    symbol digi3=portd
inicio:
     cuenta=0
     for veces= 0 to 4
    ADCON0.2 = 1      " arranca Conversion

termino:
    Pause 20
   IF ADCON0.2 = 1 Then termino
   intermedia.highbyte = ADRESH
   intermedia.lowbyte = ADRESL   
    cuenta=intermedia+cuenta
     next veces
    gosub display  
    pause 500
    goto inicio
    end
display:

    digit3 = cuenta dig 2
   digit2 = cuenta dig 1
   digit1 = cuenta dig 0
   
 LOOKUP2 DIGIt3,[63,6,91,79,102,109,125,7,127, 111],digi3
 LOOKUP2 DIGIt2,[63,6,91,79,102,109,125,7,127, 111],digi2
 LOOKUP2 DIGIt1,[63,6,91,79,102,109,125,7,127, 111],digi1
 return

Cualquier cosa pregunta.
Jorge

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Presicion del conversor A/D
« Respuesta #7 en: 26 de Febrero de 2004, 23:12:00 »
vAMOS POR PARTE
mglsoft:
             eL PROGRAMA ME LO CONFIGURO PORQUE EN TODOS LADOS PUSE ``TENCION´´ Y NO TUBE PROBLEMA CON ESO. LOS DISPLAY SON ESOS DE 7 SEGMENTOS Y EL LOOKUP LO USO PARA PONER EN EL PORTB LOS UNOS Y CEROS QUE NECESITO PARAS VER EL NUMERO, ES DECIR , SI QUIERO MOSTRAR EL NUMERO 3 EN EL DISPLAY, HAGO PORTB = 121, Y CON ESTO ENCIENDO LOS SEGMENTOS DEL DISPLAY QUE ME MUESTRAN EL NUMERO 3.
JORGE:
           Para que es el bit 7 de ADCON1?, no entiendo que hace.
           En el programa utilizas el for Next para tomar la medicion 5 veces y luego sacas el promodio en la table que usas.
           No tengo el 16F977, pero en el 16F818 que estoy usando tengo una resolucion de 10 bit en la convercion y tambien los almacena en los registros ADRESH y ADRESL, y si yo hago
intermedia.highbyte = ADRESH
que me guarda en intermedia.highbyte: los 8 bit mas altos de los 10 bit de la convercion o los mas bajos.

Bueno espero no abusar de su hospitalidad

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Presicion del conversor A/D
« Respuesta #8 en: 27 de Febrero de 2004, 06:07:00 »
EJMC

El bit 7 del registro ADCON1 (del datasheet del 16F877, pienso que es igual para el otro) te permite justificar el resultado de la conversion a la derecha o a la izquierda tomando los 16 bits.

Si te fijas como lo tienes, esto permite que los 6 bits mas significativos del resultado de la conversion se pongan en cero.
por lo tanto cuando leas el maximo valor posible tendras todo AdressL en 1 (FF) y AdressH el 00000011 (03).
De esta forma el maximo valor del conversor sera de 3FF (10 bits).

En cuanto a la rutina de multiplexado de display que te paso Jorge, cuando el toma AdressL y AdresH y los pasa a Intermedia.Lowbyte e Intermedia.Higbyte esta pasando los 10 bits de la conversion a los dos bytes de la Word llamada Intermedia.
Esto es un formato poco comentado del PBP, pero altamente eficiente.
En la Word tendrs los 10 Bits de la conversion.
Decia que puedes hacer mas eficiente el multiplexado si lo disparas a traves de la interrupcion del timer0, asi se ejecuta en tiempos exactos.
Eso si, la cuenta hacela apenas terminas de hacer el promedio de la conversion, no dentro de la rutina de multiplexado, para optimizar la interrupcion, ademas podes tener valores erroneos o de dos conversiones diferentes, segun donde interrumpa...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Presicion del conversor A/D
« Respuesta #9 en: 27 de Febrero de 2004, 06:14:00 »
Ahora caigo como diablos lo hace CCS !!
Si pones el bit 7 de ADCON1 en 1 tendras un resultado de conversion de 10 bits, pero el bit mas alto vale 32768, es lo mas parecido a 16 bits !!

Pruebalo y veras que tienes 65472 valores con una conversion a 10 bits !!

Alli esta el truco del que hablaba en su momento alguien del foro !!
Como es egoista (no quiso compartirlo con nosotros), por eso no recuerdo su nombre..je..je
..

Gracias por lo de egoista, seguramente lo merezco
nadie es perfecto  

hay un escrito muy antiguo que dice mas o menos asi:

No le des peces al hambriento, solo enseñale a pezcar.
si le das peces una vez, deberas darle siempre
si le enseñas a pezcar nuca mas tendra hambre.


yo aclare en su momento que no podia publicarlo porque era parte de un ensayo del equipo de tareas y era una falta de respeto
pubicar algo que no es de mi total propiedad intelectual
ademas me enviastes un correo privado pidiendo  
que te explicara y te enviara todo lo que tenia al respecto
sobre  conversion en 16 Bits. por mail privado,
cuando el tema era publico, que paso ?, lo querias para vos solo?
tengo guardado el mensaje
seguramente todos nos guardamos alguna carta en la manga
o no???
suerte veo que por lo menos de algo sirvio el post
creo que deberias estar agradecido
un beso
Luis Frino
Mar del Plata



 
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Presicion del conversor A/D
« Respuesta #10 en: 27 de Febrero de 2004, 08:26:00 »
Interesante, pero no lo acabo de entender. Puedes poner un ejemplo donde indiques los bits que usas de más.
No se si será así:
10bits-> BYTE alto+ BYTE bajo. Para 10bits tomamos sólo los dos bits más significativos del bajo. Te refieres a tener también en cuenta los restantes 6bits??
Saludos desde Huelva (ESPAÑA)

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Presicion del conversor A/D
« Respuesta #11 en: 27 de Febrero de 2004, 09:18:00 »


No estoy borracho, el CCS lo permite, pero no entendia como lo hacia...

Imaginate que lees una señal que esta a tope del rango de entrada al conversor.
Esta señal vale:

          AdressH     AdressL
          00000011  11111111

con el bit 7 de ADCON1 en 1 (justifica a la izquierda el valor leido).

Pero si lo pones en 0 justifica a la derecha por lo tanto el valor queda asi:

          AdressH     AdressL
         11111111  11000000

Por lo tanto estas convirtiendo parecido a 16 bits !!
En un conversor cuya señal esta correctamente filtrada o es muy estable la medicion (no hay ruido) el bit de menor peso pero mas significativo aun para el resultado sera el bit 5 de AdressL, por lo tanto el resultado varia en +/- 64 cuentas con su cambio, sobre un total de 65472 cuentas posibles !!

Matematicamente da y bien, siempre y cuando sea bueno el circuito a medir.
Yo lo probe en un protoboard y me anduvo tal cual te digo, con el conversor "suelto", es decir convirtiendo a lo que de, casi no se mueve.

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jorgeansuini

  • PIC18
  • ****
  • Mensajes: 340
RE: Presicion del conversor A/D
« Respuesta #12 en: 27 de Febrero de 2004, 11:03:00 »
Buenas:
La verdad,muy interesantes las conclusiones ,por mi parte creo que no tengo mas que opinar,solo aclaro que el micro que utilizo es el 16f877 (error de tipeo) y que hago 5 mediciones pero no promedio sino que las sumo a todas por una razón: el conversor lee 1023 cuentas a 5 volts,si lo sumo 5 veces me da aproximadamente 5000 cuentas, que serian 500 grados centigrados del lm35.-
saludos
jorge

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Presicion del conversor A/D
« Respuesta #13 en: 28 de Febrero de 2004, 09:38:00 »
A ver, estoy medio mariado, voy a leer laas cosas tranquilito y luego les cuento

Desconectado LuisFrino

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 140
    • Electronica Microcontroladores Ilumunacion Decorativa
RE: Presicion del conversor A/D
« Respuesta #14 en: 28 de Febrero de 2004, 11:14:00 »
Gracias por lo de egoista, seguramente lo merezco
nadie es perfecto

hay un escrito muy antiguo que dice mas o menos asi:

No le des peces al hambriento, solo enseñale a pezcar.
si le das peces una vez, deberas darle siempre
si le enseñas a pezcar nuca mas tendra hambre.


yo aclare en su momento que no podia publicarlo porque era parte de un ensayo del equipo de tareas y era una falta de respeto
pubicar algo que no es de mi total propiedad intelectual
ademas me enviastes un correo privado pidiendo
que te explicara y te enviara todo lo que tenia al respecto
sobre conversion en 16 Bits. por mail privado
,
cuando el tema era publico, que paso ?, lo querias para vos solo?

tengo guardado el mensaje
 
seguramente todos nos guardamos alguna carta en la manga
o no???
suerte veo que por lo menos de algo sirvio el post
creo que deberias estar agradecido
un beso
Luis Frino
Mar del Plata




 

anything