TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: yukardo 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.
-
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.
-
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.
-
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.
-
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
-
.....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
-
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.
-
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.
-
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.
-
.....a este valor le llamaremos Cuantizador.....
¿Del libro de Les Jonhson?
-
Que tal Mario,
Efectivamente, en el libro de Les Jonhson le nombra asi: Quanta.
Saludos.
Elreypic.
-
Hola yukardo!
DogFlu66 diseño un muy buen Acondicionador de señal para LM35x (http://www.ucontrol.com.ar/wiki/index.php?title=Acondicionador_de_se%C3%B1al_para_LM35x) que seguramente puede ayudarte con el hard.
Este es el esquema:
(http://www.ucontrol.com.ar/wiki/images/3/32/CircuitoLM35.jpg)
En el link de arriba tienes explicado como funciona.
Saludos.
-
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.
-
Lo probe en Proteus y no me funciono debe ser que tengo algun error en el software
-
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