Diseñar un generador de pulso simple

0

Leí en muchos tutoriales que el reloj interno de un microcontrolador es menos preciso (% 10) que el reloj de cristal externo. Cuando genero pulsos de frecuencia variable utilizando un microcontrolador, ¿significa que estoy demandando el reloj interno y que los pulsos no son lo suficientemente precisos? Algunos tutoriales juegan con los registros y obtienen cualquier frecuencia de pulsos.

Mi pregunta es, por ejemplo, si uso AVR como en el tablero Arduino Uno y juego con los registros, ¿significa que usaré el reloj interno? ¿Hay alguna manera de obtener pulsos más precisos?

    
pregunta user16307

3 respuestas

1

Por "reloj interno", se refiere al oscilador RC interno que viene con el dispositivo de fábrica. Está dentro del chip y no es muy preciso en el rango de temperatura, lo que significa que en realidad no será la frecuencia que asume que es, y de hecho puede tener una gran "fluctuación", lo que significa que el reloj se genera desde el oscilador interno no tendrá una temporización muy "precisa", un pulso de reloj podría ser + -10- > 15% diferente al anterior y al siguiente. Esto es malo para la temporización ciclo por ciclo.

El uso de cristales externos le permite tener velocidades de reloj más rápidas que las posibles con la fuente interna disponible en su ejemplo dado (Atmel ATMEGA328P que está en el Arduino Uno), y estas proporcionan (generalmente, la calidad y el material son relevantes aquí ) muy buena precisión y ciclo por ciclo precisión de la señal del reloj.

El reloj del sistema se genera a partir de estas diferentes fuentes posibles, por lo que si utiliza una fuente de mala calidad / precisión y espera una alta velocidad y sincronización, tendrá problemas. Use un buen cristal y podrá sincronizar muy bien las cosas, como una señal digital muy precisa / precisa a una frecuencia establecida (dadas las limitaciones de los temporizadores que se mencionan a continuación).

Los registros que menciona son quizás los que le permiten cambiar las opciones de CLKDIV, lo que le permite dividir la frecuencia de la fuente del reloj de entrada y hacer que el sistema sea más lento, ya que consume menos energía y puede brindar mejores características de temporización. La salida de la señal del reloj del sistema a veces se puede seleccionar para uno de los pines del microcontrolador, para sincronizar dispositivos externos con un buen reloj digital limpio, por ejemplo, un IC de cámara o una entrada de reloj de referencia para dispositivos síncronos.

Los temporizadores que se encuentran dentro de los microcontroladores utilizan la fuente principal del reloj y, a menudo, tienen divisores que puede configurar por separado. A partir de la velocidad del temporizador resultante, puede configurar los registros de "comparación de salida", lo que le permite elegir (según la resolución) un cierto punto en el que se reiniciará el temporizador. Es posible que tenga que actuar esencialmente como un generador de pulso digital. Control razonablemente bueno de la frecuencia hasta cierto punto. Los temporizadores de 8 bits le permitirán elegir una salida en pasos de 1-255, y los temporizadores de 16 bits le permitirán establecer un tamaño de paso de 1- > 65536. El uso de un temporizador de 16 bits y una fuente de reloj de muy buena calidad produciría la "mejor" salida.

El Atmega328P en el Arduino Uno tiene múltiples temporizadores, por lo que podría hacer que los canales de comparación de salida produzcan más de una señal de pulso de frecuencia personalizada / ajustable.

    
respondido por el KyranF
0

Si usa un dispositivo que puede usar un cristal u oscilador externo y luego usa un cristal u oscilador externo, entonces será tan preciso como ese cristal u oscilador externo. No hay nada que le impida conectarse, por ejemplo. un oscilador de precisión de rubidio en lugar de algo más primitivo.

    
respondido por el Ignacio Vazquez-Abrams
0

El "reloj interno" es el oscilador incorporado que se suministra con muchas MCU, y su frecuencia puede no ser lo suficientemente precisa o estable para producir un generador de pulsos confiable.

Para hacer eso, se puede usar una fuente de temporización externa (cristal, oscilador de cristal, estándar de frecuencia atómica, etc.) con la precisión y estabilidad requeridas, y el período de pulso deseado y la frecuencia / frecuencia de repetición obtenidas a través de la manipulación de la MCU a través del software.

Por ejemplo, suponga que desea utilizar una MCU que puede admitir un reloj externo de 10 MHz, ejecute ciclos de ejecución de instrucciones de un solo reloj, que está trabajando en el ensamblador y que desea generar un pulso de 1 microsegundo de ancho con una tasa de repetición de 100 kHz.

Para hacer eso, cargaría un registro con un valor numérico correspondiente al ancho de pulso de salida que deseaba, otro con el retraso requerido entre el borde descendente del pulso y el borde anterior del siguiente pulso, y luego los contaría a los dos, secuencialmente, usando la fuente del reloj externo, hasta que ambos estuvieran vacíos.

Eso te daría un ciclo de la salida deseada, y cuando ambos contadores se redujeran a cero, los cargarías de nuevo y comenzarías de nuevo.

Una advertencia aquí es que las instrucciones de carga, decremento, comparación, salto e I / O (de hecho, todas de las instrucciones) toman tiempo para ejecutarse, por lo que estos tiempos deben tenerse en cuenta. para cuando se cargan los contadores con el ancho de pulso y los valores de velocidad de repetición para que los pulsos salgan bien.

También existe la posibilidad de que pueda utilizar los temporizadores de hardware internos de la MCU para realizar el trabajo; YMMV.

    
respondido por el EM Fields

Lea otras preguntas en las etiquetas