Autor Tema: Retardos muy largos y precisión del reloj interno.  (Leído 454 veces)

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

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 172
Retardos muy largos y precisión del reloj interno.
« en: 07 de Julio de 2020, 04:47:59 »
¡Saludos al foro!

Estoy desarrollando un "data logger" que tiene que almacenar un dato cada minuto durante varios meses. Mi duda es si la precisión del oscilador interno del pic provocará grandes diferencias entre el tiempo real y el tiempo de almacenamiento. Una discrepancia del orden de minutos en tres meses sería perfectamente asumible, pero si el error es del orden de horas tendría que buscar otra solución.

Mi idea es que el micro esté en modo sleep la mayor parte del tiempo y despertarlo mediante el WDT. ¿Me daría la precisión suficiente el WDT?

Espero alguna sugerencia y gracias por anticipado!

Conectado Eduardo2

  • PIC18
  • ****
  • Mensajes: 374
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #1 en: 07 de Julio de 2020, 09:43:12 »
La forma mas sencilla es programar el timer para que lecturas de aproximadamente 1 minuto (lo que salga) y manejarte los primeros loggins con el tiempo de inicio y fin. 
Con eso calculás la constante escala con bastante precisión y podés programar una corrección del conteo haciendo que cada x cuentas se sume/reste 1.




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7856
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #2 en: 07 de Julio de 2020, 10:46:06 »
El datalogger eta conectado a internet ? o no tienen ninguna comunicacion, es ponerlo y dejarlo?

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1194
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #3 en: 07 de Julio de 2020, 10:52:28 »
Bueno el posible problema reside en que estarás usando el WDT, y este tiene un oscilador RC (Resistor-capacitor), el cual afecta su periodo dependiendo del voltaje, varaiaciones en la temperatura, proceso de fabricación de chip en chip. El oscilador tiene un periode de tiempo de 18 ms nominal, pero segun los datasheets este puede variar desde 7ms hasta 33ms. Así que como te puedes dar cuenta su rango de varaición es bastante amplio, así que si quieres usarlo para despertar al micro cada minuto es posible que tengas un error muy grande en periodos muy grandes. Esto es hablando de los microcontroladores de generación anterior como el PIC16F628A, PIC16F887, etc.

Para los microcontroladores de generaciones más recientes, estos usan el oscilador interno de baja o mediana frecuencia, y este oscilador está calibrado con 1% de error, el cual es mucho mejor. El prescalar tiene muchas más opciones que va desde 1ms hasta 256s, comparado con la generación anterior de microcontroladores que iba desde 18ms a 2.3s.

Basado en esos números puedes realizar un cálculo aproximado de cuál sería el error acumulado en un periodo largo de tiempo de operación.

Si requieres mayor precisión, tendrás que usar un RTC externo y que este puede generarte una interrupción cada minuto, y esa interrupción aplicarla al microcontrolador para despertarlo.

elreypic.

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 172
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #4 en: 08 de Julio de 2020, 04:14:42 »
¡Gracias por las respuestas!

Voy a probar el oscilador interno de baja frecuencia a ver qué es lo que ocurre.

¿Qué micros "de generaciones más recientes" lo implementan?. Yo pensaba usar el pic18f2550 porque necesito volcar los datos por USB. ¿Me puede servir?

¡Gracias por anticipado!

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1194
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #5 en: 08 de Julio de 2020, 07:11:51 »
Por ahí hubieras comenzado. Regularmente el WDT opera de manera diferente dependiendo el microcontrolador.
En tu caso, el WDT tiene su fuente de oscilación de un oscilador interno RC de 31KHz (mira la página 24 del datasheet). Y esta no puede ser cambiada, es decir no depende del tipo de oscilador usado, siempre el WDT tendrá un oscilador de 31KHz.
Después esa frecuencia de 31KHz es dividada entre 128 (ahora mira la página 297 del datasheet), esto hace que genere una frecuencia de 242.1875 Hz, y de ahí obtienes el periodo mínimo del WDT que es de 4.129 ms y de acuerdo al datasheet este tiempo es de 4ms (página 383 del datasheet).

Ahora bien por ser un circuito RC de oscilación, el cambio en el voltaje de operación y la temperatura, la frecuencia va a cambiar. Pero esta según el datasheet página 381, puede ir desde 26.562KHz a 35.938 KHz, pero ha sido calibrada a 31KHz en 25 centígrados.

Para cambiar el periodo del WDT lo haces mediante los fusibles del registro CONFIG2H (ver página 290 del datasheet). El cual es el registro para controlar el postscalar desde 1:1 a 1:32768, logrando así un periodo del WDT desde 4ms hasta 131.072 segundos.

saludos,

elreypic.

Conectado Eduardo2

  • PIC18
  • ****
  • Mensajes: 374
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #6 en: 08 de Julio de 2020, 09:46:55 »
Me parece que no sos conciente de la precisión necesaria para cumplir con  "una discrepancia del orden de minutos en tres meses sería perfectamente asumible"
En un  oscilador RC no pidas precisiones menores del 1%, y en 3 meses eso representa un  error de 0.01*24*30*3=21.6hs !!!  (en el peor de los casos obviamente)
Si ese error es asumible, adelante con el WDT.  Pero si no, la única manera de conseguir de manera autónoma la exactitud asumible es con un reloj externo que despierte al micro cada minuto cuya exactitud es del orden de 10ppm (partes por millón).

Incluso si el reloj externo solo diera un pulso a intervalos fijos (0.5" o 1" como en los relojes de plástico) no sería inconveniente pues el micro despertaría y si no se cumplieron 60/120 cuentas se dormiría de nuevo.  Como esto no duraría ni 1ms prácticamente no afectaría al consumo.

Saludos.

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 450
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #7 en: 08 de Julio de 2020, 20:58:58 »
También puede colocar un cristal de 32768 khz de los que se usan con los rtc y conectarlo a un timer. Programar wakeup por desbordamiento. Se gana precisión de un rtc pero sin usar un rtc.

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 172
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #8 en: 09 de Julio de 2020, 03:24:13 »
¡Muchas gracias a todos por las respuestas!

Ya me ha quedado claro que debo añadir un circuito externo de reloj que "despierte" al micro a intervalos regulares. He pensado en PCF8563 porque ya he trabajado con él, pero tal vez conozcáis algún timer "especializado" ya que este integrado es un reloj/calendario de uso general.

¡Gracias por anticipado!

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1194
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #9 en: 09 de Julio de 2020, 10:08:19 »
Que tal PicMinor,

Pues la verdad no sé a qué te refieres con "timer especializado". En realidad el RTC es eso, un timer especializado. Yo lo usaría simplemente para que su salida de 1 Hz me genere una interrupción cada segundo y eso depierte al microcontrolador, lo que significa es que el microcontroaldor necesitará contar 60 veces (es decir las veces que se despierta hasta alcanzar 60) y de esa manera realizar lo que necesitas. No tienes ni siquiera que configurar la hora y la fecha; pero es raro que no la necesites ya que eso algo que en un datalogger se requiere. En fin no sé cuál sea exactamente la aplicación de ese datalogger. Si no quieres, tener que conectar el PCF8563 para poder configurar la salida de 1Hz, entonces usa el circuito 74HC4060, que es un contador de 14 etapas con oscilador. Con este circuito pudes colocar un cristal de 32.768 KHz y en la última etapa de salida tendrás una frecuencia de 2Hz. Esa salida la conectas al pin de interrupción del micro y en lugar de contar 60 veces, necesitas contar 120 veces, es decir necesitas que el micro se despierte 120 veces en un minuto y cuando llegas al 120, realizas la operación requerida.
Si eso no te satisface, entonces usa un microcontrolador pequeñito que tenga un timer de 16 bits con oscilador externo, le conectas el cristal de 32.768KHz, realizas un programita que cuente desde el numero 32768 hasta que se desborde y cuando se desborde, generas un pulso en un pin de salida, ese pin de salida será de 1Hz, ese lo aplicas a tu micro del datalogger y sigues las instrucciones ya mencionadas.
Las opciones son muchas, pero ya depende de ti cuál quieras usar. Incluso si lo haces con unmicro pequeñito, puedes realizar la cuenta en ese mismo y generar el pulso cada minuto, de esa forma tu micro principal estará en sleep completamente por 1 minuto.

saludos,

elreypic.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7856
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #10 en: 09 de Julio de 2020, 11:20:11 »
Yo usaria la alarma del mismo RTCC para despertar el micro, leer, y luego cargar la alarma siguiente. Así lo despierta en los intervalos correctos.

Tendrias que tener en cuenta algun corte de energia en tu micro. El cual haria que se salte alguna de esas alarmas, y en el power-up revisar los datos de la hora y alarma, registrar si es necesario los datos,  y/o acomodar los horarios de la nueva alarma.

Otra opcion es generar como te dijeron pulsos cada 1Hz, y usar algun Timer de form asincrona y con entrada externa , para que en su overflow te detecte que paso la hora. Pero esto es suceptible al corte de energia. Por lo que considero mejor aproximacion la anterior, debido a que el RTCC esta soportado por la bateria.

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 172
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #11 en: 10 de Julio de 2020, 08:01:38 »
¡Saludos al foro!

Ahora sí que me he quedado un poco desconcertado, me explico:

¿De qué me sirve "dormir" al mico principal si tengo otro micro "pequeñito" funcionando?

No sé si estoy equivocado pero lo que busco es un circuito de muy bajo consumo que me genere un pulso lo más exacto posible para "despertar" al micro principal. Cuanto más espaciado esté el pulso mejor, si me lo suministrara cada minuto sería perfecto, pero si es en cualquier otro intervalo no sería ningún problema (Siempre y cuando no sea cada pocos milisegundos).

Al principio de vuestras explicaciones me pareció que quedaba claro que no podía utilizar el oscilador del WDT porque no me da la precisión necesaria pero ahora me habláis de usar el RTCC. ¿Acaso no es el mismo oscilador?

Seguro que estoy un poco despistado, pero de todas formas muchas gracias por vuestras respuestas!

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1194
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #12 en: 10 de Julio de 2020, 10:51:19 »
¡Saludos al foro!

Ahora sí que me he quedado un poco desconcertado, me explico:

¿De qué me sirve "dormir" al mico principal si tengo otro micro "pequeñito" funcionando?

No sé si estoy equivocado pero lo que busco es un circuito de muy bajo consumo que me genere un pulso lo más exacto posible para "despertar" al micro principal. Cuanto más espaciado esté el pulso mejor, si me lo suministrara cada minuto sería perfecto, pero si es en cualquier otro intervalo no sería ningún problema (Siempre y cuando no sea cada pocos milisegundos).

Al principio de vuestras explicaciones me pareció que quedaba claro que no podía utilizar el oscilador del WDT porque no me da la precisión necesaria pero ahora me habláis de usar el RTCC. ¿Acaso no es el mismo oscilador?

Seguro que estoy un poco despistado, pero de todas formas muchas gracias por vuestras respuestas!

Respuesta rápida: RTCC (Real Time Clock Calendar) ese es el PCF8563. No se refiere a ningún timer interno del microcontrolador.
Como bien ya se te sugirió, puedes usarlos de tres formas:

1) Simplemente configura la salida del PCF8563 para que te genera una señal de 1Hz en su salida CLKOUT, que es el pin 7 (Por default te genera la frecuencia del cristal de 32.768KHz) y esa salida la conectas en el pin de interrupción del microcontrolador para despertarlo una vez por segundo. Cuentas las veces que se despierta el micro hasta alcanzar 60 (ahí esta tu minuto) y en ese momento realizas la operación ncecesaria. El pin CLKOUT es de drain abierto, por lo que necesitas una resistencia de pull-up.

2) Configura la alarma interna del PCF8563 para que te genere una interrupción cada minuto en su pin de INT (pin 3 del PCF8563) y esta salida la llevas al pin de interrupción del microcontrolador y así lo despiertas cada minuto. Este pin de interrupcion del PCF8563 es de drain abierto, por lo que necesitas agregar una resistencia de pull-up y genera un flanco de bajada en la interrupción. Solo necesitas configurar los minutos de la alarma.

3)Usar el contador descendente interno de 8 bits, el cual te permite generar una interrupción cada cierto tiempo, en tu caso cada minuto. Tienes que leer el datasheet para entender el funcionamiento, principalmente la página 16. Pero necesitas entender también los registros de status (páginas 7 a la 9).

Saludos y espero esto te haya aclarado la mente y quitado la confusión.

elreypic.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7856
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #13 en: 10 de Julio de 2020, 11:20:42 »
Citar
¿De qué me sirve "dormir" al mico principal si tengo otro micro "pequeñito" funcionando?

El problema es el consumo que tienen.
El consumo del PIC ronda los 1 a 15 mA dependiendo del PIC, del oscilador, modulos activos, etc. (PIC solo, sin contar las salidas a las cuales les vas a tener que dedicar tu tiempo, sin salidas al aire libre, etc.)

Mientras que el RTC el consumo para mantener los datos es de nA. Al estar activa la interfaz de I2C consume mas, con un reloj de 100KHz el consumo es de 200uA y con el reloj de 400Khz el consumo es de 800uA. Asi que es a tener en cuenta el consumo.
Por lo tanto mientras el RTC esta funcionando sin interacción el consumo es casi nulo.

Vos necesitas poner a tu PIC a dormir para que logre un bajo consumo, poniendolo en SLEEP o en su modo de mas baja energia donde el consumo suele ser de uA tambien. Todo depende del PIC que estes usando y sus modulos.

Asi logras tu bajo consumo. Y como bien decis, mientras mas lo tengas en SLEEP menos consumo promedio vas a tener, asi que conviene tenerlo lo mas posible.

Citar
Al principio de vuestras explicaciones me pareció que quedaba claro que no podía utilizar el oscilador del WDT porque no me da la precisión necesaria pero ahora me habláis de usar el RTCC. ¿Acaso no es el mismo oscilador?

No, el WDT posee un reloj interno que varia mucho, puede estar calibrado pero tambien varia mucho con la temperatura y el voltaje, y tambien varia con el PIC seleccionado ya que algunos traen otras tecnologias. Por ejemplo, el PIC18F45K20 la frecuencia es de 31.25Khz y establece una variacion de -15% a +15%.

Si, el cristal tambien tiene variaciones con la temperatura. Pero tiene mucho menos error que el WDT, incluso para los mas baratitos de 32.768Hz
https://datasheet.octopart.com/AB26T-32.768KHZ-Abracon-datasheet-37142359.pdf

Por ejemplo ese posee una tolerancia de 20ppm para los 32768Hz. es decir que en un dia seria de +-0.864s y al cabo de 3 meses suponiendo que son de 30 dias, seria +-78s aproximadamente. Tambien podes ver el grafico de como varia con la temeperatura.

Por supuesto podes tener mejores osciladores. Solo hay que ver si vale la pena usarlos.


PD: Generalmente usar PICs de bajo voltaje implica menores corrientes, por lo que deberias tener en cuenta estas opciones, y tambien buscar RTC que puedan ser alimentados por estos voltajes. Por ejemplo el RTC que indicas puede funcionar con 1.8V, y hay PICs que tambien pueden funcionar a 1.8V, por ejemplo corriendo a 16Mhz interno, el PIC18 que mencione antes, consume 3mA maximo en 1.8V y 4.4mA en 3V.

Obviamente esto va a depender luego de que vayas a manejar con tus salidas y entradas,etc ya que vas a tener que protegerlo de voltajes mas altos y tambien, tal ves necesites un transistor/mosfet para activar tus salidas ya que seguramente necesiten mayor tension, todo esto depende de que tengas anexado a tu circuito.

PD: No quiero olvidarme de nombrar el aging de los cristales que aumenta esos errores, lo tenes en el datasheet que pase.
« Última modificación: 10 de Julio de 2020, 11:26:36 por KILLERJC »

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 172
Re:Retardos muy largos y precisión del reloj interno.
« Respuesta #14 en: 15 de Julio de 2020, 07:41:49 »
¡Muchas gracias KILLERJC por tu fantástica explicación!

Ya me ha quedado claro que debo usar el PCF8563 programado para que me de la alarma cada minuto. Ya jugaré con el hardware para minimizar el consumo pero más o menos lo veo claro y factible.

Un saludo!