1) En primer lugar, GPRS es un servicio de mejor esfuerzo, por lo que su latencia es variable. Puedes intentar todo lo que quieras para lograr una precisión de tiempo, pero si el ancho de banda no está disponible, todo sería en vano.
2) Hay dos patrones preferidos para aplicaciones como la tuya:
- En el patrón de ahorro de energía , el dispositivo se queda dormido entre el muestreo / envío. Se utiliza un temporizador externo de nano-poder o un watchdog interno para generar un evento de activación. Tenga en cuenta que el período de activación puede ser más pequeño que el período de envío requerido, lo que le brinda a su código la oportunidad de preparar los datos con anticipación y enviarlos inmediatamente después de que se active un cierto temporizador.
- En precisión , el bucle principal lee constantemente el ADC y usa el exceso de muestreo / promedio móvil para contrarrestar las fluctuaciones del ADC. Esto le deja con el valor actualizado con frecuencia que puede utilizar para sus cálculos en cada muestra o en algunos intervalos. La interrupción de un temporizador externo o interno se utiliza para activar el procedimiento de envío, lo que hace que el período de envío sea independiente del código de cálculo. Esto requiere un soporte de administración de tareas algo complejo porque no es una buena idea hacer un procesamiento largo en la función de interrupción en sí. Una variante más simple de esto sería afirmar el indicador de "tiempo para enviar" en la interrupción y salpicar su código de larga duración con llamadas al procedimiento "verificar el indicador y enviar cuando esté listo".
3) En ambos patrones arriba se usa la interrupción del temporizador. El temporizador externo cuidadosamente elegido le puede dar una gran precisión fuera de la caja, pero complica los esquemas. Dada la naturaleza incierta de GPRS, la precisión de los temporizadores MCU internos debería ser suficiente. Las hojas de datos de MCU generalmente incluyen una descripción detallada del procedimiento de calibración para RTC, que es ideal para este propósito.
4) Ningún temporizador es preciso . Incluso un muy buen temporizador externo con base de cristal tendrá alguna desviación. Esta es exactamente la razón por la que sugerí los temporizadores MCU internos en primer lugar, ya que son lo suficientemente precisos durante un cierto período de tiempo . A la larga, puede utilizar su conexión GPRS para la sincronización del reloj. El más simple sería el servicio NITZ cuando esté disponible en el proveedor actual. Sin embargo, si tiene conexión a Internet, puede intentar usar NTP también.
5) Finalmente, asegúrese de que esto no sea un problema XY. Pregúntese lo siguiente: ¿desea enviar datos a tiempo fijo solo porque necesita saber cuándo se obtuvieron? En caso afirmativo, la marca de tiempo de preparación simple en los datos permite que se envíen a intervalos irregulares, eliminando la dependencia de la latencia GPRS y el tiempo de cálculo. Aún necesita un temporizador preciso para firmar sus datos, pero, de lo contrario, su código puede hacer cálculos y enviar resultados sin restricciones de tiempo.