Cómo calcular el tiempo de un solo tic en el microcontrolador

He estado en el sistema Embedded durante 8 meses. He trabajado la parte de la aplicación más en comparación con el nivel bajo. Tengo preguntas básicas sobre los ticks de los sistemas,

  1. Cómo calcular el tic del sistema del temporizador, si estoy iniciando el temporizador de hardware de un controlador para generar cualquier retraso. Si tengo el temporizador de 16 bits, por ejemplo, y configuré el reloj del sistema para 8 MHz. Según mi conocimiento, el único tic será T = 1/f. Luego, un solo tic tomará 0,125 microsegundos. ¿Es esto correcto? o cualquier otra dependencia para calcularlo. ¿Si este cálculo variará de controlador a controlador?
  2. ¿Hay alguna forma de configurar el reloj (por ejemplo, 1 MHz) solo para el temporizador o cualquier otro periférico sin cambiar el reloj del sistema (por ejemplo, 8 MHz)?
  3. Si el controlador pasa al modo de bajo consumo (normalmente un cambio de modo de consumo). ¿La resolución del temporizador también cambiará? si necesito cambiar la configuración del temporizador para cada modo de energía.

Respuestas (3)

Para responder a tu primera pregunta.

Básicamente, es lo mismo con todos los microcontroladores y su cálculo fue correcto. En su ejemplo, con un temporizador de 16 bits y,

F Reloj del sistema = F Temporizador = 8 METRO H z

Como dijiste, tenemos una marca en cada,

T Temporizador = 1 F Reloj del sistema = 1 F Temporizador = 1 8 METRO H z = 0.125 m s

Con un temporizador de 16 bits significa,

t i C k s máximo = ( 2 dieciséis 1 ) = 65535

garrapatas Entonces el temporizador se desbordará en cada,

t Desbordamiento = t i C k s máximo × T Temporizador = 65535 × 0.125 m s = 8.191875 metro s

Puede contar los desbordamientos para obtener un retraso específico. Ahora, si desea cambiar el valor de t overflow

  • Puede dividir el f SystemClock como lo mencionaron las otras respuestas, y ejecutar su temporizador con una frecuencia diferente del f SystemClock . De esta manera, tendrá más tiempo entre dos tics del temporizador y el desbordamiento de t será mayor.
  • O bien, puede establecer un valor máximo para el temporizador para que se desborde antes y el desbordamiento sea menor.

De esta manera se puede lograr una gran cantidad de valor de retardo.

@BenceKaulics Hay, entonces estoy usando un temporizador de 32 bits con PLL Clock = 80 Mhz como fuente => Tendré un tic cada 0.0125 us. Y el desbordamiento será 4294967295 * 0.0125μs = 53.6 seg lo cual es muy grande y me parece ilógico. Qué opinas ? gracias
@Frankenstein Si realmente es un temporizador de 32 bits con 80 MHz, entonces es correcto. Cuenta más de 4 mil millones, lo que lleva tiempo.
@BenceKaulics Gracias. Sin embargo, mientras mido el tiempo, obtengo 280 tics, lo que nos dará 3.5 segundos. Sin embargo, al usar una utilidad GHS: 'temporizador de destino', da 20 uSeconds (esto significa que cada tic es 0.0714 uS => 1/x = 14 Mhz: raro :)). ¡Entonces mis cálculos no son correctos, pero estoy tratando de encontrar por qué? También estoy usando 1 como prescaler por lo que es 80Mhz no menos. Incluso si estoy usando 2,4,8 prescaler, tendría 40Mhz, 20Mhz... Entonces, ¿qué piensas? muchas gracias a ti
@Frankenstein Este problema vale la pena publicar una nueva pregunta e incluir un enlace a esta pregunta. Está empezando a ser demasiado complicado discutirlo en los comentarios y también algún otro usuario puede contribuir en caso de una nueva pregunta.
@BenceKaulics He visto bien tu comentario, ¡pero tenía prisa! Por favor, vea mi publicación aquí: electronics.stackexchange.com/questions/279013/… gracias
@Frankenstein Le echaré un vistazo. También agregue la hoja de datos del controlador, muchos estarán interesados ​​​​en la documentación del temporizador. Considere agregar el código también.
@BenceKaulics Me temo que no puedo. Estoy usando una MCU automotriz donde las muestras de código/hoja de datos no están disponibles en público. Sin embargo, incluiré una parte del código.

1. reloj de instrucciones/frecuencia de reloj del sistema

la frecuencia del reloj de instrucción es diferente en diferentes familias de microcontroladores. un microcontrolador PIC tiene un reloj de instrucciones de 1/4 de la frecuencia del reloj. y cada instrucción (en su mayoría) (excepto goto) toma 1 ciclo de reloj de instrucción, goto toma 2 ciclos.

en un atmel µC, el reloj de instrucciones es el mismo que la frecuencia del reloj.

2. otro reloj para un solo temporizador

en varios µC puede configurar un montón de divisores y configuraciones de desbordamiento, verifique la hoja de datos de su µC específico en casi todos los PIC, puede configurar divisores como 1/8, por lo que cada ciclo de reloj de 8 instrucciones el temporizador aumenta con uno. por lo que el temporizador funciona a 1 MHz si su reloj de instrucción es de 8 MHz (el oscilador funciona a 32 MHz)

o un divisor de 1/2 para que su temporizador funcione a 1 MHz si, el reloj del sistema a 2 MHz y el oscilador a 8 MHz

3. modo de bajo consumo

algunos µC tienen múltiples osciladores internos, por ejemplo: 8MHz, 4MHz y 32.786 kHz y si cambia entre esas frecuencias, puede reducir el consumo de energía. pero cambias el reloj de instrucciones y por lo tanto también el temporizador

Esto es bastante confuso porque ha utilizado comillas. ¿Podría editarlas y eliminarlas?

Eso podría depender del registro del preescalador. El propósito del preescalador es permitir que el temporizador se cronometre a la velocidad que desee. Para temporizadores más cortos (8 y 16 bits), a menudo habrá una compensación entre la resolución (la alta resolución requiere una frecuencia de reloj alta) y el rango (las frecuencias de reloj altas hacen que el temporizador se desborde más rápidamente).

Por ejemplo, no puede (sin algunos trucos) obtener una resolución de 1 us y un período máximo de 1 segundo utilizando un temporizador de 16 bits. Si desea una resolución de 1 us, está limitado a un período máximo de aproximadamente 65 ms. Si desea un período máximo de 1 segundo, está limitado a una resolución de aproximadamente 16 us. El prescaler le permite hacer malabares con la resolución y el período máximo para satisfacer sus necesidades.

Siga las hojas de datos del controlador que está utilizando. Ir a través del registro del temporizador. Algunos controladores tendrán un preescalador de valor fijo (no modificable por el programador) y en algunos controladores puede ser modificable

Creo que esto responderá a su primera y segunda pregunta.

El uso de diferentes temporizadores afectará la medición del tiempo transcurrido o será lo mismo usando cualquier temporizador. También podemos mejorar la precisión eligiendo un temporizador de n bits más alto y una frecuencia de reloj más alta en la fuente?. Gracias