Autor Tema: Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados  (Leído 3293 veces)

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

Desconectado marmoleta

  • PIC10
  • *
  • Mensajes: 20
Buenas, estoy tratando de manejar un medidor de temperatura con max6675 la lectura está bien, el tema es la sincronizacion de los datos.

pero no logro sincronizar los valores en pantalla probe con el timer1 para aumentarle la velocidad.
Noté que cuando aumento la temperatura en la termocupla de manera brusca los valores llegan no sincronizados y desparejos habra alguna manera de detectar cambios es decir trabaja al minimo de lectura pero cuando detecta que sube la temperatura aumenta lavelocidad del timer automaticamente se puede realmente? :D :g) :mrgreen: :x :x :x :x :shock: :shock: :shock: :shock:

Código: [Seleccionar]
#INCLUDE <16F887.H>  //PIC utilizado
#DEVICE ADC = 10
#INCLUDE <MATH.H>    //Libreria con funciones matematicas
#FUSES   NOWDT       //No Watch Dog Timer
#FUSES   XT          //
#FUSES   NOPUT       //No Power Up Timer
#FUSES   PROTECT   //Code not protected from reading
#FUSES   NOBROWNOUT  //No brownout reset
#FUSES   NOLVP       //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O
#FUSES   CPD       //No EE protection
#use  delay(clock=4000000)

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, parity=n, bits=8, stop=1)

#bit Chip_Select=0x07.0                //RC0=Chip_Select
//#bit Chip_Select_Direccion=0x87.0      //TRISA.0=Chip_Select_Direccion

int16 Data;
short EstadoTKP;                       //estado de la Termocuple, abierto o cerrado
float temp;
int t[9]=0,0,0,0,0,0,0,0,0;


#define t1 t[0]
#define t2 t[1]
#define t3 t[2]

#define t_seg t[3]
#define t_sog t[4]
#define t_log t[5]

#define t_deseado1 t[6]
#define t_deseado2 t[7]
#define t_deseado3 t[8]

#INT_TIMER1

void  TIMER1_isr(void)
{
   t1++;                         // Contador para funcion pulsadores
   t2++;                         // Contador para lectura de termocupla
   t3++;

   if(t1==1){                  // Si la interrupcion se activo 154 veces
      t_seg++;                   // paso 1 segundo
      t1=0;                      // Reinicio el contador
   }
   if(t2==1){                  // Si la interrupcion se activo 154 veces
      t_sog++;                  // paso 1 segundo
      t2=0;                      // Reinicio el contador
   }
      if(t3==1){                  // Si la interrupcion se activo 154 veces
      t_log++;                  // paso 1 segundo
      t3=0;                      // Reinicio el contador
   }
}

void InitMain()
{

   setup_adc_ports(sAN0 | sAN1 | sAN2);
   setup_adc(ADC_CLOCK_DIV_8);

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // modo de trabajo
   setup_timer_2(T2_DISABLED,0,1);

   enable_interrupts(int_TIMER1);
   enable_interrupts(GLOBAL); //Habilita interrupciones
   t_deseado1=3; // Establezco el timer en 3.
   Chip_Select=1;                   //Deshabilito el SPI en el DAC mediante RC0, Pulso de seleccion de esclavo en alto
   //Chip_Select_Direccion=0;         //Pin RC0 como salida
   set_tris_c(0x10);
   setup_spi(SPI_MASTER|SPI_L_TO_H | SPI_XMIT_L_TO_H|SPI_CLK_DIV_4);    //th>=100ns,tl>=100ns, Tp=10MHz/4=0.4us=200ns

}

void ADC_Input()
{
if(t_seg>=t_deseado1){
   char DataHigh, DataLow;

   Chip_Select=0;
   delay_us(20);
   //Recibe el byte mas significativo y menos significativo
   DataHigh=spi_read(0);
   DataLow=spi_read(0);

   Chip_Select=1;

   Data=make16(DataHigh,DataLow);
   Data=Data>>2;
   EstadoTKP=Data & 0x01;
   Data=Data>>1;
   temp=Data*0.25;           //12bits, resolucion 0.25°C

       printf("Temp: %f \r\n",temp);  //muestro la temperatura actual por uart

  t1=0;    //Contadores de timer timer1_t1 a 0.
  t_seg=0;
}

}

void main()
{
   InitMain();

   while(TRUE)
   {



      ADC_Input();
   }

}
« Última modificación: 20 de Marzo de 2019, 19:33:00 por marmoleta »
El universo consta de varios niveles frecuencialesSomos "un gran programa de computadora" Esto es un eterno presente y el tiempo es una ilusion. Solo ante nuestros sentidos percibimos que esto es fisico. Es solo un holograma. Somos personajes "con diferentes niveles de conciencia" y cuanto más bajo sea el nivel de conciencia, más nos maneja el Ego y el Super Ego. Nuestra alma tiene oportunidad, en algunos casos, de elegir el juego y "materializarse mediante un avatar en muchos mundos". Cuando nos aburrimos de "bajar de nivel frecuencial para jugar al juego de los Yos y cuerpos avatares Comenzamos a despertar y debemos limpiar el karma. Cuando Limpiamos el karma y Nos desapegamos de los Yo para "Ser la escencia" Regresamos a la "Fuente" y podemos ser energias guías. Todo queda guardado en los Registros Akashicos by GB

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #1 en: 21 de Marzo de 2019, 07:28:16 »
Citar
Noté que cuando aumento la temperatura en la termocupla de manera brusca los valores llegan no sincronizados y desparejos habra alguna manera de detectar cambios es decir trabaja al minimo de lectura pero cuando detecta que sube la temperatura aumenta lavelocidad del timer automaticamente se puede realmente?

Tal ves el problema esta en que el ADC inicia su conversion cuando CS se pone en 1 y si supuestamente lo lees cada 1 segundos. Seguramente eso es lo que llamas "no sincronizado o desparejo".

Sino esas palabra no tiene sentido. ya que el ADC no posee FIFO, y simplemente envia la señal.
Citar
Es posible que cuando se detecte una señal se cambie el tiempo del Timer?

Si... si guardas el valor anterior, y definis que tenes una diferencia suficiente entre esos valores, entonces modificas una variable que es la que se compara con el timer, por ejemplo t_deseado1. Solo una consideracion, y es que no vas a poder bajar el tiempo a menos de lo que necesite el MAX6675 para convertir. Que son 0.22s (maximo definido por el datasheet), si tratas de leer a menos tus lecturas van a ser erroneas.

Desconectado marmoleta

  • PIC10
  • *
  • Mensajes: 20
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #2 en: 25 de Marzo de 2019, 00:26:55 »
Hola JC, muy agradecido por la respuesta, entonces podria guardar la ultima lectura y la comparo con la nueva algo asi si hay mucho valor de diferencia bajarle la velocidad al timer voy a intentar.
Por otra parte aqui desarme un pid digital marca gaynor y noté que en la entrada de la termocupla la parte negativa del sensor tiene un condensador como el de la foto acaso será un filtro o algo asi
« Última modificación: 25 de Marzo de 2019, 00:32:18 por marmoleta »
El universo consta de varios niveles frecuencialesSomos "un gran programa de computadora" Esto es un eterno presente y el tiempo es una ilusion. Solo ante nuestros sentidos percibimos que esto es fisico. Es solo un holograma. Somos personajes "con diferentes niveles de conciencia" y cuanto más bajo sea el nivel de conciencia, más nos maneja el Ego y el Super Ego. Nuestra alma tiene oportunidad, en algunos casos, de elegir el juego y "materializarse mediante un avatar en muchos mundos". Cuando nos aburrimos de "bajar de nivel frecuencial para jugar al juego de los Yos y cuerpos avatares Comenzamos a despertar y debemos limpiar el karma. Cuando Limpiamos el karma y Nos desapegamos de los Yo para "Ser la escencia" Regresamos a la "Fuente" y podemos ser energias guías. Todo queda guardado en los Registros Akashicos by GB

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #3 en: 25 de Marzo de 2019, 13:31:12 »
Citar
Por otra parte aqui desarme un pid digital marca gaynor y noté que en la entrada de la termocupla la parte negativa del sensor tiene un condensador como el de la foto acaso será un filtro o algo asi

Si es como el que mosrtas seguramente sea un filtro... Vos pensa que la temperatura no es algo que varia rapidamente. Es algo relativamente "lento" (lento para la velocidad de microcontrolador) asi que filtrar la señal para que cualquier pico/ruido no sea detectado no es una mala idea, por mas que un cambio de temperatura se vea en 10ms por ejemplo

Desconectado marmoleta

  • PIC10
  • *
  • Mensajes: 20
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #4 en: 26 de Marzo de 2019, 21:46:17 »
gracias JC voy a desguasar el pid de referencia a ver como filtra dicha señal y voy a intentar realizar la comparacion en el programa para que me se estabilice un poco te agradezco la ayuda
El universo consta de varios niveles frecuencialesSomos "un gran programa de computadora" Esto es un eterno presente y el tiempo es una ilusion. Solo ante nuestros sentidos percibimos que esto es fisico. Es solo un holograma. Somos personajes "con diferentes niveles de conciencia" y cuanto más bajo sea el nivel de conciencia, más nos maneja el Ego y el Super Ego. Nuestra alma tiene oportunidad, en algunos casos, de elegir el juego y "materializarse mediante un avatar en muchos mundos". Cuando nos aburrimos de "bajar de nivel frecuencial para jugar al juego de los Yos y cuerpos avatares Comenzamos a despertar y debemos limpiar el karma. Cuando Limpiamos el karma y Nos desapegamos de los Yo para "Ser la escencia" Regresamos a la "Fuente" y podemos ser energias guías. Todo queda guardado en los Registros Akashicos by GB

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #5 en: 28 de Abril de 2019, 19:07:30 »
Hola, en su día estuve trabajando con ese sensor, te paso mi proyecto, no está acabado el autotune no me llegó a funcionar pero lo demás si.
Horno de reflujo automático con PIC18F2455

Ahí te puedes fijar como capturo el dato y proceso los datos y los muestro en pantalla.

espero que te ayude,
saludos
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado marmoleta

  • PIC10
  • *
  • Mensajes: 20
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #6 en: 30 de Mayo de 2019, 09:37:56 »
Hola Thulsa Doom, muchas gracias por la respuesta,  el problema es que estando quieto oscila 1 digito (la medicion es buena) el problema es en "reposo" y no quiero usar delays bueno ahora chequeo el archivo
El universo consta de varios niveles frecuencialesSomos "un gran programa de computadora" Esto es un eterno presente y el tiempo es una ilusion. Solo ante nuestros sentidos percibimos que esto es fisico. Es solo un holograma. Somos personajes "con diferentes niveles de conciencia" y cuanto más bajo sea el nivel de conciencia, más nos maneja el Ego y el Super Ego. Nuestra alma tiene oportunidad, en algunos casos, de elegir el juego y "materializarse mediante un avatar en muchos mundos". Cuando nos aburrimos de "bajar de nivel frecuencial para jugar al juego de los Yos y cuerpos avatares Comenzamos a despertar y debemos limpiar el karma. Cuando Limpiamos el karma y Nos desapegamos de los Yo para "Ser la escencia" Regresamos a la "Fuente" y podemos ser energias guías. Todo queda guardado en los Registros Akashicos by GB

Desconectado marmoleta

  • PIC10
  • *
  • Mensajes: 20
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #7 en: 30 de Mayo de 2019, 09:49:31 »
Thulsa Doom, estuve "intentando" entender el programa (el archivo adjunto del post anterior) y admito que es verdaderamente "avanzado para mi". He visto un ejemplo tuyo aquí  en todopic realizado en pic c compiler  y lo tomo como referencia. Ese codigo no posee guardado de medidas/muestras por asi decirlo

Lee muy bien la temperatura pero el problema es la "velocidad de lectura" cuando está en reposo fluctua 1 grado,
 pero si le añado un delay se estabiliza. Luego si le damos calor al sensor de manera "brusca" aumenta de a 40 o de a 50 grados y se pierde la linealidad de la lectura (las decenas y centenas  ok el problema son las unidades). Eso me pasaba con sensores analogicos y lo corregia perfectamente con muestras. Con el max no se me ocurre que puedo utilizar
« Última modificación: 31 de Mayo de 2019, 01:07:38 por marmoleta »
El universo consta de varios niveles frecuencialesSomos "un gran programa de computadora" Esto es un eterno presente y el tiempo es una ilusion. Solo ante nuestros sentidos percibimos que esto es fisico. Es solo un holograma. Somos personajes "con diferentes niveles de conciencia" y cuanto más bajo sea el nivel de conciencia, más nos maneja el Ego y el Super Ego. Nuestra alma tiene oportunidad, en algunos casos, de elegir el juego y "materializarse mediante un avatar en muchos mundos". Cuando nos aburrimos de "bajar de nivel frecuencial para jugar al juego de los Yos y cuerpos avatares Comenzamos a despertar y debemos limpiar el karma. Cuando Limpiamos el karma y Nos desapegamos de los Yo para "Ser la escencia" Regresamos a la "Fuente" y podemos ser energias guías. Todo queda guardado en los Registros Akashicos by GB

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #8 en: 30 de Mayo de 2019, 10:30:21 »
Hola, no entiendo muy bien lo que quieres decir, te voy a relatar lo que yo he observado con este conversor.

Como bien dices, este conversor trabaja como mínimo con retardos de 200mls, menos tiempo de eso no le da tiempo al conversor de hacer la medida y se bloquea, entonces ese retardo lo puedes hacer con un delay o lo puedes hacer utilizando una librería de control de tiempo como la que he implementado en el proyecto que he compartido que se llama Tick.

lo normal es que no esté midiendo todo el rato si no cada x tiempo pero si lo que quieres es que mida la temperatura lo más rápido posible yo lo configuré que capturara medidas cada 300 milisegundos más o menos y me fabriqué una estructura donde fuera guardando 20 medidas y luego le hallaba la media, con eso se estabiliza mucho la medida.
Lo que tu me dices de las fluctuaciones es normal, eso va en la calidad también de la sonda tipo K y lo de un grado de diferencia a mi eso no me pasaba a mi me fluctuaba 0,25ºC arria - abajo que lo resolví como te dije hallando la media aritmética de por ejemplo 20 medidas, eso tu luego vas probando y dejas la cantidad de medidas que más se ajusten a lo que tu quieres

Las pruebas que hice midiendo con mi proyecto y con un termómetro de un polímetro y ambos con termocupulas  JK las diferencias eran mínimas y las velocidades de ascendencia de la temperatura eran iguales, cuando le acercaba una llama subía rápidamente y es normal ya que la llama de un mechero tienen mucha temperatura.

De echo parte de mi proyecto lo uso para un horno de reflujo para soldadura smd y siempre sueldo las pcb a la misma temperatura que indica mi proyecto
« Última modificación: 30 de Mayo de 2019, 10:35:58 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado marmoleta

  • PIC10
  • *
  • Mensajes: 20
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #9 en: 30 de Mayo de 2019, 18:08:23 »
Hola Thulsa Doom, entiendo, si tal cual esa pequeña oscilacion tendria que compensarla

Cuando está en reposo por ejemplo temperatura ambiente fluctua 1 grado o menos.
Si le aplicamos mas delay se estabiliza ok. Pero cuando comenzamos aumentar la temperatura en el sensor
El valor de temperatura mostrada en pantalla aumenta bruscamente y se pierden las unidades es como si en un cronometro los segundos en vez de ir de a 1 van de a 10 o de a 20.

Obtener varias medidas y hallar la media podria mejorar
y para no usar delays_ms se podria usar un timer,  he intentado como 200 veces aplicar timer, "tomar muestras" pero no me ha funcionado en el max. Con lectura analogica del pic si.  si fueras tan amable y te pido disculpas la molestia tendrias algun ejemplo en pic c compiler acerca de eso

esto es lo que tengo actualmente:

Código: [Seleccionar]
void leer_termocupula(){
        int16 temp;
     

     
        int cadena1,cadena2;  //declaramos las variables donde se guardaran el dato que viene del max6675
                                         //el dato viene en dos paquetes separados de 8 bits, por eso se guardan en dos cadenas                         
       // delay_ms(5);

 if(t_seg>=t_deseado1){


         
           for (int i = 0; i <3; i ++){ // Leer valor por 3 veces
        output_low(CS_max6675);               //Se activa la señal de bit_select(CS) a 0 para que el max se active
        cadena1 = spi_read(0);  //Lee el primer byte que viene del max6675
        cadena2 = spi_read(0);  //Lee el segundo byte, con eso ya tenemos los 16bits de la lectura del max7765
        output_high(CS_max6675);              //Se pone a 1 la señal de bit_select(CS) para que el max tome otra lectura
       
                 
      // buffer = ((cadena1 * 256) + cadena2);  //Se unen las dos cadenas de 1 byte que viene del max6675 y se
                                                         //guardan en una variable int16 llamada buffer de 16 bits
           buffer = cadena2; // Cargo Byte LB
*((char *)&buffer+1)=cadena1; // Cargo Byte HB.  y los uno los dos en una palabra de 16 bits que se llama buffer         

                      temp = (buffer & 0b0111111111111000)>>3;    //Seleccionamos los bits que nos interesan haciéndole lo que se llama
                                                           //Una máscara, se le hace un AND al dato con un número en binario, los unos significan los bits que queremos utilizar y los 0 los que desechamos
                                                           //Luego le hacemos un >>3 que significa que rodamos los 1 a la derecha 3 posiciones para eliminar los 0 del final 
                                                           
       
          temperatura = (temp * 0.25);  //12 bits en decimal equivalen a 4095, para que de los 1023,75 ºC se tiene que multiplicar por 0.25 que es la resolución de cada bit del MAX6675
}
   
   
   
  t1=0;    //Contadores de timer timer1_t1 a 0.
  t_seg=0;
}


           

« Última modificación: 31 de Mayo de 2019, 01:08:53 por marmoleta »
El universo consta de varios niveles frecuencialesSomos "un gran programa de computadora" Esto es un eterno presente y el tiempo es una ilusion. Solo ante nuestros sentidos percibimos que esto es fisico. Es solo un holograma. Somos personajes "con diferentes niveles de conciencia" y cuanto más bajo sea el nivel de conciencia, más nos maneja el Ego y el Super Ego. Nuestra alma tiene oportunidad, en algunos casos, de elegir el juego y "materializarse mediante un avatar en muchos mundos". Cuando nos aburrimos de "bajar de nivel frecuencial para jugar al juego de los Yos y cuerpos avatares Comenzamos a despertar y debemos limpiar el karma. Cuando Limpiamos el karma y Nos desapegamos de los Yo para "Ser la escencia" Regresamos a la "Fuente" y podemos ser energias guías. Todo queda guardado en los Registros Akashicos by GB

Desconectado marmoleta

  • PIC10
  • *
  • Mensajes: 20
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #10 en: 01 de Junio de 2019, 10:34:25 »
Ya lo he solucionado, me he buscado por todo internet durante varios dias y no pude encontrar absolutamente ningun ejemplo ni tampoco que nadie requiera " medir temperatura PERfectamente" y los valores escalonados sin "saltear numeros" como burro arrepentido
Porque hasta muy buenos programadores en videos de youtube con un codigo magistral se les piantan las unidades en lecturas extremadamente rapidas.

Tambien el tema de ruidos hasta cuando permanecia en temperatura ambiente oscilaba 0.5 a 0.75 y eso hacia que la lectura se lea en oscilacion 1°c.

La solucion es NO utilizar la variable que toma la temperatura para mostrar en display o lcd, sino otra variable aparte e igualarla solo que con retraso. Leer la temperatura cada 200ms o un poco más por medio del timer0. Y el hadware Filtrar correctamente segun hoja de datos. Tambien ver el tema de tierra analogica y digital

Utilizar una variable llamemosle buffer y actualizarla unicamente si la lectura da un valor mayor (puede ser a 2 minimo).

Bueno sin más publico el "rebuscado codigo todo desordenado descomentado en prueba empírica" hay que pasarlo en limpio, mejorarlo y demas hierbas. que probando aqui con una maquina con resistencias termicas conectadas a un rele de estado solido controlado por el pic. en total las resistencias dan 16 Amp en 220v. Probado en temperatura ambiente como asi tambien hasta los 300.

da exactamente muy buena lectura Consisa, sin oscilaciones. 

No es un medidor de la farsa digo de la Nasa.. pero camina.....

espero que alguien más le sirva.
Agradezco enormeente a Thulsa Doom el cual me ayudó muchisimo gracias!!

Código: [Seleccionar]
do{

if(i==1){   
 leer_temperatura();
       
}

 if(temp2<temp_final){ // si la nueva lectura es menor que la vieja.. entonces DISMINUYE:: Cuanto?
  temp_temporal=temp_final-temp2;

    if(temp_final!=temp2){
           
        temp_final--;

        }   
        //delay_ms(1);   
         
 }else if(temp2>temp_final){ // si la nueva lectura es mayor que la vieja.. entonces AUMENTA:: Cuanto?
 temp_temporal=temp2-temp_final;

        //if(temp_final!=temp2){
        if(temp_temporal>=3){
       
        temp_final++;
      delay_ms(1);


       
     
         }
         
   
 }
if(item==0){

   int firstdig = temp_final / 100;
   int seconddig = (temp_final - (firstdig * 100))/ 10;
   int thirddig =  temp_final - (firstdig * 100) - (seconddig*10);   

   TM1637_display_digit(TM1637_SET_ADR_00H, (firstdig) % 0x10);
   TM1637_display_digit(TM1637_SET_ADR_01H, (seconddig) % 0x10);
   TM1637_display_digit(TM1637_SET_ADR_02H, (thirddig) % 0x10);
   
}

          if(temp_final<=Temperatura_deseada-2){ //Si Alcanzo la temperatura deseada Apago Rele_temperatura de lo cotnario Lo enciendo.
   if(temp_final!=0){
   Encend(Rele_temperatura);  // Enciendo el Relay de calentamiento
   }
 if(item==0){
 
     lcd_gotoxy(1,3);
   printf(lcd_putc,"     Calentando..   ");               // Escribo la temperatura actual de la termocupla
 }
   
    }else{

  Apag(Rele_temperatura); //Apago el rele de calentamiento.
 
   if(item==0){ 
  lcd_gotoxy(1,3);
  printf(lcd_putc,"    Calor deseado.  ");               // Escribo la temperatura actual de la termocupla
   }
}


#include <menu_item.c>

       }
 
      while(TRUE);

}
//Guido Batan Maquinarias



Código: [Seleccionar]
y en el void de temperatura:


void leer_temperatura(){

  int16 temp;

  int cadena1,cadena2;  //declaramos las variables donde se guardaran el dato que viene del max6675

        output_low(CS_max6675);               //Se activa la señal de bit_select(CS) a 0 para que el max se active
        cadena1 = spi_read(0);  //Lee el primer byte que viene del max6675
        cadena2 = spi_read(0);  //Lee el segundo byte, con eso ya tenemos los 16bits de la lectura del max7765
        output_high(CS_max6675);              //Se pone a 1 la señal de bit_select(CS) para que el max tome otra lectura
       
                 
      // buffer = ((cadena1 * 256) + cadena2);  //Se unen las dos cadenas de 1 byte que viene del max6675 y se
                                                         //guardan en una variable int16 llamada buffer de 16 bits
           buffer = cadena2; // Cargo Byte LB
*((char *)&buffer+1)=cadena1; // Cargo Byte HB.  y los uno los dos en una palabra de 16 bits que se llama buffer         

                      temp = (buffer & 0b0111111111111000)>>3;    //Seleccionamos los bits que nos interesan haciéndole lo que se llama
                                                           //Una máscara, se le hace un AND al dato con un número en binario, los unos significan los bits que queremos utilizar y los 0 los que desechamos
                                                           //Luego le hacemos un >>3 que significa que rodamos los 1 a la derecha 3 posiciones para eliminar los 0 del final 
                                                           
       
          temp2 = (temp * 0.25);  //12 bits en decimal equivalen a 4095, para que de los 1023,75 ºC se tiene que multiplicar por 0.25 que es la resolución de cada bit del MAX6675   
         
  if(temp2!=0 && temp_test==0){     
 temp_final=temp2;       
  //temperatura=temp2;   
  //lcd_clear(); 
temp_test=1;         
         }     
         
//Guido Batan Maquinarias         
         
         
         
   
          }

 :-/ :-/ :5] :5] :5] :5] ((:-)) ((:-)) ((:-)) :)

« Última modificación: 01 de Junio de 2019, 11:02:31 por marmoleta »
El universo consta de varios niveles frecuencialesSomos "un gran programa de computadora" Esto es un eterno presente y el tiempo es una ilusion. Solo ante nuestros sentidos percibimos que esto es fisico. Es solo un holograma. Somos personajes "con diferentes niveles de conciencia" y cuanto más bajo sea el nivel de conciencia, más nos maneja el Ego y el Super Ego. Nuestra alma tiene oportunidad, en algunos casos, de elegir el juego y "materializarse mediante un avatar en muchos mundos". Cuando nos aburrimos de "bajar de nivel frecuencial para jugar al juego de los Yos y cuerpos avatares Comenzamos a despertar y debemos limpiar el karma. Cuando Limpiamos el karma y Nos desapegamos de los Yo para "Ser la escencia" Regresamos a la "Fuente" y podemos ser energias guías. Todo queda guardado en los Registros Akashicos by GB

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re:Midiendo Temperatura con max6675 y pic16f887 pulsos desincronizados
« Respuesta #11 en: 12 de Enero de 2020, 06:51:33 »
Ya lo he solucionado, me he buscado por todo internet durante varios dias y no pude encontrar absolutamente ningun ejemplo ni tampoco que nadie requiera " medir temperatura PERfectamente" y los valores escalonados sin "saltear numeros" como burro arrepentido
Porque hasta muy buenos programadores en videos de youtube con un codigo magistral se les piantan las unidades en lecturas extremadamente rapidas.

Tambien el tema de ruidos hasta cuando permanecia en temperatura ambiente oscilaba 0.5 a 0.75 y eso hacia que la lectura se lea en oscilacion 1°c.

La solucion es NO utilizar la variable que toma la temperatura para mostrar en display o lcd, sino otra variable aparte e igualarla solo que con retraso. Leer la temperatura cada 200ms o un poco más por medio del timer0. Y el hadware Filtrar correctamente segun hoja de datos. Tambien ver el tema de tierra analogica y digital

Utilizar una variable llamemosle buffer y actualizarla unicamente si la lectura da un valor mayor (puede ser a 2 minimo).

Bueno sin más publico el "rebuscado codigo todo desordenado descomentado en prueba empírica" hay que pasarlo en limpio, mejorarlo y demas hierbas. que probando aqui con una maquina con resistencias termicas conectadas a un rele de estado solido controlado por el pic. en total las resistencias dan 16 Amp en 220v. Probado en temperatura ambiente como asi tambien hasta los 300.

da exactamente muy buena lectura Consisa, sin oscilaciones. 

No es un medidor de la farsa digo de la Nasa.. pero camina.....

espero que alguien más le sirva.
Agradezco enormeente a Thulsa Doom el cual me ayudó muchisimo gracias!!

Código: [Seleccionar]
do{

if(i==1){   
 leer_temperatura();
       
}

 if(temp2<temp_final){ // si la nueva lectura es menor que la vieja.. entonces DISMINUYE:: Cuanto?
  temp_temporal=temp_final-temp2;

    if(temp_final!=temp2){
           
        temp_final--;

        }   
        //delay_ms(1);   
         
 }else if(temp2>temp_final){ // si la nueva lectura es mayor que la vieja.. entonces AUMENTA:: Cuanto?
 temp_temporal=temp2-temp_final;

        //if(temp_final!=temp2){
        if(temp_temporal>=3){
       
        temp_final++;
      delay_ms(1);


       
     
         }
         
   
 }
if(item==0){

   int firstdig = temp_final / 100;
   int seconddig = (temp_final - (firstdig * 100))/ 10;
   int thirddig =  temp_final - (firstdig * 100) - (seconddig*10);   

   TM1637_display_digit(TM1637_SET_ADR_00H, (firstdig) % 0x10);
   TM1637_display_digit(TM1637_SET_ADR_01H, (seconddig) % 0x10);
   TM1637_display_digit(TM1637_SET_ADR_02H, (thirddig) % 0x10);
   
}

          if(temp_final<=Temperatura_deseada-2){ //Si Alcanzo la temperatura deseada Apago Rele_temperatura de lo cotnario Lo enciendo.
   if(temp_final!=0){
   Encend(Rele_temperatura);  // Enciendo el Relay de calentamiento
   }
 if(item==0){
 
     lcd_gotoxy(1,3);
   printf(lcd_putc,"     Calentando..   ");               // Escribo la temperatura actual de la termocupla
 }
   
    }else{

  Apag(Rele_temperatura); //Apago el rele de calentamiento.
 
   if(item==0){ 
  lcd_gotoxy(1,3);
  printf(lcd_putc,"    Calor deseado.  ");               // Escribo la temperatura actual de la termocupla
   }
}


#include <menu_item.c>

       }
 
      while(TRUE);

}
//Guido Batan Maquinarias



Código: [Seleccionar]
y en el void de temperatura:


void leer_temperatura(){

  int16 temp;

  int cadena1,cadena2;  //declaramos las variables donde se guardaran el dato que viene del max6675

        output_low(CS_max6675);               //Se activa la señal de bit_select(CS) a 0 para que el max se active
        cadena1 = spi_read(0);  //Lee el primer byte que viene del max6675
        cadena2 = spi_read(0);  //Lee el segundo byte, con eso ya tenemos los 16bits de la lectura del max7765
        output_high(CS_max6675);              //Se pone a 1 la señal de bit_select(CS) para que el max tome otra lectura
       
                 
      // buffer = ((cadena1 * 256) + cadena2);  //Se unen las dos cadenas de 1 byte que viene del max6675 y se
                                                         //guardan en una variable int16 llamada buffer de 16 bits
           buffer = cadena2; // Cargo Byte LB
*((char *)&buffer+1)=cadena1; // Cargo Byte HB.  y los uno los dos en una palabra de 16 bits que se llama buffer         

                      temp = (buffer & 0b0111111111111000)>>3;    //Seleccionamos los bits que nos interesan haciéndole lo que se llama
                                                           //Una máscara, se le hace un AND al dato con un número en binario, los unos significan los bits que queremos utilizar y los 0 los que desechamos
                                                           //Luego le hacemos un >>3 que significa que rodamos los 1 a la derecha 3 posiciones para eliminar los 0 del final 
                                                           
       
          temp2 = (temp * 0.25);  //12 bits en decimal equivalen a 4095, para que de los 1023,75 ºC se tiene que multiplicar por 0.25 que es la resolución de cada bit del MAX6675   
         
  if(temp2!=0 && temp_test==0){     
 temp_final=temp2;       
  //temperatura=temp2;   
  //lcd_clear(); 
temp_test=1;         
         }     
         
//Guido Batan Maquinarias         
         
         
         
   
          }

 :-/ :-/ :5] :5] :5] :5] ((:-)) ((:-)) ((:-)) :)

Hola, siento leer esto tan tarde, la verdad que me despisté y la web no me envió ningún aviso de que se había comentado algo, pues me alegro de que lo hayas solucionado y gracias por compartir la solución con todos nosotros, saludos
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...


 

anything