Autor Tema: Formula para linealizar un termistor en CCS  (Leído 46618 veces)

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

dOlPhIn

  • ***
  • Mensajes: 264
  • Liked: 13
  • Visiten: http://www.xbot.es/ezkybel/
    • Ezkybel Electronics
Formula para linealizar un termistor en CCS
« : febrero 12, 2010, 10:17:28 am »
Aquí explico la manera de medir temperatura con termistores utilizando un microcontrolador.
pues estuve batallando bastante para encontrar un metodo facil y que se puediera programar, asi que encontre una formula he hice este programa en CCS.

 La diferencia de estos sensores en comparación de otros conocidos como por ejemplo  el LM35 y los termocoples entre otros, es que el termistor no es lineal es decir no tenemos un factor constante con el cual podamos hacer la conversión de resistencia a temperatura, sin embargo son muy sensibles, y muy poco susceptibles a ruido, por lo que en un rango determinado de medicion pueden ser mas exactos que otros sensores, el rango de temperatura esta entre el LM35 y los termocoples, es decir si queremos leer temperaturas muy altas se aconsejan los termocoples.

Otra ventaja es que no necesitamos de amplificadores para acoplarlos con el micro, solo se hace un diviso de tensión con otra resistencia, asi medimos el voltaje que hay en el termistor y calculamos su resistencia.

Bueno pues nos dejamos de tanta teoria que la verdad no me gusta nada y vamonos a lo mas importante.

Para linealizar la resistencia y asociarla con la temperatura correspondiente yo utilice una formula de “Steinhart-Hart” la verdad no se quien fue, pero que bueno que hizo esta formula. Aquí la presento y explico en que consiste:

1 /T = A + B(Ln R) + C(Ln R) ³

Donde:

T = Temperatura en °Kelvin
R = Resistencia del Termistor en Kohm
A, B, C = Constante de la curva de aproximación

Bueno pues aquí lo mas “complicado” es calcular A, B y C pero no se asusten nos es difícil, para ello necesitamos la tabla de equivalencia de resistencia /temperatura de la hoja de datos de nuestro termistor, o en mi caso que no existía dicha tabla, utilice un multimetro y un termómetro he hice una tabla, les recomiendo sacar tres valores muy diferentes por ejemplo saquen la resistencia a 0ºC, 25ºC, y 80ºC , entonces hacemos nuestra tabla:

0ºC          -->   40.828  Kohm

25ºC       -->    15.200     Kohm

80ºC       -->     2.503    Kohm

Como pueden ver la respuesta de este sensor no es lineal.

Entonces para sacar la formula de la curva de este termistor hacemos una matriz y la resolvemos con el método que queramos, la matriz quedaría de la siguiente manera (recuerden que hay que convertir a grados kelvin es por eso que le sumo 273 a cada temperatura):

1 + Ln 40.828 + (Ln 40.828) ³  = 1/ (0+273)
1 + Ln 15.200 + (Ln 15.200) ³  = 1/ (25+273)
1 + Ln  2.503 +  (Ln 2.503) ³    = 1/ (80+273)

Para resolver yo utilize una calculadora graficadora, pero pueden hacerlo a mano o en mathcad, matlab etc,
Pero se que algunos no tienen esos programas en su computadora, como en mi caso que estoy peleado con las matematicas asi que hice un programita en visual Basic que los genera, los datos que deben ingresar es la temperatura en grados Celsius y la resistencia en kilo ohms.



Una vez obtenidos los datos hacen su formula de la siguiente manera:

Temp = (1/(0.00257629+0.00027878*Ln_Resist+0.00000103*Ln_Resist3)-273);

Donde:
Temp        es la temperatura en grados Celsius.

Ln_Resist    es el logaritmo natural de la resistencia medida del termistor con el adc del micro

Ln_Resist3   es “Ln_Reist” elevado al cubo
(para ello se hace lo sig:  Ln_Resist3= Ln_Resist* Ln_Resist* Ln_Resist)

Ya solo  programan en c o en Basic mandan llamar la formula y la despliegan en un display, lamandan por serial, usb etc , después yo les pondre el codigo completo en c y la utilización de esta formula ademas de la simulación en proteus para que verifiquen y vean la exactitud de la medicion con la respuesta ya linealizada.

tengo la intencion de mejorar el programa para que automaticamente genere el codigo de la subrutina para ccs y solo copien y peguen en su programa.
saludos
 
« Última Modificación: febrero 26, 2010, 09:14:04 am por dOlPhIn »
"¡¡¡ Mis Hijas y mi Esposa son mi mayor motivacion.. Las amo !!!"

dOlPhIn

  • ***
  • Mensajes: 264
  • Liked: 13
  • Visiten: http://www.xbot.es/ezkybel/
    • Ezkybel Electronics
Re: Formula para linealizar un termistor en CCS
« Respuesta #1 : febrero 17, 2010, 04:15:05 pm »
Bueno pues aqui le traigo la otra pate de este tutorial, en esta parte adjunto el codigo fuente de una aplicacion en la cual se utiliza un termistor NTC de 3.3 K omhs a 25 °C, (cuando busquemos algun termistor lo buscamos con la resistencia que muestre a 25 °C),
 
En este ejemplo utilizo la tabla del datasheet del fabricante de dicho sensor para obtener los datos que introduciremos en el programa que tambien le hice algunas modificaciones.

La tabla es la siguiente:


-Bueno pues lo primero que hay que hacer es descomprimir el archivo   que les adjunto y abrimos el archivo "termometro.c" con CCS.
esto es como una plantilla en donde indica donde pegar la funcion que generaremos en el programa, les recuerdo que yo lo hice con el pic16f873, pero lo podran cambiar a otro pic.




-Luego abrimos el programa que hara la subrutina con los datos obtenios de la tabla.

Para este ejemplo yo tomo tres temperaturas con sus respectivas resistencias a 0°C , 25°C, y 75°C.

y lo pondremos en los campos de temperatura (en °C)y resistencia(en Kohms), en el campo de "Resistencia Div" ponemos la resistencia que ira en serie con el termistor, les aconsejo que sea la misma que el resistor a 25°C en este caso de 3300 ohms, luego de llenar todos los campos le damos click al boton "Generar Funcion", entonces como su nombre lo dice nos genera la Funcion llamada "calcular_temp()"



-Copiamos la funcion de la Ventana  y lo pegamos en nuestro codigo "termometro.c",
en la parte que nos indica donde pegarlo:

//--------------------------------------------------------------------------
//Funcion de calculo de la temperatura
//--------------------------------------------------------------------------


//Pega aqui la funcion que gerenaste con el programa

//**************************************************************************

lo compilamos y ya tenemos nuestro archivo listo para grabar el PIC



tambien adjunto el archivo para simular en proteus, solo muevan la resistencia llamada termopar y comparen con los valores de la tabla del fabricante.



Saludos
« Última Modificación: febrero 26, 2010, 09:17:56 am por dOlPhIn »
"¡¡¡ Mis Hijas y mi Esposa son mi mayor motivacion.. Las amo !!!"

javabeep

  • Mensajes: 10
  • Liked: 0
Re: Formula para linealizar un termistor en CCS
« Respuesta #2 : mayo 20, 2010, 09:38:36 pm »
hola a todos, soy nuevo aqui, quisiera saber si tambien podrian explicar alguna forma de calcular(formula) para medir temperatura usando un termometro de referencia, una calculadora manual y un multimetro, porsupuesto con un termistor, y que termistor en kohm deberia ser.un saludo.

dOlPhIn

  • ***
  • Mensajes: 264
  • Liked: 13
  • Visiten: http://www.xbot.es/ezkybel/
    • Ezkybel Electronics
Re: Formula para linealizar un termistor en CCS
« Respuesta #3 : mayo 21, 2010, 08:13:39 am »
Ese metodo lo explico en la primera parte del post, por que de hecho yo lo hice primero con las herrameintas que tu mencionas

debes aplicar matrices, o de lo contrario una calculadora capaz de resolver estas ecuaciones y encontrar A,B y C, una vez que tengas estas constantes las aplicas en la formula final de temperatura.

T =1 /( A + B(Ln R) + C(Ln R) ³)

para encontrar las constantes es nesesario que hagas tres ecuaciones respecto a la resistencia y temperatura de tu termometro de referencia

Bueno pues aquí lo mas “complicado” es calcular A, B y C pero no se asusten nos es difícil, para ello necesitamos la tabla de equivalencia de resistencia /temperatura de la hoja de datos de nuestro termistor, o en mi caso que no existía dicha tabla, utilice un multimetro y un termómetro he hice una tabla, les recomiendo sacar tres valores muy diferentes por ejemplo saquen la resistencia a 0ºC, 25ºC, y 80ºC , entonces hacemos nuestra tabla:

0ºC          -->   40.828  Kohm

25ºC       -->    15.200     Kohm

80ºC       -->     2.503    Kohm

Como pueden ver la respuesta de este sensor no es lineal.

Entonces para sacar la formula de la curva de este termistor hacemos una matriz y la resolvemos con el método que queramos, la matriz quedaría de la siguiente manera (recuerden que hay que convertir a grados kelvin es por eso que le sumo 273 a cada temperatura):

1 + Ln 40.828 + (Ln 40.828) ³  = 1/ (0+273)
1 + Ln 15.200 + (Ln 15.200) ³  = 1/ (25+273)
1 + Ln  2.503 +  (Ln 2.503) ³    = 1/ (80+273)

Para resolver yo utilize una calculadora graficadora, pero pueden hacerlo a mano o en mathcad, matlab etc,
« Última Modificación: mayo 21, 2010, 08:16:59 am por dOlPhIn »
"¡¡¡ Mis Hijas y mi Esposa son mi mayor motivacion.. Las amo !!!"

elro

  • Mensajes: 2
  • Liked: 0
  • Más vale preguntar.
Re: Formula para linealizar un termistor en CCS
« Respuesta #4 : mayo 22, 2010, 11:19:01 am »
Hola soy nuevo integrante me parece interesante y super practico css ya que yo aprendi a programar en ensamblador. Estoy realizando mi tesis que se basa en sensar temperatura hasta ahora despues de mucho logre incorporar el sensor lm35 pero el sistema debe trabajar tambien con termistor y no tengo idea de como hacer la conversion de la formula descrita en ensamblador podrian ayudarme. Ya programe el .hex a mi pic pero no funciono :( debe ser por los tiempos de inicialización del lcd supongo. Estoy leyendo un manual de css pero la verdad me va llevar meses asimilar esto no soy tan bueno pero estoy intentando desenmarañar el codigo si tan solo tuviera la parte de conversion yo la adapto a mi lcd. Pido la ayuda del autor. Gracias
Lo voy a lograr asi me lleve el doble de esfuerzo. ANIMO!!!!!!! Lo importante es llegar.

dOlPhIn

  • ***
  • Mensajes: 264
  • Liked: 13
  • Visiten: http://www.xbot.es/ezkybel/
    • Ezkybel Electronics
Re: Formula para linealizar un termistor en CCS
« Respuesta #5 : mayo 22, 2010, 03:28:54 pm »
Hola "elro", Te entiendo lo que dices y tu problema, yo tambien aprendi a programar en ensamblador y lo hice en ese lenguaje por 3 años, y apenas un año que manejo el CCS, y en este ejemplo se contestan las preguntas mas comunes de los que empiezan a programar pics (¿cual es el mejor lenguaje de programacion de microcontroladores?), como te das cuenta ambos son buenos, si quieres tiempos precisos y una mejor optimizacion al codigo, es el ensamblador, pero para cosas como estas se ve que es mas facil el C, si lo logras hacer en ensamblador, y lo comparas con el ejemplo que te pongo aqui, no notaras la diferencia, ambos funcionarian , y la velocidad no es primordial aqui, es mas no verias la diferencia, e incluso si no los optimisas bien seria mas lento, puedes ver el codigo asm. pues lo genera el ccs, pero sera dificil entenderlo, y veo muy dificil el hacer la funcion del logaritmo natural, asi como la multiplicacion y las rutinas de formateo del display, la verdad no veo la ventaja de que lo hagas en ensamblador, sin embargo si asi  te lo piden pues no hay de otra, por experiencia te digo que si ya dominas el ensamblador el C, sera mucho pero mucho mas facil de aprender.
Saludos y siento no poder ayudarte en tu caso.


lo del lcd se me hace raro, pues yo uso un lcd muy barato y funciona bien, que pic utilisas? quisa sea el problema, pues este ejemplo es para el pic16f873 en caso de que quieras hacer en ccs puedes mandarme tu diagrama de como tienes las conexiones y yo te modifico el programa para que corra en tu microcontrolador, quisa tambien pueda extarer el codigo asm de la formula, pero sera muy grande el codigo y no se si te afecte en tu programa, anque eso se me hace algo "poco elegante" por que la verdad no entenderia como lo hace el compilador, y el caso de esto es saber como es que se hace las operaciones matematicas.
« Última Modificación: mayo 22, 2010, 03:40:08 pm por dOlPhIn »
"¡¡¡ Mis Hijas y mi Esposa son mi mayor motivacion.. Las amo !!!"

javabeep

  • Mensajes: 10
  • Liked: 0
Re: Formula para linealizar un termistor en CCS
« Respuesta #6 : mayo 23, 2010, 09:58:17 pm »
hola Dolphin, agradezco tu respuesta anterior, pero tengo una cuantas dudas de como realizar los calculos, hasta ahora creo entender que la forma de usar un termistor para medir temperaturas, seria usando la formula que escribiste y si tenemos los datos de resistencias del fabricante del sensor buscamos tres diferentes temperaturas y sus respectivas resistencias y con eso calculamos A, B y C, si no tenemos esos datos usamos un termometro de referencia y medimos la resistencia en tres temperaturas distintas, y dentro de esta parte ¿hay que hacer dicha medicion directamente al termistor o con una resistencia acoplada en serie al sensor que sea  de la misma resistencia que el sensor?, aqui quisiera saber cual es la formula para calcular a b y c pero teniendo en cuenta que quiero calcularlo con calculadora y no con el programa que creaste, es decir de que forma se resuelve la matriz manualmente, entonces al tener a b y c ya podemos medir la resitencia con el multimetro y usar la formula, ahora en esta nueva medicion usamos o no una resistencia en serie con el sensor.

dOlPhIn

  • ***
  • Mensajes: 264
  • Liked: 13
  • Visiten: http://www.xbot.es/ezkybel/
    • Ezkybel Electronics
Re: Formula para linealizar un termistor en CCS
« Respuesta #7 : mayo 24, 2010, 08:28:23 am »
Para medir la resistencia se hace directamente a las dos terminales del sensor de ahi obtienes la resistencia y calculas A,B yC,

la resistencia solo se usa para hacer el divisor de tension, pero eso no tiene que ver con la formula ni con A, B y C, la resistencia en serie con el sensor se toma en cuenta solo en el programa del pic en el adc, para calcular la resistencia que hay presente en el sensor.

Y esta es la formula:

Resist = ((3.3*Lect_adc)/(1024-Lect_adc));

suponiendo que la resistencia que le pusiste en seria a tu sensor es de 3.3 k (de ahi el "3.3" de la formula), "Lect_adc" es lo que esta leyendo tu adc, todo lo demas queda igual. elegi una resistencia de 3.3 k por que es la resistencia que da el sensor a 25 grados centigrados, ("temperatura ambiente") 

para la resolver las ecuaciones te recomiendo que busques a cerca de el metodo de gauss aqui te pongo un tutorial en el cual esta explicado este metodo en la seccion 7.7 http://www.todomates.com/apuntes/sistemas_de_ecuaciones_lineales.pdf

"¡¡¡ Mis Hijas y mi Esposa son mi mayor motivacion.. Las amo !!!"

javabeep

  • Mensajes: 10
  • Liked: 0
Re: Formula para linealizar un termistor en CCS
« Respuesta #8 : mayo 25, 2010, 08:20:22 pm »
hola Dolphin, agradezco mucho tu respuesta, ahora tengo una duda sobre la fornula, he tomado los valores que das en el ejemplo e hice el calculo de la temperatura y, cual es mi duda, use los valores de a, b y c que mostras en el ejemplo sacados por medio del multimetro mas el termometro y la matriz, reemplazo esos valores en la formula y el valor de resistencia que uso es el mismo que es para 25 grados (15.200), entonces ¿el resultado no debe ser igual a 25?, tal vez hay algo que no entiendo, un saludo.

javabeep

  • Mensajes: 10
  • Liked: 0
Re: Formula para linealizar un termistor en CCS
« Respuesta #9 : mayo 25, 2010, 08:30:45 pm »
hola dolphin, tengo otras dudas, tomar valores con temperatura bajo cero da igual, y cuanto es el largo de los cables como maxino que se le puede prolongar al sensor.chau.

dOlPhIn

  • ***
  • Mensajes: 264
  • Liked: 13
  • Visiten: http://www.xbot.es/ezkybel/
    • Ezkybel Electronics
Re: Formula para linealizar un termistor en CCS
« Respuesta #10 : mayo 26, 2010, 02:27:04 pm »
el resultado debera de ser igual a 25 grados centigrados si tu sensor marca una resistencia de 15.200, mandame tus mediciones para checarlo aqui ,mandame que resistencia tienes a los valores de temperatura que checaste, en cuanto a lo de los valores negativos, la verad no lo he probado, pero se supone que debe funcionar,

En cuanto a longitud del cable la verdad la desconosco, pero pienso que lo se podria hacer es conectar el cable a longitud que piensas hacerlo, luego medir la resistencia que hay en el otro extremo y compararla con la que hay en los cables en la parte mas cercana al sensor, y la diferencia la puedes restar en el programa del pic. imagino que debe de funcionar por que la resistencia del cable debe ser casi constante, y digo casi constante por que debe variar con la temperatura, pero como es cable de cobre esa variacion debido a la temperatura debera de ser insignificativa.

Saludos.
"¡¡¡ Mis Hijas y mi Esposa son mi mayor motivacion.. Las amo !!!"

elro

  • Mensajes: 2
  • Liked: 0
  • Más vale preguntar.
Re: Formula para linealizar un termistor en CCS
« Respuesta #11 : mayo 27, 2010, 09:06:05 pm »
Te agradezco tu tiempo y respuesta "dOlPhIn"  y antes de escribir estube viendo los archivos y encontre el ensamblador pero como dices es complicado seguir la secuencia de operaciones. En fin que si use el 873 y mi termistor es de 2.2k solo para probar aunque no creo ese fuera al problema solo daria lecturas diferentes. No se inicializo es un LCD TIANMA 16x2 eso es lo raro. Voy a usar el ccs y meter el código para mi termistor  tal y como lo describiste ya sólo por no quitarme el gusto de verlo funcionar : ) y quedarme con la duda. Por el momento voy a continuar mi tesis con el lm35 que es lo que me urgue y en cuanto termine me voy a dedicar tiempo a css. Ya estare aqui pidiendo consejos. Saludos
Lo voy a lograr asi me lleve el doble de esfuerzo. ANIMO!!!!!!! Lo importante es llegar.

javabeep

  • Mensajes: 10
  • Liked: 0
Re: Formula para linealizar un termistor en CCS
« Respuesta #12 : mayo 28, 2010, 08:56:31 pm »
hola Dolphin, gracias por tu respuesta, ahora si me puse mas habil con la formula y los valores dan bien, aclaro como dije antes que no use un termistor mio, estaba comprobando la formula con los valores que das como ejemplo, aunque encontre en el ejemplo que das del termistor de3.3 k que me da -42 grados centigrados cuando la tabla indica -40 y para otros que hice como -10, 0, y 25 si me dan igual, no se que puede haber ahi.Ahora quiero preguntarte si cualquier termistor ntc puedo usarse como sensor, ya que se que hay muchas formas y resistencias diferentes, me recomendas alguno, para como en mi caso que voy a usar el multimetro, y te cuento mi multimetro me da valores de hasta cuatro numeros en la pantalla y 20 mega ohm.Por ultimo si consigo el termistor sin la tabla(data sheet) y tengo que comparar con termometro de referencia, que forma seria la mejor para lograr una temperatura estable y hacer una buena medicion.Un saludo.

dOlPhIn

  • ***
  • Mensajes: 264
  • Liked: 13
  • Visiten: http://www.xbot.es/ezkybel/
    • Ezkybel Electronics
Re: Formula para linealizar un termistor en CCS
« Respuesta #13 : mayo 30, 2010, 09:09:23 pm »
mira lo que paso con las mediciones se debe que la formula la calculaste en base a otro rango de valores, es decir si hubieras tomado un rango de -40 a 40 grados, lo mas correcto seria que tomara la temperatura de -40, 0 , y 40 grados para calcular la formula, ya que hay que recordar que esta formula es la linealizacion de una curva, por lo tanto se comportara bien dentro de un rango en donde se calculo dichas constantes.

puedes usar cualquier sensor, pero esta bien con uno de 10k a 25 grados centigrados, para que haya mas rango en la resistencia en base a la variacion de temperatura, y para que sea mas confiable tu ecuacion es mucho mejor hacer mediciones , que tener la tabla, por que asi la calculas con valores reales y no de la hoja del fabricante, ese multimetro que tienes esta perfecto, y para que tengas buenas lecturas, lo mejor es calcular tus constantes (a,b y c) con el rango de temperatura que manejaras, por ejemplo si vas a manejar de -40 a 40 gradoste recomiendo que calcules de -42 a 42 grados.

saludos
"¡¡¡ Mis Hijas y mi Esposa son mi mayor motivacion.. Las amo !!!"

javabeep

  • Mensajes: 10
  • Liked: 0
Re: Formula para linealizar un termistor en CCS
« Respuesta #14 : mayo 31, 2010, 07:48:11 pm »
muchas gracias dolphin, tengo una duda mas, para calibrar el termistor tengo un termometro digital con una precision de 1 grado centigrado, sera poco, ¿que termometro de referencia seria lo mejor?.saludos.