Mensajes recientes

Páginas: 1 2 3 4 5 6 7 8 [9] 10
81
Foro Técnico / Re:Calibrar el rtc por "smooth calibration"
« Último mensaje por Picuino en 12 de Enero de 2020, 07:44:07 »
El método anterior funciona incluso con un oscilador principal de baja precisión, porque la mayor parte del tiempo se va a medir con la señal de 1PPS que tiene mucha precisión, de manera que se puede realizar incluso con el oscilador interno del microcontrolador.
82
Foro Técnico / Re:Calibrar el rtc por "smooth calibration"
« Último mensaje por Picuino en 12 de Enero de 2020, 07:40:53 »
Con el frecuencímetro me he equivocado un poco, porque el método anterior pierde hasta un pulso inicial de 32kHz y eso es mucho.

Lo mejor es medir el tiempo desde la señal de 1 PPS hasta el siguiente pulso de 32kHz y medir los pulsos de 32kHz entre 2 señales de 1 PPS. A partir de ahí se calcula el tiempo total y el número de pulsos de 32kHz totales. Con eso se puede calcular la frecuencia y a partir de la frecuencia, el ajuste necesario.

Un poco laborioso, pero en 1 segundo tienes tu calibración hecha internamente con solo recibir una señal de 1PPS en el microcontrolador y entrar en el modo "Calibración".

Un saludo.
83
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
84
Foro Técnico / Re:Calibrar el rtc por "smooth calibration"
« Último mensaje por Picuino en 11 de Enero de 2020, 21:52:02 »
Lo primero que necesitas es una señal calibrada de 1Hz, de referencia.
Te recomiendo comenzar con un GPS, que tiene una señal de 1PPS (Pulso Por Segundo) con bastante precisión (unos cientos de nanosegundos).

A continuación necesitas hacer un buen frecuencímetro que mida la frecuencia del clock del RTC con precisión de 1 parte por millón (6 decimales) y a partir de ahí calcular el smooth calibration necesario para compensar el error.
Ese frecuencímetro puede ser externo al micro y enviar la calibración o puede ser interno al micro (más recomendable para simplificar el circuito total)

Por ejemplo puedes comenzar a medir pulsos del RTC clock cuando llegue el primer pulso por segundo. Después mides 32764 pulsos del reloj y a continuación mides los microsegundos hasta que llega el siguiente pulso por segundo. Deberían ser 122 microsegundos. Cualquier desviación es el error a corregir. Es solo un ejemplo. Hay más maneras de realizarlo.

Un Saludo.
85
Foro Técnico / Re:Calibrar el rtc por "smooth calibration"
« Último mensaje por KILLERJC en 11 de Enero de 2020, 21:36:25 »
Estuve leyendo y tratando de entender lo que plantea el documento.

La calibración es para cuando tengas un oscilador que NO es demasiado exacto. Tal como el LSE del micro.
Y siempre necesitas una referencia externa y precisa, que seria tu oscilador externo.

El problema es que creo que estas planteando "corregir" lo que te presenta el cristal de 32KHz, y para eso necesitas otro oscilador externo MEJOR que el anterior.
Encima tenes desviaciones de frecuencia por temperatura y voltajes por lo tanto como bien dice al ultimo, este proceso de calibracion debe ser continuo y no solo una ves al inicio.

¿A que lleva a esto?
Que si o si uses un oscilador externo "bueno". No queda otra.

Citar
ademas de tener que esperar 32 segundos a que se calibre cada uno.
Depende, si haces llegar la señal a todos juntos, si 32 segundos te podria llevar caibrar muchos de golpe.
86
Lenguaje C para microcontroladores PIC / Re:Display TM1637
« Último mensaje por javiscrip en 11 de Enero de 2020, 21:02:06 »
t=23s
87
Lenguaje C para microcontroladores PIC / Re:i2c por software
« Último mensaje por remi04 en 11 de Enero de 2020, 20:33:21 »
Primero muchas gracias por sus respuestas, ya solucione mi problema y quiero dejarles la libreria I2C por software para que alguien pueda hacer uso de la misma, no se de donde lo descargue porque entre a muchas paginas web y me descargue varias librerias y probando todas me quede con una que fue la mas estable.
hola keydarkman , disculpa la molestia descargue la libreria que dejas pero me sale error en #include <xc.h>

  Por que usas el compilador CCS ,y no el XC8 ¿es así? . 
88
Lenguaje C para microcontroladores PIC / Re:i2c por software
« Último mensaje por kuroazama en 11 de Enero de 2020, 16:43:27 »
Primero muchas gracias por sus respuestas, ya solucione mi problema y quiero dejarles la libreria I2C por software para que alguien pueda hacer uso de la misma, no se de donde lo descargue porque entre a muchas paginas web y me descargue varias librerias y probando todas me quede con una que fue la mas estable.
hola keydarkman , disculpa la molestia descargue la libreria que dejas pero me sale error en #include <xc.h>
89
Foro Técnico / Re:Calibrar el rtc por "smooth calibration"
« Último mensaje por juaperser1 en 11 de Enero de 2020, 15:56:01 »
A ver despues de leerme el documento este veo que existen varias formas:

existen dos registros para sumar o enmascarar pulsos del reloj y así ajustar la frecuencia, el CALP y el CALM del registro RTC_CALR

estos pulsos se suman o restan por ventanas de 32 segundos (aunque pueden ser de 16 u 8 tambien si los configuras pero por defecto 32)

El problema es como medir este error, el documento dice que para verificarlo puedo usar la salida de 1Hz, Alarmas de menos de 1 seg, o el temporizar de wake up.

Vale para calibrar uno mediria la salida de 1 Hz con un osciloscopio y lo haría a mano, pero que pasa si quiero hacer 2000 sistemas iguales? no puedo hacerlos uno a uno.

Si realimento el pin de 1Hz por otro pin y lo capturo con un timer, estoy también metiendo el error del reloj del sistema, no se si esto es buena idea.

luego hay otro registro, que sirve para sumar o restar segundos el "RTC shift" este lo pones tu manualmente por lo que entiendo.

¿cual seria la mejor manera de proceder?

En el ejemplo, necesitas una señal de 1Hz externa para calibrar el sistema, no creo que sacarla de otra para del micro sea correcto por que tendrá incluso mas error, pero para un aparato del que se vayan a fabricar cientos o miles no me parece muy lógico tener que hacer esto uno a uno ademas de tener que esperar 32 segundos a que se calibre cada uno.
y añadir un sistema que de una señal de 1Hz exacta tampoco me parece que sea la solucion ya que encarece el sistema,

Citar
The application is based on the following four steps:
1. A 1 Hz reference clock is connected to TIM3 through the PD2 GPIO.
2. TIM3 is configured to generate a rising edge after 32 x 1 Hz reference rising edges.
This gives an event every 32 seconds.
3. TIM2 is configured to increment its counter on CLK_RTC, to get the counter value on
the rising edge generated by TIM3 and to store it in the TIM2_CCR1 register. It then
reset itself.
4. The Cortex®-M4 core gets the TIM2_CCR1 value, compares it with the number of
CLK_RTC cycles expected in 32 seconds and processes the comparison results to
update the CALP and CALM fields of the RTC_CALR register.
The calibration is continuous.

un saludo.
90
Empleo (Ofertas/Demandas) EN PRUEBAS / Borrar
« Último mensaje por Albatros en 11 de Enero de 2020, 15:54:46 »
Borrar
Páginas: 1 2 3 4 5 6 7 8 [9] 10