Autor Tema: Termometro digital  (Leído 8029 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado yukardo

  • PIC16
  • ***
  • Mensajes: 106
Termometro digital
« en: 07 de Noviembre de 2007, 19:44:37 »
Saludos.

Soy nuevo en este foro, pero no soy nuevo trabajando con PIC pero si hay cosas que no conozco muy bien.

Estoy diseñando un termometro digital de 3 digitos y me gustaria saber como debo comenzar a trabajar

Estoy trabajando en Mbasic que es muy parecido al Pic Basic, el PIC que estoy usando es el 16F876a.

Espero que me ayuden que debo hacer para comenzar.

Gracias por su ayuda de antemano.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Termometro digital
« Respuesta #1 en: 07 de Noviembre de 2007, 20:20:58 »
Hola, Bienvenido. Si usas Mikrobasic puedes darte una pasado por loe ejemplitos de Mikrobasic y Proteus ver la parte de adquisicion de datos con ADC para checar el funcionamiento basico.

Despues date una hojeada con los diferentes sensores que aca hemos usado el LM35DZ los TN75 TC74 etc. PAra todos ellos existen codigos adaptables a MKB puedes buscar dentro del subforo de PICBasic y adaptarloa tus rutinas de MKB.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Termometro digital
« Respuesta #2 en: 07 de Noviembre de 2007, 20:31:08 »
Me ganaste  :(

Hola, Bienvenido. Si usas Mikrobasic puedes darte una pasado por loe ejemplitos de Mikrobasic y Proteus ver la parte de adquisicion de datos con ADC para checar el funcionamiento basico.

Despues date una hojeada con los diferentes sensores que aca hemos usado el LM35DZ los TN75 TC74 etc. PAra todos ellos existen codigos adaptables a MKB puedes buscar dentro del subforo de PICBasic y adaptarloa tus rutinas de MKB.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado yukardo

  • PIC16
  • ***
  • Mensajes: 106
Re: Termometro digital
« Respuesta #3 en: 07 de Noviembre de 2007, 22:10:22 »
Yo voy a usar el sensor LM335 de la national

Lo que si necesito es saber como empezar lo que es la conversion analogica digital.

Yo estoy trabajando con el lenguaje Mbasic nose si alguien lo ha utilizado, pero podria trabajar con el picbasic si este trabaja con el 16F876A.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Termometro digital
« Respuesta #4 en: 07 de Noviembre de 2007, 22:17:12 »
Y cito: 

Hola, Bienvenido. Si usas Mikrobasic puedes darte una pasado por loe ejemplitos de Mikrobasic y Proteus ver la parte de adquisicion de datos con ADC para checar el funcionamiento basico.

Despues date una hojeada con los diferentes sensores que aca hemos usado el LM35DZ los TN75 TC74 etc. PAra todos ellos existen codigos adaptables a MKB puedes buscar dentro del subforo de PICBasic y adaptarloa tus rutinas de MKB.

Amigo no lo tomes como si alguien no te quiere ayudar, pero ahi estan las respuestas de lo que necesitas. Si captas el principio de los ADC's solo falta se adapte al codigo de tu compilador.



Verificando el codigo de tu compilador deberias Usar la instruccion ADIN cuya sintaxis:

ADIN pin,clk,adsetup{,var}

Pin es el canal, CLK es el sampleo con 3 valores, adsetup es como debes configurar el registro ADCON u otro dependiendo del PIC y Var es donde se guarda.

Segun el manual de tu compilador un ejemplo:

temp var word    ;temp is now a word sized variable
AN0 con 0 ;this sets the pin AN0 / RA0,
CLK con 2    ;CLK options are 0, 1, 2, 3 (0-2 are based on int cycles)
              ;CLK option 2 is based on 1/16 of the external osc speed
              ;the CLK slow does down the sampling time.
ADSETUP con %10001110 ;sets up the ADCON1 register
                               ;AN0 / RA0 is now analog
main
 ADIN AN0,CLK,ADSETUP,temp
                           ;loads the variable temp with the sample
« Última modificación: 07 de Noviembre de 2007, 22:23:48 por navaismo »
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Termometro digital
« Respuesta #5 en: 08 de Noviembre de 2007, 03:51:54 »
.....CLK es el sampleo con 3 valores.....

Si no recuerdo mal, el valor 3 es para escoger el tiempo de conversión del RC interno (19.6 µsegundos o algo asi).

Revisa esto Navaismo y tu también yukardo:
http://www.todopic.com.ar/foros/index.php?topic=14917.msg126318#msg126318
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado yukardo

  • PIC16
  • ***
  • Mensajes: 106
Re: Termometro digital
« Respuesta #6 en: 08 de Noviembre de 2007, 10:48:41 »
Hasta ahora tengo los siguiente:

temp var word
an0 con 0
clk con 2
adsetup con %11000000

main:

adin an0,clk,adsetup,temp

ahora mi duda es la siguiente, despues que se realiza la conversion A/D en que numeracion obtengo el resultado en la variable temp, en binario o en decimal.


Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Termometro digital
« Respuesta #7 en: 08 de Noviembre de 2007, 12:17:20 »
En ambas, aunque suene extraño el compilador interpreta ambas o mas bien la binaria y la puedes desplegar de manera decimal dependiendo de lo sensado.

.....CLK es el sampleo con 3 valores.....

Si no recuerdo mal, el valor 3 es para escoger el tiempo de conversión del RC interno (19.6 µsegundos o algo asi).

Revisa esto Navaismo y tu también yukardo:
http://www.todopic.com.ar/foros/index.php?topic=14917.msg126318#msg126318

Pongo que son 3 valores porque su compilador asi lo dice, como veras el ejemplo del manual explica que valores puede tomar clk. Osea su compilador ya trae por defecto 3 constantes para ello.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Termometro digital
« Respuesta #8 en: 08 de Noviembre de 2007, 15:05:33 »
Que tal yukardo,

Vas muy bien. Ahora lo que tienes que hacer es usar las matematicas y aplicarlas en tu codigo para obtener el valor de la temperatura.
Vayamos desde el principio;

Con la funcion qye ya tienes (adin an0,clk,adseupt,temp). Lo que estas haciendo es simplemente obtener el valor Digital de una senial analogica, ese valor no representa el valor real de la temperatura.
Seamos mas explicitos. El sensor que vas a usar en un LM335, este sensor trabaja con la escala absoluta, es decir, con grados Kelvin y te dice que su resolucion es 10mV/K. Esto quiere decir que la salida del sensor incrementara su valor en 10mV por cada grado Kelvin incrementado. Esto por lo tanto significa que si el sensor te entrega 100mV, significa que estas midiendo 10 grados Kelvin.
Ahora el bien, el ADC del microncontrolador que estas usando puede trabajar en 8 o 10 bits. Suponiendo que estas trabajando en 10 bits, y que el voltaje de referncia del ADC es de 5V, su resolucion se define como: 5V/2^10 = 5V/1024bits = 4.8828 mV/bit.

Ahora bien, tomando nuestro ejemplo, el sensor te entrega 100mV a su salida, lo mides son el ADC, este te entregara en su conversion un 14 hex, o lo que es lo mismo un 20 decimal.Aqui es donde aplicas las matematicas. Suponiendo que tu no sabes el voltaje de salida del sensor, simplemente la salida la conectas al canal ADC y el convertidor te dice que obutvo un 20 decimal (14 hexadecimal), que temperatura es la que me esta diciendo el sensor que esta midiendo?
La respuesta es:
a) Encontrar el voltaje que entrega el sensor, aplicando la ecuacion: Vsens = Resolusion del ADC * Resultado del ADC  (recuerda qeu tu resultado esta en la variable temp)
    Sustituyendo: Vsens = 4.8828 mV * 20 = 97.656 mV
b) Encontrar su equivalente en grados kelvin, usando la ecuacion: Temperatura = Vsens / Resolucion del sensor
    Sustituyendo: Temperatura = 97.656 mV /(10mV/K) = 9.7656 grados kelvin

Como te puedes dar cuenta todo esto esta en valores con punto decimal, lo que se conoce como punto flotante, pero PBP no maneja este tipo de variables, asi que una recomendacion es que uses otro compilador que las maneje o bien desarrollar un algoritmo por ti mismo del punto flotante.

Existe un algoritmo para hacer esto sin necesidad de usar punto flotante, y es una tecnica que le llamo conversion a punto fijo y asi los valores se convierten en enteros de hasta 16 bits.

Te lo voy a explicar para el sensor LM35 que es para grados centigrados y te tocara la tarea de aplicarlo para tu sensor.

Ok, aqui voy.
El sensor LM35 puede medir hasta una temperatura maxima de 125 C, y tiene una resolucion de 10mV/C, esto quiere decir que cuando mida la temperatura maxima estaria entregando 1.25V Para eliminar este punto, multipliquemos este valor por 1000, es decir 1.25 * 1000 = 1250, a este valor le llamaremos Cuantizador, es decir Cuantizador = 1250

Ahora bien, vamos a suponer que nuestro sensor nos entrega un voltaje cuyo valor desconocemos, pero que cuando lo leemos en el ADC nos enentrega un 52 decimal (34 hexadecimal).
Lo primero que vamos a hacer es multiplicar el valor del ADC por 10, esto es 52 * 10 = 520, este sera nuestro nuevo valor "virtual" del ADC.
Ahora ese valor lo multiplicamos con el valor del Cuantizador, pero solamente tomamos los 16 bits centrales de resultado de 32 bits, esto se hace con el operador de PBP */
Es decir seria algo asi: Resultado = 520 */ Cuantizador
Para obtener la parte entera de la temperatura dividimos el resultado entre 100, es decir: TempE = Resultado /100
y para obtener la parte decimal buscamos el residuo de la division entre 100, esto es: TempD = Resultado//100
Para mostrarlo en una LCD, colocamos la instruccion LCDOUT    (DEC TempE,".",DEC TempD,4,"C")
Y listo ya tenemos el valor de la temperatura medida con el sensor LM35.

Esto es un metodo muy bueno para no usar punto flotante con este tipo de sensores.

Saludos y espero te sea de utilidad.

Elreypic.

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Termometro digital
« Respuesta #9 en: 08 de Noviembre de 2007, 17:16:45 »
.....a este valor le llamaremos Cuantizador.....

¿Del libro de Les Jonhson?
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Termometro digital
« Respuesta #10 en: 08 de Noviembre de 2007, 18:49:34 »
Que tal Mario,

Efectivamente, en el libro de Les Jonhson le nombra asi: Quanta.

Saludos.

Elreypic.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Termometro digital
« Respuesta #11 en: 08 de Noviembre de 2007, 18:58:37 »
Hola yukardo!

DogFlu66 diseño un muy buen Acondicionador de señal para LM35x que seguramente puede ayudarte con el hard.

Este es el esquema:



En el link de arriba tienes explicado como funciona.

Saludos.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado yukardo

  • PIC16
  • ***
  • Mensajes: 106
Re: Termometro digital
« Respuesta #12 en: 08 de Noviembre de 2007, 19:33:23 »
Gracias por el circuito esta muy bueno.

Pero yo en este caso no necesito tanta presicion de alli que no creo que me haga falta utilizar ese hardware. De todos modos lo tendre en cuenta.

Cuando finalice este proyecto lo colocare en el foro completo tanto hardware como software asi como las tarjetas PCB que realice.

Por otro lado ya hice el software. aqui se los dejo para que lo chequeen.

; Variables

temp var word
an0 con 0
clk con 2
adsetup con %11000000
result var byte
digt var byte
cuant var word
tempE var word
tempD var word
digito1 var word
digito2 var word
digito3 var word
conta2 var byte
conta3 var byte
band var byte

band=0
cuant=1730
;programa

;interrupcion
oninterrupt tmr0int,refresh
settmr0 tmr0int1

enable tmr0int

main:

adin an0,clk,adsetup,temp
temp=temp*10
temp=temp*/cuant
tempE=temp/100
tempD=temp//100
digt=tempE-273


if digt>99 then
gosub cont3
else
if digt>9 then
gosub cont2
else
digito1=digt
goto main
endif
endif

cont2
while digt>9
digt=digt-10
conta2=conta2+1
wend
digito2=conta2
return

cont3
while digt>99
digt=digt-100
conta3=conta3+1
wend
digito3=conta3
return

refresh

branch band,[dig1, dig2, dig3]

dig1
digt=digito1
low C2
high C0
band=band+1
gosub digito
resume

dig2
digt=digito2
low C0
high C1
band=band+1
gosub digito
resume

dig3
digt=digito3
low C1
high C2
band=0
gosub digito
resume

digito
lookup digt,[%00111111,%00000110,%01011011,%01001111,%01100110,%01101101,%01111100,%00000111,%01111111,%01100111],result
portb=result
return


Voy a ver si lo puedo montar en Proteus para probarlo. Cualquier error o sugerencia escribanme.

Desconectado yukardo

  • PIC16
  • ***
  • Mensajes: 106
Re: Termometro digital
« Respuesta #13 en: 09 de Noviembre de 2007, 14:41:51 »
Lo probe en Proteus y no me funciono debe ser que tengo algun error en el software

Desconectado yukardo

  • PIC16
  • ***
  • Mensajes: 106
Re: Termometro digital
« Respuesta #14 en: 30 de Noviembre de 2007, 01:23:09 »
Aqui les dejo el programa del termometro que realice. El sensor es un LM335 que trabaja en grados kelvin.



temp var word
aux var word
sign var bit
bval var word


output C6
AN0 con 0
clk con 2
adsetup con %10000000
pause 500
LCDWRITE B7\B5\B6, portb.nib0, [INITLCD1, INITLCD2, TWOLINE, CLEAR, HOME, SCR]

main
adin AN0,clk,adsetup,temp
temp=temp+1
temp=temp*10
temp=temp*5
temp=temp/1024
temp=temp*100
temp=temp/10
if temp>273 then
aux=temp-273
else
aux=273-temp
sign=1
endif


LCDWRITE B7\B5\B6, portb.nib0, [CLEAR, HOME, "la temperatura"]
pause 1000
if sign=0 then
LCDWRITE B7\B5\B6, portb.nib0, [CLEAR, HOME, "actual es"," ", dec aux," ", "C"]
pause 1000
LCDWRITE B7\B5\B6, portb.nib0, [CLEAR, HOME, "o", " ", dec temp," ", "K"]
pause 1000
else
LCDWRITE B7\B5\B6, portb.nib0, [CLEAR, HOME, "actual es"," ","-", dec aux," ", "C"]
pause 1000
LCDWRITE B7\B5\B6, portb.nib0, [CLEAR, HOME, "o", " ", dec temp," ", "K"]
pause 1000
endif
sign=0

goto main