Autor Tema: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA  (Leído 15142 veces)

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

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« en: 24 de Agosto de 2006, 07:45:01 »
Hola Gente:

Tengo un problema. Necesito hacer un medidorde temperatura con termocupla J , pero en este caso No podre envia el valor de temperatura a un lcd 2x16 , sino para que sea visto por los operarios, debe ser visto en display de 7 segmentos, .
Yo puse un lcd 2x1 por el momento para ver los valores y de ahí mandarlos y compararlos con los de 7 seg.
Pero que pasa , uso el saa1064 en modo dinamico, y este toma los digitos en forma individual ya que medire temperaturas de valores como 300.5 , 300.6, 320.2   etc, para lo cual cree una matriz de de numeros con punto para el 7 seg, pero el problema radica en el envio individual de los decimales, las unidades las decenas y las centenas. No se me ocurre como hacer eso.

#include <16f876.h>               //pic a utilizar
#device *=16
#device adc=8
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD, NOWRT,NODEBUG                  //No Debug mode for ICD
#use delay (clock=4000000)            //Fosc=4Mhz
#define SAA1064_DINAMICO            //trabajar en modo dinamico el saa1064
#define SAA1064_SCL PIN_C3            //definicion de pines...
#define SAA1064_SDA PIN_C4         //...de manejo del saa1064
#define use_portb_lcd TRUE
#include <vs_saa1064M.c>
#include <lcd.c> //libreria para lcd


///PROGRAMA
void main(void)
{
   //setup_oscillator(OSC_4MHZ);         //configuracion del oscilador interno a 4MHz

char tab7segCONPUNTO[10]={0xBF,0x86,0xDB,0xCF,0xE7,0xED,0xFD,0x87,0xFF,0xE7};//7seg hex 0-9
char tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; //7seg hex 0-9 con punto
char decimal, unidad, decena, centena,t1,t2,t3,t4,lm35;


lcd_init( ); //inicializamos lcd
lcd_putc("  Medidor de \n  temperatura");
delay_ms(1000);
lcd_putc("\f");



setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);



set_adc_channel(0);//seteo y lectura de termocupla 1
delay_ms(100);
t1=read_adc();
lcd_gotoxy(1,1);
printf(lcd_putc,"t1%d ",t1);



saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000001);         //12mA & NO parpadeo & Dinamico
saa1064_putc(centena,decena,unidad,decimal);   //HOLA
delay_ms(1000);
saa1064_stop();

set_adc_channel(1);//seteo y lectura de termocupla 2
delay_ms(100);
t2=read_adc();
lcd_gotoxy(8,1);
printf(lcd_putc,"t2%d ",t2);


set_adc_channel(2);//seteo y lectura de termocupla 3
delay_ms(100);
t3=read_adc();
lcd_gotoxy(1,2);
printf(lcd_putc,"t3%d ",t3);

set_adc_channel(3);//seteo y lectura de termocupla 4
delay_ms(100);
t4=read_adc();
lcd_gotoxy(8,2);
printf(lcd_putc,"t4%d ",t4);



set_adc_channel(4);//seteo y lectura de lm35
delay_ms(100);
lm35=read_adc();

///////////////////////////////////////////////////////////////////////////////////////////
///                                 ///
///   Bits de control:    X C6 C5 C4 C3 C2 C1 C0               ///
///   ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨                        ///
///      C0=0   modo estatico->digitos 1 y 2               ///
///      C0=1   modo dinamico->digitos 1&3 y 2&4 alternativamente      ///
///      C1=0/1   digitos 1&3 no parpadep/parpadeo            ///
///      C2=0/1   digitos 2&4 no parpadep/parpadeo            ///
///      C3=1   test segmentos                     ///
///      C4=1   +3mA de salida                     ///
///      C5=1   +6mA de salida                     ///
///      C6=1   +12mA de salida                     ///
///////////////////////////////////////////////////////////////////////////////////////////

saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000001);         //12mA & NO parpadeo & Dinamico
saa1064_putc(centena,decena,unidad,decimal);   //HOLA
delay_ms(1000);
saa1064_stop();




saa1064_init(0x70);               //inicializo saa1064 conectado a GND D4
saa1064_conf(0b01000001);         //12mA & NO parpadeo & Dinamico
saa1064_putc(0x73,0x30,0x39,0x86);   //PIC!
delay_ms(1000);
saa1064_stop();                  //paro el saa1064 conectado a GND
}
« Última modificación: 24 de Agosto de 2006, 11:57:24 por quirogaareal »
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #1 en: 27 de Agosto de 2006, 15:37:25 »
Me autorespondo:

Ya encontre la forma de desglosar el numero asi solo obtengo los enteros. Lo hago atravez de divisiones y enteros, pero me gustaria saber si en ccs hay alguna instruccion que te separe la parte entera de la decimal.

Yo hice esto:
supongo que tengo el valor 1023 entregado por el conversor
conversor de 10 bits .
t1=read_adc()

Tentero=t1/1000 ;   1023/1000= 1.023    pero como es entero sol me queda 1
Tdecimal=(float)T1/1000;   aca si esta el 1.023

T2entero=(10*Tdecimal)-(10*Tentero);  seria  (10*1.023 )-(10*1)=0.23 obtengo el 0 al ser entero
 T2decimal=(float)(10*Tdecimal)-(10*Tentero);aca si esta almacenado 0.23

T3entero=(10*T2decimal)-(10*T2entero);  seria  (10*0.23 )-(10*0)=2.3 obtengo el 2 al ser entero
 T3decimal=(float)(10*T2decimal)-(10*T2entero);aca si esta almacenado 2.3

T4entero=(10*T3decimal)-(10*T3entero);  seria  (10*2.3 )-(10*2)=2.3 obtengo el 3 al ser entero
 

asi lo resovi.

pero como mencione mas arriba conoce alguien  si en ccs hay alguna instruccion que te separe la parte entera de la decimal.

gracias muchachos
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #2 en: 27 de Agosto de 2006, 15:57:19 »
Para quedarte con la parte entera de un float solo debes calificar la operacion:

Código: C
  1. int16 i;
  2. float f1,f2,pd;
  3.  
  4. i = (int16) f1 / f2;
  5. pd= (float) (f1 / f2) - i;

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #3 en: 27 de Agosto de 2006, 19:15:48 »
Esto es un pequeño truco para separar los dígitos en "C". Primero los convertimos a texto y lo guardamos en una cadena:

sprintf(cCadena,"%f",Variable);

y seguidamente tomamos cada valor y lo visualizamos con:

Digito = cCadena[Posicion];

Donde posición es la posición del dígito dentro de la cadena.

Si la tabla de visualización es en ASCCI, pues solamente hace falta aplicar el valor obtenido en Digito sobre la tabla y el resultado llevarlo al display.

Si por el contrario necesita el número lo convertimos de la siguiente forma:

Digito = cCadena[Posicion]-'0';

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
MEDIDOR DE TEMPERATURA CON TERMOCUPLA K
« Respuesta #4 en: 22 de Septiembre de 2006, 08:24:54 »
Hola Muchachos :

Estoy haciendo un medidor de termocuplas con termoculas K como saben exiten tablas o ecuaciones que lineatilan aproximadamente los valores en las curvas de las termpciplas .
Estas ecuaciones para que no hayan tantas e innecesarias multiplicaciones se las coloca de otra forma ahí entonces ocupan menos memoria , algunos te sugieren que uses hasta el exponencial 4 pero no mide con precision asi que hay que poner la ecuación completa  y realmente mide con bastante precision .
Yo lo verifique con una termocupla tipo j y anduvo de 10, ………peeeeeero cuando me pase a la termocupla tipo K la ecuación es demasiado comleja y la empece a partir para que no me diera expresión too complex (dado que la necesito entera), en ese momento me salio out of room.  Estoy usando un 16f876 que tiene bastante memoria.

RESUMIENDO

¿  Como podria hacer para que entren esas expresiones en la capacidad de memoria que posee el pic?  :-/

CODIGO


#include <16f876.h>               //pic a utilizar
#device *=16
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD, NOWRT,NODEBUG                  //No Debug mode for ICD
#use delay (clock=4000000)            //Fosc=4Mhz
#define SAA1064_DINAMICO            //trabajar en modo dinamico el saa1064
#define SAA1064_SCL PIN_C3            //definicion de pines...
#define SAA1064_SDA PIN_C4         //...de manejo del saa1064
#define use_portb_lcd TRUE
#include <vs_saa1064M.c>
#include <lcd.c> //libreria para lcd
#include<stdlib.h>
#include<math.h>

void nro_a_BCD();
void imprime_BCD();
void lineal();
void muestra_en_display();



int16 decimal, unidad, decena, centena,t1=0;//,t1entc,t1entd,t1entu,t1entdec;
float lm35,temperatura=0,linealizacion,V,T,v1,Vcompensado,exponente;//t1c,t1d,t1u,t1dec,
int32 temp;//esta variable se usa para la conversion y en main x10
//range: 0.000, 1372.000, The coefficients
//* are in units of °C and mV and are listed in the order of constant
//* term up to the highest order
//formula tipo: E = sum(i=0 to n) c_i t^i + a0 exp(a1 (t - a2)^2).

/*

//0ºa a 500 ºc - 0.000 to 20.644mv
//500ºc a 1372 ºc    20.644 to 54.886
//formula tipo:   t_90 = d_0 + d_1*E + d_2*E^2 + ...+ d_n*E^n,

*/

///PROGRAMA
void main(void)
{
float p1,p2,p3,p4,p5,p6,p7,p8,p9;
float c1=-0.176004136860E-01,c2= 0.389212049750E-01,c3=0.185587700320E-04,c4=-0.994575928740E-07,c5= 0.318409457190E-09,c6= -0.560728448890E-12,c7= 0.560750590590E-15,c8=-0.320207200030E-18,c9=0.971511471520E-22,c10=-0.121047212750E-25;
float ex0 =0.118597600000, ex1 =-0.118343200000E-03, ex2=0.126968600000E+03;
lcd_init( ); //inicializamos lcd
lcd_putc("  Medidor de \n  temperatura");
delay_ms(1000);
lcd_putc("\f");

setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);

while (true)

{

///////////////////////////////////////////////////////////////////////////////////////////
///                                 ///
///   Bits de control:    X C6 C5 C4 C3 C2 C1 C0               ///
///   ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨                        ///
///      C0=0   modo estatico->digitos 1 y 2               ///
///      C0=1   modo dinamico->digitos 1&3 y 2&4 alternativamente      ///
///      C1=0/1   digitos 1&3 no parpadep/parpadeo            ///
///      C2=0/1   digitos 2&4 no parpadep/parpadeo            ///
///      C3=1   test segmentos                     ///
///      C4=1   +3mA de salida                     ///
///      C5=1   +6mA de salida                     ///
///      C6=1   +12mA de salida                     ///
///////////////////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////
///                                 ///
///   LM35 TEMPERATURA DE REFERENCIA///
///                                 ///
///////////////////////////////////////


saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000111);         //12mA & parpadeo & Dinamico
saa1064_putc(0X77,0X79,0X71,0x63);//(R,E,F,CENTIGRADO);   //T1 titilando
delay_ms(100);
saa1064_stop();

set_adc_channel(4);//seteo y lectura de lm35
delay_ms(50);
t1=read_adc();

temperatura=(float)t1*0.0048828125*100*0.3333333333333333333333333333;//t1 valor digital de la tension
T=temperatura;
temp=T*10;//multiplico el valor de temperatura pra que aparezca como entero
exponente=ex0*exp(ex1*((T-ex2)*(T-ex2)));
T =(float) Vcompensado * (a1+ Vcompensado* (a2 +Vcompensado*(a3+Vcompensado*(a4+Vcompensado*(a5+Vcompensado*(a6+Vcompensado*(a7+Vcompensado*((a8+Vcompensado*(a9))))))))));

V1=(float)(c1*T+exponente)+(c2*T*exp(2)+exponente);//+(c4*p3+exponente)+(c5*p4+exponente)+(c6* p5+exponente)+(c7*p6+exponente)+(c8*p7+exponente)+(c9*p8+exponente);
V1=(float)v1+(c3* T*exp(3) +exponente)+(c4*T*exp(4)+exponente);//+(c7*p6+exponente)+(c8*p7+exponente)+(c9*p8+exponente);
v1=(float)v1+(c5*T*exp(5)+exponente)+(c6*T*exp(6)+exponente);
v1=(float)v1+(c7*T*exp(7)+exponente)+(c8*T*exp(8)+exponente);
v1=(float)v1+(c9*T*exp(9)+exponente);
printf(lcd_putc,"V1 %9f",V1);
nro_a_BCD();
imprime_BCD();

/***********FIN LM35 TEMPERATURA DE REFERENCIA*************************/


///////////////////////////////////////
///                                 ///
///   1era termocupla               ///
///                                 ///
///////////////////////////////////////

saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000111);         //12mA & parpadeo & Dinamico
saa1064_putc(0x78,0x06,0x00,0x00);   //T1 titilando
delay_ms(500);
saa1064_stop();

set_adc_channel(0);//seteo y lectura de termocupla1
delay_ms(70);
t1=read_adc();


//V=(float)t1*0.0048828125*10;//es x 10 para simular 50 mv como 50 Voltios
V=(float)t1*0.0048828125*10;
Vcompensado=(float)V+V1;
lineal();
muestra_en_display();
nro_a_BCD();
imprime_BCD();


/***********FIN 1era termocupla*************************/



}
}
/*************************************************************/
///////////////////////////////////////
///                                 ///
///    FIN MAIN                     ///
///                                 ///
///////////////////////////////////////




///////////////////////////////////////////////////
///                                            ////
///FUNCION DESGLOSA EL VALOR Y CONVIERTE A BCD ///
///                                           ////
/////////////////////////////////////////////////
/*
/**************************************/

void nro_a_BCD()

{
char tab7segCONPUNTO[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xE7};//7seg hex 0-9
char         tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; //7seg hex 0-9 con punto
int tempBCD[5];

itoa(temp,10, tempBCD);
// tempBCD[0]=decimal T
// tempBCD[1]=unidad T
// tempBCD[2]=decena T
// tempBCD[3]=centena T
if (temp<1000)//entra aca si el valor e menor a 100ºc
{
if (temp<100)//entra aca si el valor e menor a 10ºc
{
decimal=tab7seg[tempBCD[1]-48];//Aqui se resta 48 porque me imprime el valoer en ascii del caracter
unidad=tab7segCONPUNTO[tempBCD[0]-48];//por ej  0 es =48 1=49 y asi.....
decena=0x00;//mando la centena al saa1064
centena=0x00;//mando la centena al saa1064
}
else
{
decimal=tab7seg[tempBCD[2]-48];
unidad=tab7segCONPUNTO[tempBCD[1]-48];
decena=tab7seg[tempBCD[0]-48];//mando la centena al saa1064
centena=0x00;//mando la centena al saa1064
}
}
else//entra aca si el valor e ssuperior a 100ºc
{
decimal=tab7seg[tempBCD[3]-48];
unidad=tab7segCONPUNTO[tempBCD[2]-48];
decena=tab7seg[tempBCD[1]-48];//mando la centena al saa1064
centena=tab7seg[tempBCD[0]-48];//mando la centena al saa1064
}
}



///////////////////////////////////////////////////
///                                            ////
///FUNCION ENVIA EL NRO AL BCD                 ///
///                                           ////
/////////////////////////////////////////////////
void imprime_BCD()
{
saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000001);         //12mA & NO parpadeo & Dinamico
saa1064_putc(centena,decena,unidad,decimal);   //HOLA
delay_ms(4000);
saa1064_stop();
}
/***********FIN FUNCION ENVIA EL NRO AL BCD*********************************************/



///////////////////////////////////////////////////
///                                            ////
///FUNCION LINEALIZA EL VALOR DE TEMP Y VOLTAJE ///
///                                           ////
/////////////////////////////////////////////////

void lineal()
{
float a1=2.508355E+01  ,a2=7.860106E-02  ,a3=-2.503131E-01  ,a4=8.315270E-02  ,a5=-1.228034E-02  ,a6=9.804036E-04 ,a7=-4.413030E-05  ,a8=1.057734E-06  ,a9=-1.052755E-08 ;
//0ºa a 500 ºc - 0.000 to 20.644mv
float a11=-1.318058E+02 ,a12=4.830222E+01  ,a13=-1.646031E+00  ,a14=5.464731E-02  ,a15=-9.650715E-04  ,a16=8.802193E-06  ,a17=-3.110810E-08 ;
//500ºc a 1372 ºc    20.644 to 54.886
//formula tipo:   t_90 = d_0 + d_1*E + d_2*E^2 + ...+ d_n*E^n,

if(Vcompensado<20.6)
   {
   T =(float) Vcompensado * (a1+ Vcompensado* (a2 +Vcompensado*(a3+Vcompensado*(a4+Vcompensado*(a5+Vcompensado*(a6+Vcompensado*(a7+Vcompensado*((a8+Vcompensado*(a9))))))))));
   }

else
   {
   T =(float) Vcompensado * (a11+ Vcompensado* (a12 +Vcompensado*(a13+Vcompensado*(a14+Vcompensado*(a15+Vcompensado*(a16+Vcompensado*(a17)))))));
   }

temp=T*10;//multiplico el valor de temperatura pra que aparezca como entero

}


///////////////////////////////////////////////////
///                                            ////
///FUNCION muestra_en_display IMPRIME EN LCD   ///
///                                           ////
/////////////////////////////////////////////////

void muestra_en_display()
{
lcd_gotoxy(1,1);
printf(lcd_putc,"V %f",T);
lcd_gotoxy(1,2);
printf(lcd_putc,"mV %f",Vcompensado);
}
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
MEDIDOR DE TEMPERATURA CON TERMOCUPLA K
« Respuesta #5 en: 22 de Septiembre de 2006, 08:26:23 »
Hola Muchachos :

Estoy haciendo un medidor de termocuplas con termoculas K como saben exiten tablas o ecuaciones que lineatilan aproximadamente los valores en las curvas de las termpciplas .
Estas ecuaciones para que no hayan tantas e innecesarias multiplicaciones se las coloca de otra forma ahí entonces ocupan menos memoria , algunos te sugieren que uses hasta el exponencial 4 pero no mide con precision asi que hay que poner la ecuación completa  y realmente mide con bastante precision .
Yo lo verifique con una termocupla tipo j y anduvo de 10, ………peeeeeero cuando me pase a la termocupla tipo K la ecuación es demasiado comleja y la empece a partir para que no me diera expresión too complex (dado que la necesito entera), en ese momento me salio out of room.  Estoy usando un 16f876 que tiene bastante memoria.

RESUMIENDO

¿  Como podria hacer para que entren esas expresiones en la capacidad de memoria que posee el pic?  :-/

CODIGO


#include <16f876.h>               //pic a utilizar
#device *=16
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD, NOWRT,NODEBUG                  //No Debug mode for ICD
#use delay (clock=4000000)            //Fosc=4Mhz
#define SAA1064_DINAMICO            //trabajar en modo dinamico el saa1064
#define SAA1064_SCL PIN_C3            //definicion de pines...
#define SAA1064_SDA PIN_C4         //...de manejo del saa1064
#define use_portb_lcd TRUE
#include <vs_saa1064M.c>
#include <lcd.c> //libreria para lcd
#include<stdlib.h>
#include<math.h>

void nro_a_BCD();
void imprime_BCD();
void lineal();
void muestra_en_display();



int16 decimal, unidad, decena, centena,t1=0;//,t1entc,t1entd,t1entu,t1entdec;
float lm35,temperatura=0,linealizacion,V,T,v1,Vcompensado,exponente;//t1c,t1d,t1u,t1dec,
int32 temp;//esta variable se usa para la conversion y en main x10
//range: 0.000, 1372.000, The coefficients
//* are in units of °C and mV and are listed in the order of constant
//* term up to the highest order
//formula tipo: E = sum(i=0 to n) c_i t^i + a0 exp(a1 (t - a2)^2).

/*

//0ºa a 500 ºc - 0.000 to 20.644mv
//500ºc a 1372 ºc    20.644 to 54.886
//formula tipo:   t_90 = d_0 + d_1*E + d_2*E^2 + ...+ d_n*E^n,

*/

///PROGRAMA
void main(void)
{
float p1,p2,p3,p4,p5,p6,p7,p8,p9;
float c1=-0.176004136860E-01,c2= 0.389212049750E-01,c3=0.185587700320E-04,c4=-0.994575928740E-07,c5= 0.318409457190E-09,c6= -0.560728448890E-12,c7= 0.560750590590E-15,c8=-0.320207200030E-18,c9=0.971511471520E-22,c10=-0.121047212750E-25;
float ex0 =0.118597600000, ex1 =-0.118343200000E-03, ex2=0.126968600000E+03;
lcd_init( ); //inicializamos lcd
lcd_putc("  Medidor de \n  temperatura");
delay_ms(1000);
lcd_putc("\f");

setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);

while (true)

{

///////////////////////////////////////////////////////////////////////////////////////////
///                                 ///
///   Bits de control:    X C6 C5 C4 C3 C2 C1 C0               ///
///   ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨                        ///
///      C0=0   modo estatico->digitos 1 y 2               ///
///      C0=1   modo dinamico->digitos 1&3 y 2&4 alternativamente      ///
///      C1=0/1   digitos 1&3 no parpadep/parpadeo            ///
///      C2=0/1   digitos 2&4 no parpadep/parpadeo            ///
///      C3=1   test segmentos                     ///
///      C4=1   +3mA de salida                     ///
///      C5=1   +6mA de salida                     ///
///      C6=1   +12mA de salida                     ///
///////////////////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////
///                                 ///
///   LM35 TEMPERATURA DE REFERENCIA///
///                                 ///
///////////////////////////////////////


saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000111);         //12mA & parpadeo & Dinamico
saa1064_putc(0X77,0X79,0X71,0x63);//(R,E,F,CENTIGRADO);   //T1 titilando
delay_ms(100);
saa1064_stop();

set_adc_channel(4);//seteo y lectura de lm35
delay_ms(50);
t1=read_adc();

temperatura=(float)t1*0.0048828125*100*0.3333333333333333333333333333;//t1 valor digital de la tension
T=temperatura;
temp=T*10;//multiplico el valor de temperatura pra que aparezca como entero
exponente=ex0*exp(ex1*((T-ex2)*(T-ex2)));
T =(float) Vcompensado * (a1+ Vcompensado* (a2 +Vcompensado*(a3+Vcompensado*(a4+Vcompensado*(a5+Vcompensado*(a6+Vcompensado*(a7+Vcompensado*((a8+Vcompensado*(a9))))))))));

V1=(float)(c1*T+exponente)+(c2*T*exp(2)+exponente);//+(c4*p3+exponente)+(c5*p4+exponente)+(c6* p5+exponente)+(c7*p6+exponente)+(c8*p7+exponente)+(c9*p8+exponente);
V1=(float)v1+(c3* T*exp(3) +exponente)+(c4*T*exp(4)+exponente);//+(c7*p6+exponente)+(c8*p7+exponente)+(c9*p8+exponente);
v1=(float)v1+(c5*T*exp(5)+exponente)+(c6*T*exp(6)+exponente);
v1=(float)v1+(c7*T*exp(7)+exponente)+(c8*T*exp(8)+exponente);
v1=(float)v1+(c9*T*exp(9)+exponente);
printf(lcd_putc,"V1 %9f",V1);
nro_a_BCD();
imprime_BCD();

/***********FIN LM35 TEMPERATURA DE REFERENCIA*************************/


///////////////////////////////////////
///                                 ///
///   1era termocupla               ///
///                                 ///
///////////////////////////////////////

saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000111);         //12mA & parpadeo & Dinamico
saa1064_putc(0x78,0x06,0x00,0x00);   //T1 titilando
delay_ms(500);
saa1064_stop();

set_adc_channel(0);//seteo y lectura de termocupla1
delay_ms(70);
t1=read_adc();


//V=(float)t1*0.0048828125*10;//es x 10 para simular 50 mv como 50 Voltios
V=(float)t1*0.0048828125*10;
Vcompensado=(float)V+V1;
lineal();
muestra_en_display();
nro_a_BCD();
imprime_BCD();


/***********FIN 1era termocupla*************************/



}
}
/*************************************************************/
///////////////////////////////////////
///                                 ///
///    FIN MAIN                     ///
///                                 ///
///////////////////////////////////////




///////////////////////////////////////////////////
///                                            ////
///FUNCION DESGLOSA EL VALOR Y CONVIERTE A BCD ///
///                                           ////
/////////////////////////////////////////////////
/*
/**************************************/

void nro_a_BCD()

{
char tab7segCONPUNTO[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xE7};//7seg hex 0-9
char         tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; //7seg hex 0-9 con punto
int tempBCD[5];

itoa(temp,10, tempBCD);
// tempBCD[0]=decimal T
// tempBCD[1]=unidad T
// tempBCD[2]=decena T
// tempBCD[3]=centena T
if (temp<1000)//entra aca si el valor e menor a 100ºc
{
if (temp<100)//entra aca si el valor e menor a 10ºc
{
decimal=tab7seg[tempBCD[1]-48];//Aqui se resta 48 porque me imprime el valoer en ascii del caracter
unidad=tab7segCONPUNTO[tempBCD[0]-48];//por ej  0 es =48 1=49 y asi.....
decena=0x00;//mando la centena al saa1064
centena=0x00;//mando la centena al saa1064
}
else
{
decimal=tab7seg[tempBCD[2]-48];
unidad=tab7segCONPUNTO[tempBCD[1]-48];
decena=tab7seg[tempBCD[0]-48];//mando la centena al saa1064
centena=0x00;//mando la centena al saa1064
}
}
else//entra aca si el valor e ssuperior a 100ºc
{
decimal=tab7seg[tempBCD[3]-48];
unidad=tab7segCONPUNTO[tempBCD[2]-48];
decena=tab7seg[tempBCD[1]-48];//mando la centena al saa1064
centena=tab7seg[tempBCD[0]-48];//mando la centena al saa1064
}
}



///////////////////////////////////////////////////
///                                            ////
///FUNCION ENVIA EL NRO AL BCD                 ///
///                                           ////
/////////////////////////////////////////////////
void imprime_BCD()
{
saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000001);         //12mA & NO parpadeo & Dinamico
saa1064_putc(centena,decena,unidad,decimal);   //HOLA
delay_ms(4000);
saa1064_stop();
}
/***********FIN FUNCION ENVIA EL NRO AL BCD*********************************************/



///////////////////////////////////////////////////
///                                            ////
///FUNCION LINEALIZA EL VALOR DE TEMP Y VOLTAJE ///
///                                           ////
/////////////////////////////////////////////////

void lineal()
{
float a1=2.508355E+01  ,a2=7.860106E-02  ,a3=-2.503131E-01  ,a4=8.315270E-02  ,a5=-1.228034E-02  ,a6=9.804036E-04 ,a7=-4.413030E-05  ,a8=1.057734E-06  ,a9=-1.052755E-08 ;
//0ºa a 500 ºc - 0.000 to 20.644mv
float a11=-1.318058E+02 ,a12=4.830222E+01  ,a13=-1.646031E+00  ,a14=5.464731E-02  ,a15=-9.650715E-04  ,a16=8.802193E-06  ,a17=-3.110810E-08 ;
//500ºc a 1372 ºc    20.644 to 54.886
//formula tipo:   t_90 = d_0 + d_1*E + d_2*E^2 + ...+ d_n*E^n,

if(Vcompensado<20.6)
   {
   T =(float) Vcompensado * (a1+ Vcompensado* (a2 +Vcompensado*(a3+Vcompensado*(a4+Vcompensado*(a5+Vcompensado*(a6+Vcompensado*(a7+Vcompensado*((a8+Vcompensado*(a9))))))))));
   }

else
   {
   T =(float) Vcompensado * (a11+ Vcompensado* (a12 +Vcompensado*(a13+Vcompensado*(a14+Vcompensado*(a15+Vcompensado*(a16+Vcompensado*(a17)))))));
   }

temp=T*10;//multiplico el valor de temperatura pra que aparezca como entero

}


///////////////////////////////////////////////////
///                                            ////
///FUNCION muestra_en_display IMPRIME EN LCD   ///
///                                           ////
/////////////////////////////////////////////////

void muestra_en_display()
{
lcd_gotoxy(1,1);
printf(lcd_putc,"V %f",T);
lcd_gotoxy(1,2);
printf(lcd_putc,"mV %f",Vcompensado);
}
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #6 en: 24 de Septiembre de 2006, 12:42:45 »
Realmente parece que hubiera muy poca gente en experiencia en este tema :? dada la escaces de respuestas .
Sin embargo me autorespondo 8) asi soy de utilidad para el foro que me enseña cosas nuevas dia a dia. :)



#include <16f876.h>               //pic a utilizar
#device *=16
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD, NOWRT,NODEBUG                  //No Debug mode for ICD
#use delay (clock=4000000)            //Fosc=4Mhz
#define SAA1064_DINAMICO            //trabajar en modo dinamico el saa1064
#define SAA1064_SCL PIN_C3            //definicion de pines...
#define SAA1064_SDA PIN_C4         //...de manejo del saa1064
#define use_portb_lcd TRUE
#include <vs_saa1064M.c>
#include <lcd.c> //libreria para lcd
#include<stdlib.h>
#include<math.h>

void nro_a_BCD();
void imprime_BCD();
void lineal();
void muestra_en_display();



int16 decimal, unidad, decena, centena,t1=0;//,t1entc,t1entd,t1entu,t1entdec;
float lm35,temperatura=0,linealizacion,V,v1,Vcompensado,exponente;//t1c,t1d,t1u,t1dec,
float T;
int32 temp;//esta variable se usa para la conversion y en main x10
//range: 0.000, 1372.000, The coefficients
//* are in units of °C and mV and are listed in the order of constant
//* term up to the highest order
//formula tipo: E = sum(i=0 to n) c_i t^i + a0 exp(a1 (t - a2)^2).

/*

//0ºa a 500 ºc - 0.000 to 20.644mv
//500ºc a 1372 ºc    20.644 to 54.886
//formula tipo:   t_90 = d_0 + d_1*E + d_2*E^2 + ...+ d_n*E^n,

*/

///PROGRAMA
void main(void)
{
int i;
//float c1=-0.176004136860E-01,c2= 0.389212049750E-01,c3=0.185587700320E-04,c4=-0.994575928740E-07,c5= 0.318409457190E-09,c6= -0.560728448890E-12,c7= 0.560750590590E-15,c8=-0.320207200030E-18,c9=0.971511471520E-22,c10=-0.121047212750E-25;
float ex0 =0.118597600000, ex1 =-0.118343200000E-03, ex2=0.126968600000E+03;
float coef[10]={-0.176004136860E-01, 0.389212049750E-01,0.185587700320E-04,-0.994575928740E-07,0.318409457190E-09,-0.560728448890E-12,0.560750590590E-15,-0.320207200030E-18,0.971511471520E-22,-0.121047212750E-25};
lcd_init( ); //inicializamos lcd
lcd_putc("  Medidor de \n  temperatura");
delay_ms(1000);
lcd_putc("\f");

setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);

while (true)

{

///////////////////////////////////////////////////////////////////////////////////////////
///                                 ///
///   Bits de control:    X C6 C5 C4 C3 C2 C1 C0               ///
///   ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨                        ///
///      C0=0   modo estatico->digitos 1 y 2               ///
///      C0=1   modo dinamico->digitos 1&3 y 2&4 alternativamente      ///
///      C1=0/1   digitos 1&3 no parpadep/parpadeo            ///
///      C2=0/1   digitos 2&4 no parpadep/parpadeo            ///
///      C3=1   test segmentos                     ///
///      C4=1   +3mA de salida                     ///
///      C5=1   +6mA de salida                     ///
///      C6=1   +12mA de salida                     ///
///////////////////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////
///                                 ///
///   LM35 TEMPERATURA DE REFERENCIA///
///                                 ///
///////////////////////////////////////


saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000111);         //12mA & parpadeo & Dinamico
saa1064_putc(0X77,0X79,0X71,0x63);//(R,E,F,CENTIGRADO);   //T1 titilando
delay_ms(100);
saa1064_stop();

set_adc_channel(4);//seteo y lectura de lm35
delay_ms(50);
t1=read_adc();

temperatura=(float)t1*0.0048828125*100*0.3333333333333333333333333333;//t1 valor digital de la tension
T=temperatura;
temp=T*10;//multiplico el valor de temperatura pra que aparezca como entero
exponente=ex0*exp(ex1*((T-ex2)*(T-ex2)));




v1=0;
for(i=0; i<10; i++)
{
 v1=(float)(v1+(coef*(pow(T,i))));
}
v1=(float)(v1+exponente);


lcd_putc("\f");
printf(lcd_putc,"V1 %f",V1);
delay_ms(100);
nro_a_BCD();
imprime_BCD();

/***********FIN LM35 TEMPERATURA DE REFERENCIA*************************/


///////////////////////////////////////
///                                 ///
///   1era termocupla               ///
///                                 ///
///////////////////////////////////////

saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000111);         //12mA & parpadeo & Dinamico
saa1064_putc(0x78,0x06,0x00,0x00);   //T1 titilando
delay_ms(100);
saa1064_stop();

set_adc_channel(0);//seteo y lectura de termocupla1
delay_ms(70);
t1=read_adc();

V=(float)t1*0.0048828125*10;//es x 10 para simular 50 mv como 50 Voltios
Vcompensado=(float)V+V1;
lineal();
muestra_en_display();
nro_a_BCD();
imprime_BCD();


/***********FIN 1era termocupla*************************/



}
}
/*************************************************************/
///////////////////////////////////////
///                                 ///
///    FIN MAIN                     ///
///                                 ///
///////////////////////////////////////




///////////////////////////////////////////////////
///                                            ////
///FUNCION DESGLOSA EL VALOR Y CONVIERTE A BCD ///
///                                           ////
/////////////////////////////////////////////////
/*
/**************************************/

void nro_a_BCD()

{
char tab7segCONPUNTO[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xE7};//7seg hex 0-9
char         tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; //7seg hex 0-9 con punto
int tempBCD[5];

itoa(temp,10, tempBCD);
// tempBCD[0]=decimal T
// tempBCD[1]=unidad T
// tempBCD[2]=decena T
// tempBCD[3]=centena T

if (temp<10000)//entra aca si el valor e mayor a 1000ºc
{

if (temp<1000)//entra aca si el valor e menor a 100ºc
{
if (temp<100)//entra aca si el valor e menor a 10ºc
{
decimal=tab7seg[tempBCD[1]-48];//Aqui se resta 48 porque me imprime el valoer en ascii del caracter
unidad=tab7segCONPUNTO[tempBCD[0]-48];//por ej  0 es =48 1=49 y asi.....
decena=0x00;//mando la centena al saa1064
centena=0x00;//mando la centena al saa1064
}
else
{
decimal=tab7seg[tempBCD[2]-48];
unidad=tab7segCONPUNTO[tempBCD[1]-48];
decena=tab7seg[tempBCD[0]-48];//mando la centena al saa1064
centena=0x00;//mando la centena al saa1064
}
}
else//entra aca si el valor e ssuperior a 100ºc
{
decimal=tab7seg[tempBCD[3]-48];
unidad=tab7segCONPUNTO[tempBCD[2]-48];
decena=tab7seg[tempBCD[1]-48];//mando la centena al saa1064
centena=tab7seg[tempBCD[0]-48];//mando la centena al saa1064
}
}
else//entra aca si el valor e ssuperior a 100ºc
{
decimal=tab7seg[tempBCD[3]-48];
unidad=tab7seg[tempBCD[2]-48];
decena=tab7seg[tempBCD[1]-48];//mando la centena al saa1064
centena=tab7seg[tempBCD[0]-48];//mando la centena al saa1064
}

}



///////////////////////////////////////////////////
///                                            ////
///FUNCION ENVIA EL NRO AL BCD                 ///
///                                           ////
/////////////////////////////////////////////////
void imprime_BCD()
{
saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01000001);         //12mA & NO parpadeo & Dinamico
saa1064_putc(centena,decena,unidad,decimal);   //HOLA
delay_ms(4000);
saa1064_stop();
}
/***********FIN FUNCION ENVIA EL NRO AL BCD*********************************************/



///////////////////////////////////////////////////
///                                            ////
///FUNCION LINEALIZA EL VALOR DE TEMP Y VOLTAJE ///
///                                           ////
/////////////////////////////////////////////////

void lineal()
{
float a1=2.508355E+01  ,a2=7.860106E-02  ,a3=-2.503131E-01  ,a4=8.315270E-02  ,a5=-1.228034E-02  ,a6=9.804036E-04 ,a7=-4.413030E-05  ,a8=1.057734E-06  ,a9=-1.052755E-08 ;
//0ºa a 500 ºc - 0.000 to 20.644mv
float a11=-1.318058E+02 ,a12=4.830222E+01  ,a13=-1.646031E+00  ,a14=5.464731E-02  ,a15=-9.650715E-04  ,a16=8.802193E-06  ,a17=-3.110810E-08 ;
//500ºc a 1372 ºc    20.644 to 54.886
//formula tipo:   t_90 = d_0 + d_1*E + d_2*E^2 + ...+ d_n*E^n,

if(Vcompensado<20.6)
   {
   T =(float) Vcompensado * (a1+ Vcompensado* (a2 +Vcompensado*(a3+Vcompensado*(a4+Vcompensado*(a5+Vcompensado*(a6+Vcompensado*(a7+Vcompensado*((a8+Vcompensado*(a9))))))))));
   }

else if(Vcompensado>20.6)
   {

  T=(float)(a11 + Vcompensado*(a12+Vcompensado*(a13+Vcompensado*(a14+Vcompensado*(a15+Vcompensado*(a16+Vcompensado*(a17)))))));
   
   }

temp=T*10;//multiplico el valor de temperatura para que aparezca como entero

}


///////////////////////////////////////////////////
///                                            ////
///FUNCION muestra_en_display IMPRIME EN LCD   ///
///                                           ////
/////////////////////////////////////////////////

void muestra_en_display()
{
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"V %f",T);
lcd_gotoxy(1,2);
printf(lcd_putc,"mVc%2.2fmVsc%f2.2.",Vcompensado,V);
}
 :mrgreen:
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #7 en: 09 de Noviembre de 2006, 08:23:58 »
Hola muchachos aca les pongo la version final del programa medicion de temperaturas con termocupla .  el hardware funciona bien . en este caso es para el tipo de termocuplas tipo K .  Y aca se usaran para medir temperaturas de hornos de coccion de ceramicos.


///////////////////////////////////////////////////////////////////////////////////////////
///           TERMOCUPLA k - 4/11/06
///////////////////////////////////////////////////////////////////////
///   Bits de control:    X C6 C5 C4 C3 C2 C1 C0               ///
///   ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨                        ///
///      C0=0   modo estatico->digitos 1 y 2               ///
///      C0=1   modo dinamico->digitos 1&3 y 2&4 alternativamente      ///
///      C1=0/1   digitos 1&3 no parpadep/parpadeo            ///
///      C2=0/1   digitos 2&4 no parpadep/parpadeo            ///
///      C3=1   test segmentos                     ///
///      C4=1   +3mA de salida                     ///
///      C5=1   +6mA de salida                     ///
///      C6=1   +12mA de salida                     ///
///////////////////////////////////////////////////////////////////////////////////////////


#include <16f876.h>               //pic a utilizar
#device *=16
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD, NOWRT,NODEBUG                  //No Debug mode for ICD
#use delay (clock=4000000)            //Fosc=4Mhz
#define SAA1064_DINAMICO            //trabajar en modo dinamico el saa1064
#define SAA1064_SCL PIN_C3            //definicion de pines...
#define SAA1064_SDA PIN_C4         //...de manejo del saa1064
#include <vs_saa1064M.c>
#include<stdlib.h>//PARA itoa(temp,10, tempBCD);
#include<math.h>//PARA EL POW

void lineal();
void nro_a_BCD();
int32 temp,a=0;//esta variable se usa para la conversion y en main x10 y la A es para la cantidad de adquisiciones
float Vcompensado,T;
main()
{
int i;
float ex0 =0.118597600000, ex1 =-0.118343200000E-03, ex2=0.126968600000E+03,exponente;
float coef[10]={-0.176004136860E-01, 0.389212049750E-01,0.185587700320E-04,-0.994575928740E-07,0.318409457190E-09,-0.560728448890E-12,0.560750590590E-15,-0.320207200030E-18,0.971511471520E-22,-0.121047212750E-25};
float temperatura=0,linealizacion,V,v1;//t1c,t1d,t1u,t1dec,
int16 t1=0,cont=0,contT1=0;


setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);


while (true)

{


///////////////////////////////////////
///                                 ///
///   LM35 TEMPERATURA DE REFERENCIA///
///                                 ///
///////////////////////////////////////


saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01110111);         //21mA & prendidos los 4 display & Dinamico
//saa1064_putc(0X79,0X77,0Xc6,0x8e);//(R,E,F,CENTIGRADO);   //T1 titilando
saa1064_stop();
delay_ms(10);

set_adc_channel(1);//seteo y lectura de lm35
delay_ms(10);
t1=read_adc();
delay_ms(10);
temperatura=(float)t1*0.0048828125*100*0.22;//t1 valor digital de la tension esta calculado para que sea de 0 a 100º y 0.22 es la inversa de la ganancia del A.O.
T=temperatura;
temp=T*10;//multiplico el valor de temperatura pra que aparezca como entero

exponente=ex0*exp(ex1*((T-ex2)*(T-ex2)));

v1=0;
for(i=0; i<10; i++)
{
 v1=(float)(v1+(coef*(pow(T,i))));
}
v1=(float)(v1+exponente);
//nro_a_BCD();

///////////////////////////////////////
///                                 ///
///   1era termocupla               ///
///                                 ///
///////////////////////////////////////

saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01110111);         //21mA & prendidos los 4 display & Dinamico
//saa1064_putc(0x06,0x78,0x00,0x00);   //T1 titilando
saa1064_stop();


delay_ms(10);
set_adc_channel(0);//seteo y lectura de termocupla1
delay_ms(10);
t1=read_adc();
delay_ms(10);

V=(float)t1*0.0048828125*10;//es x 10 para simular 50 mv como 50 Voltios
Vcompensado=(float)(V+V1);
lineal();

a=temp+a;

if(cont==8)
{

    temp=a/9;
    nro_a_BCD();
    cont=0;
    a=0;
}

else

{
cont=cont+1;
}








/***********FIN 1era termocupla*************************/
//*****************************************************************************
}
}
/*************************************************************/
//////////////////////////////////////////
///                  ///
///    FIN MAIN                    ///
///                                 ///
//////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////
///esta funcion solo toma el numero y lo separa en
///unidades decenas cententenas etc, para
///que pueda ser visualizado en un display de 4
///bcd's de 7 seg. Un detalle ya que por distraccion armamos parte del hard mal
///tuvimos que adaptar los vectores de valor por soft asi que presten atencion a este detalle
//////////////////////////////////////////////////////////////////////////////////////////////////////////


void nro_a_BCD()

{

char tab7segCONPUNTO[10]={0xFD,0x61,0xDB,0xF3,0x67,0xB7,0xBF,0xE1,0xFF,0xF7};// 7seg hex 0-9 con punto (3ER Y 4TO DISPLAY)
char         tab7seg[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; //7seg hex 0-9 7seg hex 0-9 con punto (3ER Y 4TO DISPLAY)
char tab7segCONPUNTOOTRO[10]={0xBF,0x86,0xDD,0xCF,0xE6,0xEB,0xFB,0x87,0xFF,0xEF};// 7seg hex 0-9 con punto (1ER Y 2TO DISPLAY)
char         tab7segOTRO[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //7seg hex 0-9 (1ER Y 2TO DISPLAY)
int tempBCD[5];
int16 decimal, unidad, decena, centena,t1=0;

itoa(temp,10, tempBCD);

if (temp<10000)//entra aca si el valor e mayor a 1000ºc
{
if (temp<1000)//entra aca si el valor e menor a 100ºc
{
if (temp<100)//entra aca si el valor e menor a 10ºc
{
decimal=tab7seg[tempBCD[1]-48];//Aqui se resta 48 porque me imprime el valoer en ascii del caracter
unidad=tab7segCONPUNTO[tempBCD[0]-48];//por ej  0 es =48 1=49 y asi.....
decena=0x00;//mando la centena al saa1064
centena=0x00;//mando la centena al saa1064
}
else
{
decimal=tab7seg[tempBCD[2]-48];
unidad=tab7segCONPUNTO[tempBCD[1]-48];
decena=tab7segOTRO[tempBCD[0]-48];//mando la centena al saa1064
centena=0x00;//mando la centena al saa1064
}
}
else//entra aca si el valor e ssuperior a 100ºc
{
decimal=tab7seg[tempBCD[3]-48];
unidad=tab7segCONPUNTO[tempBCD[2]-48];
decena=tab7segOTRO[tempBCD[1]-48];//mando la centena al saa1064
centena=tab7segOTRO[tempBCD[0]-48];//mando la centena al saa1064
}
}
else//entra aca si el valor e ssuperior a 100ºc
{
decimal=tab7seg[tempBCD[3]-48];
unidad=tab7seg[tempBCD[2]-48];
decena=tab7segOTRO[tempBCD[1]-48];//mando la centena al saa1064
centena=tab7segOTRO[tempBCD[0]-48];//mando la centena al saa1064
}



///////////////////////////////////////////////////
///                                            ////
///FUNCION IMPRIME EL NRO EN LOS 7SEG                 ///
///                                           ////
/////////////////////////////////////////////////

saa1064_init(0x76);               //inicializo saa1064 conectado a Vcc D1
saa1064_conf(0b01110111);         //21mA & prendidos los 4 display & Dinamico
saa1064_putc(decena,centena,decimal,unidad);
delay_ms(10);
saa1064_stop();

}



/***********FIN FUNCION ENVIA EL NRO AL BCD*********************************************/


///////////////////////////////////////////////////
///                                            ////
///FUNCION LINEALIZA EL VALOR DE TEMP Y VOLTAJE ///
///                                           ////
/////////////////////////////////////////////////

void lineal()
{
float a1=2.508355E+01  ,a2=7.860106E-02  ,a3=-2.503131E-01  ,a4=8.315270E-02  ,a5=-1.228034E-02  ,a6=9.804036E-04 ,a7=-4.413030E-05  ,a8=1.057734E-06  ,a9=-1.052755E-08 ;
//0ºa a 500 ºc - 0.000 to 20.644mv
float a11=-1.318058E+02 ,a12=4.830222E+01  ,a13=-1.646031E+00  ,a14=5.464731E-02  ,a15=-9.650715E-04  ,a16=8.802193E-06  ,a17=-3.110810E-08 ;
//500ºc a 1372 ºc    20.644 to 54.886
//formula tipo:   t_90 = d_0 + d_1*E + d_2*E^2 + ...+ d_n*E^n,

if(Vcompensado<20.6)
   {
   T =(float) Vcompensado * (a1+ Vcompensado* (a2 +Vcompensado*(a3+Vcompensado*(a4+Vcompensado*(a5+Vcompensado*(a6+Vcompensado*(a7+Vcompensado*((a8+Vcompensado*(a9))))))))));
   }

else if(Vcompensado>20.6)
   {

  T=(float)(a11 + Vcompensado*(a12+Vcompensado*(a13+Vcompensado*(a14+Vcompensado*(a15+Vcompensado*(a16+Vcompensado*(a17)))))));

   }

temp=T*10;//multiplico el valor de temperatura para que aparezca como entero

}


Espero que les sirva


Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #8 en: 01 de Diciembre de 2006, 00:11:24 »
no era mas sencillo linealizar esta termocupla lo q se es que la linelizacion es por tramos , popr ejemlo de 20 a 200 grados q tenga una pendiente y trabajas mas facil y si te pasas en otro rango de temperatura le aplicas la otra pendiente tambien estaba en un tiempo hacer esto q tu al final encontre en un libro de instrumenmtacion unas tablas para valores de termocuplas y me di con la sorpresa de la gran linealidad de la cuestion asi q tu codigo esta DE BUENA PINTA CON TODAS LAS DE LA LEY PERO EN CUANTO TIEMPO SE PROCESARA TANTA INFORMACION , NO ES UNA CRITICA SOLO UNA OPINION Y TE FELICITO PUES ESTE PROGRAMA PUEDE SERVIRTE EN CASO Q USES UN DSP O LA MISMA COMPU EXITOS. :-/

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #9 en: 02 de Diciembre de 2006, 09:19:47 »
Hola Electronando:

Mira en realidad me llevo mucho tiempo encontrar informacion que me fuera de utilidad , hsta que al final encontre las tablas que vos mencionas y como alternativa las ecuaciones con las cuales linealizas la curva de las termocuplas y eso use, sino te he entedido mal eso es lo que me sugieres y eso es lo que esta hecho ...y no, no lo tu intencion es de mejorar asi que es bienvenida tu critica o sugerencia (como quieras llamarlo) todo sea por aprender mas y mejorar nuestros conocimientos.

Aca te adjunto de donde saque la ecuaciones ..Espero que te sea de utilidad 
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado luarken

  • PIC10
  • *
  • Mensajes: 28
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #10 en: 04 de Marzo de 2008, 02:27:10 »
esta muy interesante tu proyecto


en que realisaste la programacion>??? q programa

tienes los diagramas???


Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #11 en: 04 de Marzo de 2008, 08:27:35 »
Hola :

Mira ese proyecto no fue continuado dado que la empresa no lo quizo asi , asi qeu no hay esquemas ni nada mas conrespecto a programacion de lo que esta publicado

Saludos
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #12 en: 04 de Marzo de 2008, 08:50:17 »
Hola :
Perdon me confundi de proyecto , aca esta.


Saludos desde Cordoba Argentina
primera parte
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #13 en: 04 de Marzo de 2008, 08:51:00 »
2da
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: AYUDA CON EL SAA1064 Y MEDIDOR DE TEMPERATURA CON TERMOCUPLA
« Respuesta #14 en: 04 de Marzo de 2008, 08:51:38 »
3era
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina