Pregunta:
Al configurar temporizadores de hardware como interrupciones, ¿debería preferir un valor de preescalador más bajo o un CTC más bajo?
Roberto Santalla
2014-09-02 02:42:00 UTC
view on stackexchange narkive permalink

Actualmente estoy jugando con los temporizadores de hardware de Arduino y me vino una pregunta a la mente. Déjame explicarlo un poco.

Supongamos que quiero que una determinada función se ejecute cada 1024 tics de reloj. AFAIK, podría lograr esto de varias maneras, jugando con el valor de preescalador para Timer2 y su CTC:

  1. Configurando el preescalador en 1 y el CTC en 1024
  2. Configuración el preescaler a 8 y el CTC a 128
  3. ...
  4. Configurando el preescaler a 1024 y el CTC a 1.

Todos estos formas de lograr lo que quiero, pero, ¿cuál es más eficiente? ¿O no importa en absoluto?

Gracias de antemano por compartir su conocimiento: P

Los valores de preescalador más grandes darán como resultado una disminución muy leve en el consumo de energía, ya que cualquier circuito que esté conectado a la salida del preescalador cambiará a una frecuencia más baja, y el consumo de energía es proporcional a c v ^ 2 f.
CTC no es un número, es un modo de funcionamiento del contador (modo 2). El período del temporizador se establece configurando `OCR2A`, siendo el período real` (OCR2A + 1) × ciclos de CPU del preescalador`. Por lo tanto, si configura el preescalador en 8, debe configurar `OCR2A = 127`.
Dos respuestas:
Janakiram
2014-09-02 09:11:50 UTC
view on stackexchange narkive permalink

Si el recuento de 'tictac del reloj' (aquí 1024), el ancho del temporizador y el reloj de la MCU utilizados son constantes (un valor fijo), no optaría por la última opción, es decir, prescalar 1024 y CTC de 1. Aquí están mis razones (especialmente para Arduino)

1) Cuando CTC está cerca de cero (como 1-> 10), a veces el temporizador se comporta como si el recuento fuera cero y genera una onda cuadrada (con una relación de trabajo del 50%) con la mitad de la frecuencia demandada . Así que haz que CTC sea razonablemente grande. Pero, nuevamente, seleccionar una frecuencia de reloj alta (pre-escalar 1) también puede mostrar una precisión reducida. Una opción intermedia creo que es mejor.

2) Cuando el recuento de CTC cambia dinámicamente en un proceso, el pre-escalar del temporizador debe seleccionarse de modo que el recuento de CTC siempre sea menor o igual al ancho del temporizador en todo el proceso.

es decir el 'contador de tics del temporizador' máximo debe ser acomodado cómodamente por el temporizador con su ancho dado. Incluso aquí vuelve a ocurrir el mismo dilema, entonces la selección basada en el punto 1 es mejor.

Si esto no es suficiente, entonces la única forma en que creo es implementar cada caso físicamente y verificar qué combinación te da los mejores resultados. Creo que los resultados prácticos son más fiables (¡es posible que obtenga una combinación eficiente específica de la tabla!)

No veo ninguna causa raíz razonable para validar su comentario sobre los valores bajos de CTC que pueden reducir la precisión. En particular, el "a veces el temporizador se comporta ..." es obviamente incorrecto: ¿por qué los temporizadores en la arquitectura AVR no tendrían un comportamiento repetible en este caso?
Dije que los preescalares bajos (no los valores de CTC) pueden reducir la precisión. Los valores bajos de CTC pueden generar salidas no deseadas de los temporizadores.
'A veces' aquí significa para 'algunas placas' de Arduino. Usé esta palabra porque la pregunta no se hizo para un tablero específico. Muchas veces he trabajado con temporizadores 'Arduino Due', con una frecuencia de temporizador de 10,5 MHz y cada vez que le daba un recuento de CTC inferior a 15 (o cercano) los temporizadores me daban una onda cuadrada, por lo que la razón obvia es que el recuento se toma como cero. Esta no es una observación matemática sino práctica. Como dije, solo he trabajado con 'Due' para mi propósito, que es un ARM (no AVR con frecuencias de reloj menores utilizadas en Arduino) y, por lo tanto, creo que usar 'a veces' es válido.
Nick Gammon
2016-01-14 16:14:34 UTC
view on stackexchange narkive permalink

Existe una compensación entre resolución y frecuencias alcanzables. Mencionas Timer 2, pero en el Atmega328P Timer 2 es un temporizador de 8 bits, por lo que no podrías configurar el CTC en 1024.

Supongamos que estamos hablando de un temporizador de 16 bits, como el temporizador 1 en el Atmega328P. Con un preescalador de uno, puede cronometrar (asumiendo un reloj de 16 MHz) de 1 a 65536 "tics", es decir, 62,5 ns hasta 4096 µs.

Este sería el más preciso medición porque está utilizando un tic de reloj (procesador) por tic de temporizador (un preescalador de uno).

Sin embargo, si planea cronometrar más de 4.096 ms, entonces necesita aumentar el preescaler . El siguiente preescalador en el temporizador 1 es 8, por lo que ahora puede cronometrar un intervalo 8 veces más largo (32768 µs), sin embargo, su precisión (precisión) ahora se ha reducido en un factor de 8. La granularidad del temporizador ha aumentado de 62,5 ns a 62,5 * 8 ns, que es 500 ns.

Si necesita un tiempo superior a 32,768 ms, el preescaler tiene que ser más grande de nuevo, siendo el siguiente 64. Así que ahora puede cronometrar hasta 262144 µs, pero con una granularidad de 62,5 * 64, que es 4000 ns (4 µs).

Mi sugerencia sería utilizar el preescalador más bajo que pueda, pero aún así obtenga el intervalo que desee. Entonces, obviamente, no puede usar un preescalador de uno a diez ms.


Tengo una discusión sobre temporizadores en http://www.gammon.com.au/timers.

En esa página hay un gráfico que ayuda a visualizar los efectos de diferentes prescalers:

Timers and prescalers

La parte superior (cuenta de uno) le brinda efectivamente la granularidad de cada preescalador. Por ejemplo, un preescalador de 256 tiene una granularidad de 16.000 ns (16 µs). Ciertas frecuencias (potencias de 2) se prestan a combinaciones (p. Ej., Preescalador de 1 con una cuenta de 256, o preescalador de 256 con una cuenta de 1).

Sin embargo, para las frecuencias que no tienen esa propiedad, el preescalador más pequeño (si se puede usar) dará una granularidad más fina.

El uso de un preescalador superior no pierde precisión en absoluto. Obtiene una mayor granularidad, pero si apunta a un recuento de ciclos que es una potencia de dos (como en la pregunta), la granularidad no es un problema.
Pero si no es así, el preescalador inferior le permite acercarse al objetivo. Digamos que quiere cronometrar 30 ciclos de reloj. Un preescalador de 1 le permite ingresar el número 30 directamente. Un pre-escalador de 8 significa que debe usar 30/8 (3.75) que no puede ingresar directamente en el registro, perdiendo así precisión.
La pregunta se formuló con 1024 conteos, por lo que mis comentarios no se aplican a eso, pero estaba tratando de dar una respuesta más general, en caso de que el hecho de que 1024 sea un caso bastante especial no fuera obvio.


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...