Circuito de conteo de período o frecuencia o IC, sin usar un microcontrolador

3

El sistema que estoy desarrollando incluye dos transductores de presión que tienen tres salidas de frecuencia: referencia, presión y temperatura. Eso es seis frecuencias que necesito medir. La frecuencia de referencia es de aproximadamente 7.2 MHz, mientras que las dos frecuencias de señal están en el rango de 10 a 100 kHz.

Tengo un dispositivo Microchip dsPIC33E en mi placa principal, que sé que se puede configurar (usando los módulos periféricos de captura de entrada) para hacer el trabajo. Sin embargo, leer los sensores de presión no es la función principal de la micro ni la más crítica de tiempo, por lo que me resisto a cargarlo con este trabajo también. Por la misma razón, no quiero usar un dispositivo fuera del chip con un , ya que la separación entre las capas 1, 2 y 3 no está limpia y la sobrecarga del protocolo es alta en comparación con + o una .

¿Hay alguna solución electrónica relativamente simple para el problema?

  • Hay varios dispositivos IC disponibles que tienen salidas de controlador LCD, pero no he podido encontrar nada (que aún esté en producción) con una interfaz SPI.
  • Preferiría no usar un segundo microcontrolador, pero podría considerarlo si realmente no hay una alternativa práctica.
  • Una solución analógica podría ser aceptable, siempre que sea lo suficientemente precisa.
  • Las soluciones FPGA o CPLD pueden tener potencial.

Más información

Los dispositivos son Transductores de presión de salida de frecuencia de Quartzdyne , que se implementarán en un entorno donde la presión y La temperatura puede variar significativamente con el tiempo. Los cambios en la presión o en la temperatura pueden causar variaciones en la señal en las entradas de presión y temperatura. La señal de referencia se proporciona como un control, ya que se ve afectada igualmente por las variaciones de presión y temperatura. En consecuencia, para una mejor precisión, las tres frecuencias deben ser medidas. El fabricante del dispositivo proporciona funciones matemáticas para calcular la presión y la temperatura a partir de las tres mediciones de frecuencia.

Resolución: es deseable un error de frecuencia de +/- 0.01 Hz de la señal de 7.2 MHz (o mejor) para lograr la mejor precisión del sensor.

Ancho de banda: Las frecuencias de presión y temperatura deben actualizarse a 10 Hz. Si utilizo una solución de conteo de períodos en un microcontrolador, puede requerirse un tiempo de puerta de 1 segundo (o más). Pero esto podría lograrse acumulando conteos consecutivos en períodos más cortos en un búfer circular para crear un tiempo de puerta 'virtual' más largo.

    
pregunta Mike of SST

2 respuestas

2

Como entiendo, por su pregunta, su duda en utilizar el PIC para realizar la medición de la frecuencia es que no desea que la MCU tenga que atender interrupciones, debido a otras tareas más importantes en el tiempo. Me gustaría sugerir que esta es una preocupación fuera de lugar.

Utilizando el oscilador de referencia como un reloj externo (el bit TCS en el registro de control) para un contador / temporizador de 32 bits, puede contar el número de ciclos del oscilador de referencia. Al mismo tiempo, con los otros temporizadores / contadores, nuevamente utilizando el oscilador como un reloj externo, cuenta los ciclos para medir las frecuencias, ya que este 16 bits funcionará bien.

Configurar los contadores y hacer que funcionen no le costará nada en términos de ciclos de MCU. Usando el recuento fijo de \ $ N_s \ $ de acuerdo con la sección 3.2 en el manual , configura una interrupción el 16 comparación de comparación de bits, o desbordamiento si desea \ $ N_s = 65536 \ $. Probablemente cambiaría el tiempo de la puerta dinámicamente si desea un tiempo de actualización de 10Hz, o si almacena una lista de los conteos del contador de 32 bits con \ $ N_s \ $ de tal manera que la comparación coincida más de 10 veces por segundo, a medida que sugerir, para un "tiempo de puerta virtual" más largo.

La interrupción le costará un poco, pero solo para leer el recuento de referencia del oscilador de referencia, por lo que es esencialmente una lectura de registro, que almacena. Puede hacer la división en la fórmula siempre que sea conveniente, por ejemplo, un bucle principal. Si tiene más tareas críticas de tiempo, asegúrese de establecer las prioridades de interrupción en consecuencia.

Básicamente, la única carga fija aquí es la interrupción alrededor de 20 veces por segundo (para las dos señales), y no estoy seguro de cuánto mejor puede hacer. La lectura de un ADC, si tuviera que convertir de alguna manera la frecuencia en voltaje, eliminaría la interrupción, pero no creo que pueda obtener suficiente precisión en la relación de las frecuencias. Considere, por ejemplo, que si hay un divisor de voltaje que condiciona sus entradas de ADC, las resistencias de 0.1% ya son una parte especial, e incluso eso puede no ser lo suficientemente preciso aquí.

Por lo tanto, sugeriría seriamente al menos intentar utilizar el PIC directamente, a menos que tenga mucho tareas críticas de tiempo, esperaría que esta solución sencilla funcionara.

    
respondido por el Timo
2

La respuesta marcada como trabajos correctos, con algunos ajustes como sigue.

  • Asigne un módulo de temporizador / contador a cada una de las frecuencias de referencia. Solo un contador de 16 bits por frecuencia de referencia es suficiente.
  • Asigne un módulo de captura de entrada (IC) a cada una de las frecuencias de señal, configurado para usar el contador de frecuencia de referencia como la base de tiempo.
  • Asigne un módulo DMA a cada uno de los módulos IC. Cada búfer DMA es una matriz de 32 palabras, con el módulo configurado para interrumpirse después de 16 palabras en el modo flip-flop.
  • Inicie el módulo IC en modo de captura simple con una escala previa de 16.

Los módulos IC ahora capturan el valor en el contador de frecuencia de referencia en cada 16 ° flanco ascendente de la señal. El DMA transfiere el recuento de referencia al búfer con una interrupción generada en cada 16 ° evento de IC.

El código de usuario en el ISR DMA se llama a una frecuencia 256 veces más baja que la frecuencia de la señal. Todo lo que tiene que hacer es acumular los conteos en el búfer DMA e incrementar el conteo de la señal en 256 para obtener los conteos para las frecuencias de referencia y de señal. (El conteo de frecuencia de referencia se puede transferir entre los eventos de IC, lo que se debe tener en cuenta: no es suficiente simplemente restar el conteo más antiguo del último. La contabilidad se realiza tomando la diferencia entre conteos consecutivos en el búfer DMA, según < a href="https://stackoverflow.com/a/3097602/3581917"> esta respuesta en SO, con el último conteo guardado en una variable static para retener el valor entre las llamadas al ISR.)

Finalmente, el bucle de fondo verifica periódicamente cuando los ISR de DMA han actualizado los conteos de frecuencia y los agrega a un acumulador de tiempo de compuerta rodante. Esto se ha implementado para que pueda proporcionar actualizaciones a 10 Hz (según sea necesario), pero mantiene los conteos durante más de 1 segundo para lograr el tiempo de puerta necesario para la precisión requerida.

    
respondido por el Mike of SST

Lea otras preguntas en las etiquetas