# formula para pasar de binario 10 bits a grados centigrados



## IMASDPIC (Dic 24, 2011)

hola que tal alguien sabe decirme si esto es asi o hay otra forma de solucionarlo? 
tenemos  resolucion ADC 1024 bits -1 = 1023 
vref - 0    vref +   5     entonces 5/1023 = 0,00488 V / bit
por lo que (5-0)/1023=4.88mV /2 = 2.44mV este sera el maximo error posible 
y este valor  244 que se  multiplica por el binario del adc para convertir a decimal en Cº  ??
un saludo 
ah por cierto una cosa mas para la entrada analogica del DAC utilizo un lm35 pero realmente quiero conectar varias sondas de temperatura que tengo,son  de 2 hilos creo que son pt100,
como puedo hacer para utilizar estas sondas en vez del lm35 y darle la señal al pic

gracias un saludo 
y felices fiestas


----------



## cosmefulanito04 (Dic 24, 2011)

¿Estás buscando el error que comete el ADC al medir?

Si es eso, no alcanza con solo tener en cuenta el error de cuantización (+/- 1/2 dígito), sino que  deberías tener en cuenta los errores de offset, linealidad, etc que te da el fabricante. Y además deberías tener en cuenta el error que tiene tu tensión de referencia.

Todo eso debería darte un cierto error en mV (por los valores que estas manejando), que luego tendrás que ver en cuanto influye en tu medición de ºT.


----------



## Randy (Dic 24, 2011)

Si, solo multiplicas 2.44m por el valor binario y tienes el "valor real" de la temperatura.
Pero para una medicion muy precisa debes tomar en cuenta lo que comefulanito04 ha mencionado.
Son RTD, asi que debes implementar divisores de tension de acuerdo a el rango de voltajes que desees en la salida.
tu PT100 debe ser R2, la que va conectada a tierra.

Saludos


----------



## IMASDPIC (Dic 24, 2011)

hola que tal gracias por contestar 
no lo que busco es la formula para convertir 1023 bits de resolucion a grados centigrados con un lm35
en cuanto a lo de las sondas con sondas de 2 hilos de un termostato digital pero querria saber como se pueden conectar para que hagan la misma funcion que en el termostato pero con el canal adc del pic
ya que mi idea es usar esas sondas que tengo muchas y no comprar mas lm35.
gracias 
un saludo


----------



## cosmefulanito04 (Dic 24, 2011)

A ver, primero deberías analizar como funciona el LM35:

- 0ºC = 0V
- Variación de 1ºC => Variación de 10mV => 10mV/ºC

Entonces resumiendo, si tenés 25ºC, el LM35 debería tirarte una tensión de 10mV/ºC*25ºC=250mV.

Ahora con esa tensión y con el ADC deberías obtener ºT así:

[LATEX]T_{medida}=\frac{Nivel_{adc}}{1024}.5v.\frac{1}{10mV/C}[/LATEX]

Volviendo al ejemplo de los 25ºC, el ADC debería medir un nivel de 51/52, entonces para saber tu ºT aplicás esa fórmula:

[LATEX]T_{medida}=\frac{51}{1024}.5v.\frac{1}{10mV/C}=24,9C[/LATEX]

Ahora, todo muy lindo, pero estás desaprovechando un montón de resolución solo para medir 250mV (osea mucho error de fondo de escala). 

Mi recomendación es que cambies la referencia a un nivel de tensón menor, por ej. 1,2v (o menos, según lo que te permita tu ADC), o directamente uses un operacional que te lleve tu rango a una escala de 0 a 5v.


----------



## IMASDPIC (Dic 25, 2011)

hola que tal gracias por contestar ,una pregunta; he leido varias explicaciones que hay por internet y no consigo encontrar una aclarada del todo porque hay quien dice que multiplicas el valor que te proporciona el adc por .244  y luego una vez tienes esto le pones la coma y lo desglosas a bcd
en tu ultimo ejemplo no terminan de cuadrarme las cosas ,igual lo planteo yo mal,si se supone que el sensor da una variacion de entre -55 y 150  Cº  son 195Cº  a repartir entre la 1023 posiciones del adc
en tu formula el 51 lo sacas del valor supuesto que tendra el adc y si en vez de poner 51 pones que tiene  1023 ,no deberia dar la solucion de formula 150 Cº  ??? ,como te digo igual lo estoy planteando yo mal ,las mates no es mi fuerte aunque lo intento a base de bien ,
bueno espero me respondas 
un saludo



te pongo otro ejemplo si el sensor nos da 10mV/Cº,   tenemos 5000mV/1024 = 4,88mV/bit
una vez tenemos esto aparentemente estaria claro por cada bit del adc lo multiplico por 4,88mV y lo divido entre 10 y tenemos el valor en grados del adc  
pasemos a suponer que el adc tiene 1023 * 4,88 = 4992,24 / 10 = nos daria 499,22 grados a fondo de escala 
como ves no me salen las cuentas , no se que hago mal despues esta el tema de que el sensor mide de 
-55 a +150


----------



## IMASDPIC (Dic 25, 2011)

te pongo otro ejemplo que he leido
textualmente escribo lo que un profesor de la universidad de españa escribe en un manual 
;Los dispositivos PIC16F87X disponen de un convertidor A/D de 10 bits de resolución y 5 u 8 
;canales de entrada analógica. La tensión de referencia determina la resolución por bit:
;(Res. = Vref/1024). Con 5 Vref=4.86 mV/Bit; con 2.5 Vref=2.43 mV/Bit
++++++++++++++++++++++++++++++++++++++++++++
;Al resultado de la conversión se le multiplica por 243 (2.43) que es la resolución por bit.
;P.Ej. La Tª es de 25.6º, como el sensor proporciona 10mV/ºC la tensión a convertir será de
;256 mV. Siendo la resolución de 2.43mV/bit el resultado de la conversión dará 0x69 (105)
;que, multiplicado por 0xf3 (243) queda un resultado de 0x63ab (25515). Se desplaza la coma 
;tres posiciones a la izda. y queda finalmente 25.5º (un error de +/- 1 bit)

segun esto entiendo que si tengo el adc a fondo 1023 multiplicado por 486 ya que mi ref es de 5v =497178 y corriendo la coma 497,178 esto serian Cº como ves no me cuadra si el sensor mide de -50 a +155 =son 195 Cº


----------



## cosmefulanito04 (Dic 25, 2011)

¿Cuál es tu rango de medición?

*-55 y 150 ºC*

Entonces, ¿podés medir 5v a la salida del LM35 sin añadir algo extra? *NO*

Volviendo a como se calcula la ºT (matemáticamente, después vos te encargas de hacerlo por soft), a ver si lo entendés así usando regla de 3 simple:

1- Obtenés el nivel de tensión de 1 cuenta (esto ya lo hiciste):


```
1024 cuentas ________ 5v (Vref)
1 cuenta     ________ x=(5v/1024cuentas)*1cuenta=4,88mV
```

2-  Tensión a la salida de un LM35 según la ºT, como el sensor se comporta en forma lineal y en 0ºC => 0V, también podés usar regla de 3 simple:


```
1ºC  ________ 10mv
TxºC ________ x=(10mv/1ºC)*Tx=10mV*Tx
```

Suponé que tenés 25ºC, entonces:


```
1ºC  ________ 10mv
25ºC ________ x=(10mv/1ºC)*25ºC=250mV
```

1Bis- Sabiendo la salida de tensión que necesitas medir, ¿como obtenés la cantidad de cuentas de tu ADC?


```
4,88mV ________ 1 cuenta
250mV  ________ x=(1cuenta/4,88mV)*250mV=51,2 cuentas => 51/52 cuentas
```

3- Definí tu rango de medición, suponiendo que no modificaste el circuito original y que solo usas fuente simple, en principio tu rango de ºT será de 0 a 150ºC, ¿a cuánto equivale en tensión? ¿y en cuentas del ADC?


```
1ºC   ________ 10mv
150ºC ________ x=(10mv/1ºC)*150ºC=1,5v
```


```
4,88mV ________ 1 cuenta
1,5v   ________ x=(1cuenta/4,88mV)*1,5v=307,37 cuentas => 307/308 cuentas
```

Entonces tu rango de tensión será de 0 a 1,5v o en niveles de ADC de 0 a 308 cuentas.

4- Obtener la ºT en función de las cuentas del ADC _(estas son las operaciones que deberías hacer en tu programa)_:


```
1024 cuentas  ________ 5v (Vref)
N cuentas     ________ x=(5v/1024cuentas)*Ncuentas=4,88mV*N
```

Solo falta obtener la ºT en función de esa tensión:


```
10mV  ________ 1ºC
Vx mV ________ x=(1ºC/10mV)*Vx
```

Volviendo a los 25ºC de ejemplo:


```
1024 cuentas ________ 5v (Vref)
51 cuentas     ________ x=(5v/1024cuentas)*51cuentas=249mV
```


```
10mV  ________ 1ºC
Vx mV ________ x=(1ºC/10mV)*249mV=(1ºC/10mV)*249mV=(1/10)*249=24,9ºC
```

Eso es todo lo que deberías hacer.

Ahora sobre el problema de fondo de escala, depués si te interesa lo discutimos el ¿por qué? esta no es la mejor forma de realizar la medición, de momento trata de entender el procedimiento de conversión de esta forma.


----------



## IMASDPIC (Dic 26, 2011)

gracias por contestar cosmefulanito04 me voy a poner a ver bien todo lo que me has escrito y ya te digo algo, muchisimas gracias por tomarte la molestia 
un saludo


----------



## IMASDPIC (Dic 26, 2011)

me parece que ya se porque no me salia el calculo ,yo estaba empeñado en pensar que cuando el adc tuviera 1023 el sensor estaria a 150Cº, cuando como no da mas de 1500mv no llegara a 1023
de ahi que me pusieras que salian 307/308 cuentas verdad?
ya que a 2,5 volt de ref saldran unas 614 cuentas
segun esto a menor tension de referencia mas precision en cuanto a la resolucion en cuentas del adc
es asi???


----------



## cosmefulanito04 (Dic 26, 2011)

IMASDPIC dijo:


> me parece que ya se porque no me salia el calculo ,yo estaba empeñado en pensar que cuando el adc tuviera 1023 el sensor estaria a 150Cº, cuando como no da mas de 1500mv no llegara a 1023
> de ahi que me pusieras que salian 307/308 cuentas verdad?



Así es, 308 será tu cuenta máxima sin hacer ninguna modificación, osea que a 308 cuentas tenés 150ºC.  



IMASDPIC dijo:


> ya que a 2,5 volt de ref saldran unas 614 cuentas
> segun esto a menor tension de referencia mas precision en cuanto a la resolucion en cuentas del adc
> es asi???



Exacto, mientras más cercano sea tu tensión de referencia al 100% de tu escala mejor. Pero como todo hay un límite, algunos ADC tienen una tensión de referencia mínima, así que eso tenés que consultarlo con las hojas de datos del ADC.

¿Por qué te conviene tener mayor resolución de cuenta?

En este caso no se aplica tener mayor resolución para poder medir mejor las variaciones de tu sensor, ya que el mismo dice tener 10mV de resolución y vos con 5v ya cumplís con esa resolución mínima.

El problema está en que esas variaciones las vas a medir con solo 2 cuentas (aprox. 4,88mV/cuenta => 2cuentas =10mV), mientras que si a tu referencia la haces de 2,5v necesitas 4 cuentas para ver esa variación. 

¿Para qué te puede servir tener mayores cuentas para medir una variación?

Por un lado, bajas mucho el error de cuantización (ese que mencionaste vos y tomaste como +/- 1/2 cuenta) y por otro haces la medición menos sensible al ruido propio del ADC ya que se necesitan más cuentas para medir la variación.


----------



## IMASDPIC (Dic 26, 2011)

cosmefulanito04 ,eres un crack,menos mal que hay gente como tu dispuesta a explicar bien las cosas,
he buscado bastante informacion ,ya que no me gusta dejar que me lo aclaren todo ,pero muchas veces por no saber buscar la pregunta adecuada o por no encontrar las respuestas que te aclaren las cosas no hay mas remedio que preguntar ,sea como sea muchisimas gracias por aclararme el tema este que me llevaba de cabeza ,a veces por ofuscarte en pensar que las cosas son de una manera y no ver que son de otra,solo me queda solucionar el tema de la temperatura negativa ,porque no se  si se le conecta al sensor y a la vref del pic una alimentacion diferente para que puedas medir valores mA en negativo ,o se hace todo por software,he visto tambien que la gente conecta el lm35 a un AO supongo que sera por mas precision o es por lo de medir valores negativos ,si no te importa terminar de aclararme lo de medir temperaturas negativas.
un saludo 
cuidate


----------



## cosmefulanito04 (Dic 26, 2011)

> solo me queda solucionar el tema de la temperatura negativa ,porque no se si se le conecta al sensor y a la vref del pic una alimentacion diferente para que puedas medir valores mA en negativo ,o se hace todo por software,he visto tambien que la gente conecta el lm35 a un AO supongo que sera por mas precision o es por lo de medir valores negativos ,si no te importa terminar de aclararme lo de medir temperaturas negativas.
> un saludo



Te tiro un dato que te puede servir, buscá en la hoja de datos del LM35, ahí vas a encontrar una forma de poder usar una fuente simple para también medir los valores negativos de ºT.


----------



## christian elric (Ene 3, 2012)

si estas usando 10 bits no es necesario que hagas niguna conversion, solo coloca un potenciometro de 1k, el pin 2 conectalo a la entrada analogica del pic, el pin 1 al pin 2 del lm35 y el pin 3 colocalo a tierra, el potenciometro ponlo a 49%, eso es lo que yo hice y me funciona de maravilla


----------



## dohko (May 16, 2014)

buenas noches "cosmefulanito04", tal ves puedas ayudarme con un problema que tengo, estoy haciendo un sensor de temperatura con el LM35 y el PIC16F877A, ya lo tengo todo, el acondicionamiento, y casi todo el programa, el problema es que necesito medir con el sensor temperaturas tanto negativas como positivas, lo que da el LM35, de -55° a +150° pero no se como hacer la formula para que me muestre la temperatura en una lcd, te doy un ejemplo:
cuando hay 0° para mi son 68 BITS y con el acondicionamiento es 1.341V.
con -55° son 0 BITS y 0V.
y con +150° son 255 BITS y 5V
por lo que la formula convencional de BITS*0.4887 no me sirve.
espero que puedas ayudarme y de antemano muchas gracias.


----------



## kiwhilario (May 16, 2014)

EN SERIO?

Matematica elemental: y=mx+b.
Temp=m*(BITS)+B.
Temp=0.80392157*(BITS)-55.


----------



## D@rkbytes (May 16, 2014)

dohko dijo:


> el problema es que necesito medir con el sensor temperaturas tanto negativas como positivas, lo que da el LM35, de -55° a +150° pero no se como hacer la formula para que me muestre la temperatura en una lcd:


Voy a tratar de explicar de forma sencilla como puedes hacerlo.

Supongamos que ya tienes tu circuito de acondicionamiento con amplificador operacional para que cuando el sensor esté a -55 °C tengas 0V en la salida y a 150 °C tengas +5V en la salida.

Si trabajamos con 10 Bits de resolución, entonces el valor máximo del ADC será de 1023 a 5V.
Entonces tenemos que ADC_VMax será = 5V, y ADC_Bits será = 1023
Ahora sumamos la temperatura máxima y la temperatura mínima sin signo.
150 + 55 = 205

Ahora necesitamos una constante (K) que nos servirá para medir la temperatura negativa.
205 / ADC_VMax = 41
Nuestra constante K será = 41

Con estos datos ya podemos calcular y obtener valores tanto positivos, como negativos.
Entonces, realizamos un primer cálculo para obtener el valor de (X) conforme a la lectura del ADC
X = ((ADC_VMax * Lectura_ADC) / ADC_Bits)

Ahora realizamos un segundo cálculo para obtener la temperatura.
Temperatura = ((K * X) - 55)

El código a usar en C de CCS sería algo así:

```
Lectura_ADC = read_adc();
   
   X = ((5.0 * Lectura_ADC) / 1023);
   
   Temperatura = ((41 * X) - 55);
 
   lcd_gotoxy(1,1);
   
   printf(lcd_putc,"Temp. %0.2f %cC  ",Temperatura,0xDF);
```
Las variables X y Temperatura deben ser Float y la variable Lectura_ADC debe ser INT16

Espero te sirva la información.

Suerte.


----------



## dohko (May 17, 2014)

excelente, funciono de maravilla, les agradezco mucho y para aquellos que la solución era obvia lamento molestarlos pero mis matemáticas son un poco pobres, pero de todas formas muchas gracias, sobre todo por la explicación, me ayuda mucho a entender lo que estaba ocurriendo y no volver a cometer el mismo error, gracias chicos.


----------

