¿Buenas aproximaciones para implementar más de una función de tiempo crítico usando un microcontrolador?

8

¿Cuál es la filosofía o el enfoque adoptado para implementar funciones de tiempo crítico en microcontroladores, si hay alguno?

Estoy trabajando en un proyecto que implica la salida de una forma de onda precisa de onda cuadrada de frecuencia variable. He hecho esto usando un temporizador y una función de interrupción. Sin embargo, incluso para implementar esto correctamente, tuve que calibrar el desplazamiento para la cantidad de ciclos de reloj tomados durante la rutina de servicio de interrupción. Me imagino que esta precisión se vería perturbada al tener otra forma de onda de este tipo corriendo al lado (digamos que la frecuencia necesitaba cambiarse exactamente al mismo tiempo). Tener un microcontrolador cada uno, para cada momento, la función crítica parece un desperdicio.

Tome otro ejemplo, de implementar una función de reloj (como en hh: mm: ss). No puedo imaginar que cada microcontrolador / computadora de alto nivel tenga un chip de reloj en tiempo real dedicado únicamente para hacer un seguimiento de la hora. Sin embargo, me resulta difícil imaginar que se mida con precisión utilizando el procesador central, que está ocupado atendiendo una gran cantidad de funciones que se producen a intervalos asincrónicos mientras tanto. Me imagino que el conteo de tiempo tendría errores de compensación, que cambian dependiendo de las funciones que se ejecutan.

¿Existe un proceso o enfoque de diseño para contener o dar tolerancia a la precisión que se puede lograr? ¿O alguien tiene alguna sugerencia o sugerencia sobre dónde podría encontrar más información al respecto?

medianocheAzul
fuente
Las cosas que requieren un RTC preciso a menudo tienen un chip dedicado, o una subfunción con su propio poder y cristal, para mantener un registro del tiempo cuando el dispositivo está apagado. El tiempo es una gran molestia.
pjc50
Deje de usar una arquitectura tan horrible (o comience a usarla correctamente): los temporizadores de hardware no deberían depender del tiempo dedicado al servicio del ISR, siempre que las recargas se realicen 'a tiempo', no debería importar.
Spehro Pefhany
¿Qué microcontrolador? Permitiría respuestas de mejor calidad.
StainlessSteelRat
@SpehroPefhany Debo decir que soy bastante inexperto en esto. El problema que tengo con la onda cuadrada es que me gustaría que la frecuencia (pueda) cambiar en cada transición de salida (que para 2 ondas cuadradas diferentes sería a intervalos asíncronos, y podría incluso coincidir). Una onda cuadrada era una parte más pequeña de una pregunta más grande que tenía en mente. Dentro de la generación de formas de onda, ¿cómo implementaría más de 1 forma de onda analógica arbitraria? ¿Sería el sacrificio hacer una "tasa de muestreo" común?
midnightBlue
@Sta StainlessSteelRat No especifiqué deliberadamente un microcontrolador específico ya que sentí que la pregunta era bastante amplia. Para mí, parece que podría aplicarse a la arquitectura del procesador en computadoras grandes a través de microcontroladores. En parte, quiero saber si hay recursos disponibles para aprender a hacer buenos diseños / limitar el error al implementar más de una función que es sensible al tiempo.
midnightBlue

Respuestas:

10

Para generar ondas cuadradas precisas, use el hardware. La mayoría de los microcontroladores tienen generadores PWM integrados que pueden hacer esto. Establece el período y el tiempo en ciclos de reloj, y el hardware hace el resto. Para cambiarlo a una nueva frecuencia, escriba el nuevo período en el registro del período y la mitad del período en el registro del ciclo de trabajo.

En cuanto a la pérdida de tiempo del reloj en tiempo real debido a otra carga del procesador, no funciona de esa manera a menos que esté mal escrito. En general, el hardware se usaría para crear una interrupción periódica que es un múltiplo de segundos, y el firmware se divide más a partir de ahí. Esto funciona independientemente de qué tan ocupado esté el procesador, ya que la interrupción se ejecuta siempre que sea necesario. Mientras la rutina de interrupción tome una pequeña fracción de los ciclos generales, la mayor parte del procesador todavía se aplica a la tarea en primer plano.

También hay formas de mantener el tiempo mediante encuestas a intervalos algo desconocidos. Tiene el hardware para llevar un recuento, y cada vez que llega a actualizar el reloj, lo actualiza en función del número total de tics transcurridos. Mientras esta rutina se ejecute con la frecuencia suficiente para que cualquier contador que se use no se ajuste entre ejecuciones, no se perderá tiempo.

Olin Lathrop
fuente
¡Lo siento! Debería haber sido más amplio con mi pregunta. Una onda cuadrada era solo un ejemplo particular de una aplicación de tiempo crítico que tenía en mente. Con el método del generador PWM que mencionó, ¿podría (si fuera necesario) actualizar la frecuencia en cada transición de onda cuadrada? ¿Qué pasaría si tuviera que hacer esto para dos ondas cuadradas asíncronas? ¿Qué tal diez? Me pregunto si hay enfoques generales de diseño para tales cosas. Los métodos que menciona sobre la interrupción periódica y el sondeo para actualizar el reloj ciertamente arrojan algo de luz.
midnightBlue
1
@mid: la mayoría de los micros pueden interrumpir al comienzo de un período PWM. Algunos tienen registros con doble búfer para que pueda actualizar los parámetros durante un período y luego hacer que entren en vigencia al comienzo del siguiente período. Algunos micros pueden alimentar el PWM a través de DMA. Utilicé esto una vez para que el hardware se vacilara automáticamente.
Olin Lathrop
3

La palabra clave aquí es "soporte de hardware". Para cualquier cosa grave, necesitará hardware de soporte en el µC. El periférico integrado más común es el circuito del temporizador que funciona de manera relativamente precisa y sin interferencia de otras operaciones de la CPU.

Partiendo de eso, puede tener muchas funciones ejecutándose con temporización a medio plazo tan precisa como la fuente de reloj de su controlador.

Pero: como ya habrás experimentado, además de la precisión a medio o largo plazo, siempre hay fluctuación de tiempo involucradas en el manejo del software de eventos de hardware (incluidas cosas como el desbordamiento del temporizador). Esto es causado por diferentes estados posibles de ejecución en el momento en que ocurre un evento que resulta en demoras variables hasta que la respuesta real al evento pueda ocurrir.

Por lo tanto, la conclusión es: para cualquier cosa con requisitos de jitter de alta velocidad o casi cero, el soporte de hardware es esencial. Muchos periféricos de hardware están incluidos en la mayoría de los µC, como los UART & c, y cuanto más potente y costoso es el µC, más hardware de soporte suele estar incorporado. Si su µC no proporciona el hardware que necesitaría, tendrá que considerar un hardware externo dedicado para la tarea.

JimmyB
fuente
Comprender la inquietud es clave: puede tener varios temporizadores de hardware, y todos realizarán un seguimiento de forma independiente, pero si todos disparan una interrupción al mismo tiempo, no todos pueden recibir servicio a la vez.
pjc50
2

Haga todo lo que pueda con el hardware, especialmente para funciones que requieren mucho tiempo. Todos los microcontroladores tienen temporizadores / contadores creados específicamente para contar y cronometrar eventos.

Aparte de eso, esta es realmente una pregunta muy amplia. Entonces no hay una buena respuesta.

La única respuesta verdadera es la experiencia. Pruébelo, perfílelo, estreselo, arréglelo. Debe identificar áreas de código con alto uso. El 20% del software que se ejecuta el 90% del tiempo, significa que cada instrucción eliminada mejora el rendimiento.

El buen diseño siempre ha equilibrado el hardware, el software y la memoria. Esto se aplica a todos los microprocesadores, pero especialmente a los microcontroladores. Maximiza uno o usa uno de manera ineficiente y tendrás un producto pobre. A medida que aumentan las densidades de silicio, se incluyen cada vez más funciones en el hardware de los microcontroladores. Pero más características significan más expectativas. Doble memoria integrada y agregará alguna característica que la usa.

Todos los ISR tienen gastos generales, que dependen de los registros utilizados por el ISR. Si la latencia para guardar el estado de la máquina es significativa en comparación con el mantenimiento del ISR para funciones muy importantes, su diseño puede no ser escalable. Por lo tanto, el consenso general de respuestas para usar hardware.

El uso de interrupciones de software puede disminuir la hinchazón del estado de la máquina ISR.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    call Inc_Seconds()

Todos los registros para Inc_Seconds () deben ser empujados, cuando solo se usan una vez cada 150 ciclos.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    _Software_Interrupt
...
// Software_Interrupt ISR
    call Inc_Seconds()

Ahora el golpe de latencia solo ocurre una vez cada 150 ciclos.

Si implementa un reloj en tiempo real en hh: mm: ss, ¿importa si está apagado a 50 ms? Ninguna persona detectaría el error. Esto ciertamente no es una preocupación operativa en tiempo real.

En cuanto a los eventos que deben ocurrir al mismo tiempo. ¿Deben ellos? Si deben hacerlo, el diseño del hardware debe cuidarlo. De lo contrario, debe producirse un compromiso de software. Si no puede establecer dos bits a la vez, configure uno. La siguiente instrucción establece la otra. Precisión de un ciclo de reloj en procesadores RISC. Yo diría que eso fue lo suficientemente bueno.

Rata de acero inoxidable
fuente
0

Para la forma de onda cuadrada, debe usar un periférico PWM que esté PLL con su XTAL usando algún tipo de contador para saber cuándo hacer un ciclo (para configurar la frecuencia baja). Cada hoja de datos le dirá cómo hacerlo :)

Para mantener el tiempo , sí, necesitará un RTC para hacerlo con precisión a menos que vaya al ensamblador y los códigos de operación del autor para que sepa a mano el momento exacto de ejecución de cada instrucción en cualquier ruta de ejecución. Probablemente también arrojará nueva luz sobre la probada y verdadera declaración 'goto se considera dañino'.

AlexanderBrevig
fuente
3
Sus comentarios sobre el software RTC solo se aplicarían a las soluciones implementadas de forma más descuidada. Una forma sensata y confiable de hacer esto es usar un temporizador de hardware para generar una interrupción una vez cada 1 ms (o 10 ms). En la rutina de servicio, tenga una variable de contador estático que cuente y luego el número de interrupciones hasta 1000 (o 100). Cuando se alcanza el conteo completo, restablezca el contador y luego incremente el contador de segundos. Cada 60 segundos restablecerá la variable del contador de segundos a cero e incrementará la variable del contador de minutos. Extienda esto hasta meses y años si es necesario.
Michael Karas