Pulso de entrada

ANTECEDENTES

En este tema se supone que entiendes los principios de la salida digital. Si no, lee acerca de ellos aquí.

Un tipo muy común de señales digitales es uno en el que la información se encuentra en la duración entre los cambios en el nivel de la señal. Tal vez el caso más simple de imaginar es un sensor magnético u óptico de detección de un eje de giro: cada vez que el eje llega a un ángulo de rotación determinado, la salida del sensor cambia de BAJO a ALTO, y en un ángulo diferente que va a cambiar de nuevo a ALTO. La forma de onda resultante cuando el eje está en constante gira es un conjunto de pulsos. Cuanto más rápido es la rotación, son más estrechos y más juntos los pulsos. Mediante la medición de la duración entre el inicio de un pulso al comienzo del siguiente, podemos conocer la cantidad de tiempo que tomó el eje para completar exactamente una vuelta o, en otras palabras, si se mide la frecuencia de los impulsos, que puede conocer la velocidad de giro.

Otro caso común es señales PWM ( leer más sobre ellos en la sección acerca de la salida de PWM ) . Esas señales utilizan el ancho de un pulso para representar un valor dentro de un cierto rango. Por ejemplo, las señales PWM utilizados para servos son una serie de impulsos , cada uno oscila entre alrededor de 1-2 milisegundos. Un pulso de 1 milisegundo por lo general significa " brazo del servo debe moverse hasta el final a uno de los extremos ", un pulso de 2 milisegundos significa " todo el camino hasta el otro extremo " y un pulso de 1,5 milisegundos significa "centro". Si uno desea para decodificar una señal de este tipo, de manera que para recibir la entrada de un sistema que genera dichas señales servo, van a tener que medir el ancho de un pulso o la duración entre el inicio del pulso hasta el final de la misma.

La señal en la imagen de abajo es una señal PWM típica , que tiene un período ( la duración entre un flanco ascendente para el siguiente flanco ascendente ) y un ancho de pulso ( la duración entre un flanco ascendente y el siguiente flanco descendente ). A menudo es conveniente hablar de la frecuencia de la señal , que es simplemente la inversa del periodo, su significado físico es el número de pulsos por segundo .

pwm

La medición de la frecuencia y ancho de pulso de las señales digitales con MIOIO se realiza utilizando el módulo de entrada de impulsos (a veces conocido como " captura de entrada "). Este módulo tiene varios parámetros que afectan a su funcionamiento. Lo más fácil para conocer las posibilidades es entender un poco sobre el funcionamiento interno del módulo de entrada de pulsos. Cada módulo tiene un temporizador , que constantemente cuenta el tiempo a una cierta tasa de reloj. El temporizador se puede contar para grabar (o "captura" ) su valor actual cuando un pin de entrada cambia su estado de BAJO a ALTO ( " flanco ascendente ") , de ALTO a BAJO ( " flanco descendente " ) o en cualquiera de los bordes. Mediante la sustracción de dos capturas de temporizador correspondientes a dos bordes de interés, se puede conseguir la cantidad de tiempo transcurrido entre ellos. El temporizador tiene un límite en lo alto que puede contar. Cada vez que llegue a ese límite, se da la vuelta , es decir, empieza a contar desde 0 nuevamente. Es imposible saber con exactitud cuando el temporizador se dio la vuelta , y por esa razón, si tratamos de medir duraciones que son demasiado largos (o más precisamente , ya que los tiempos límite de su período de reloj temporizador ), vamos a obtener resultados falsos! Por esa razón , la adecuada elección de la frecuencia de reloj, temporizador de precisión y calibración de la frecuencia se discute a continuación es crítica.

PRECISIÓN

La primera opción que afecta a la operación del módulo es la precisión. El MIOIO tiene 3 single-precision y 3 double-precision módulos de entrada de pulso  (es posible cambiar esta división cambiando uno de doble precisión por dos módulos de precisión simple ) con precisión simple. Los módulos de precisión simple usan un temporizador de 16 bits y por lo tanto pueden medir duraciones de hasta 65.535 ciclos de reloj. Los módulos de doble precisión utilizan un temporizador de 32 bits y por lo tanto pueden medir duraciones de hasta 4,3 mil millones de ciclos de reloj.

RELOJ

La fuente de reloj de cada módulo puede ser elegido para ser 16 MHz, 2 MHz, 256KHz o 62.5KHz. Cuanto menor sea la velocidad de reloj, más tiempo tardará para que el temporizador de vuelco , así el más largo es el pulso más largo que se puede medir. Por ejemplo, un módulo de precisión simple, utilizando el reloj de 256KHz, puede medir duraciones de hasta 65535/256000 = 0.255 [ seg]. Por otro lado, para reloj más lento, menor será la resolución de la medición, por ejemplo, cuando se utiliza el reloj 62.5KHz, nuestras mediciones se limitan a múltiplos de 1/62500 = 16 [ nos ], por lo que una duración de 40 [ nos ] en realidad medir 48 [ nos ], que puede o no puede ser aceptable para nuestra aplicación . Obviamente, los módulos de doble precisión sufren mucho menos de este cambio, así que a menos que uno necesite más de 4 canales simultáneos, el uso de doble precisión es la opción más sencilla.

MODO

El parámetro que determina qué eventos constituyen el principio y el final del período de medición se denomina modo. El modo puede ser de impulso positivo (es decir, HIGH), pulso negativo (es decir, LOW) o frecuencia (es decir, el flanco ascendente de flanco ascendente). Cuando la medición de la frecuencia , es posible ya sea medir la duración de un solo período , la duración de 4 períodos consecutivos , o la duración de 16 períodos consecutivos . Las dos últimas opciones, llamadas escalado de frecuencia permiten desplazar el rango de frecuencia que se puede medir y/o aumentar la resolución de la medida. También ayuda a suavizar el ruido como resultado de un promedio de varias mediciones. Ten en cuenta , sin embargo, que el límite del temporizador se vuelve más estricta como podemos aumentar la escala, es decir, la frecuencia más baja que podemos medir según el aumento del factor de escala . También ten en cuenta que en términos de la API, cuando se utiliza el escalado de frecuencia, los métodos van a devolver la duración de un solo período (o la frecuencia real , sin escala de la señal ). Es decir, la división del período medido por el número de factor de escala se realiza.

Para resumir los modos posibles, la siguiente tabla muestra las especificaciones para cada posible elección de los parámetros. Esta tabla es para la operación de precisión simple. Para obtener las cifras de doble precisión, simplemente multiplica la duración de pulso más larga por 65536 e igualmente divide la frecuencia más baja en la misma cantidad . Por conveniencia, la tabla se ordena por el pulso más largo. Para la resolución óptima, siempre selecciona la fila más inferior que coincida con la duración de pulso máxima esperada.

Clock Scaling Resolution Longest pulse Lowest frequency
62.5KHz 1 16us 1.048s 0.95Hz
250KHz 1 4us 262.1ms 3.81Hz
62.5KHz 4 4us 262.1ms 3.81Hz
250KHz 4 1us 65.54ms 15.26Hz
62.5KHz 16 1us 65.54ms 15.26Hz
2MHz 1 500ns 32.77ms 30.52Hz
250KHz 16 250us 16.38ms 61.0Hz
2MHz 4 125ns 8.192ms 122.1Hz
16MHz 1 62.5ns 4.096ms 244.1Hz
2MHz 16 31.25ns 2.048ms 488.3Hz
16MHz 4 15.6ns 1.024ms 976.6Hz
16MHz 16 3.9ns 256us 3.906KHz

DURACIÓN MÍNIMA

Para la máxima fiabilidad, por lo general, no se recomienda para medir las duraciones inferiores a 20 [us].  Usar períodos más cortos sería un riesgo que podría suceder en que se saltara algún evento sin informar de la duracón del siguiente evento, proporcionando así resultados falsos. Si el usuario es capaz de detectar estas anomalías , es posible medir las duraciones más cortas ( 5-10 [ us ] ). El escalado de frecuencia puede ayudar mucho en la medición de las frecuencias altas, ya que la duración efectiva se hace más larga. Por ejemplo, midiendo el periodo de una señal de 500 KHz viola los requisitos (que tiene un período de 2 [us]), pero con el uso de 16x de escala, la duración medida sera 32 [us], que está dentro de las especificaciones.

VELOCIDAD DE CAPTURA

Como las señales medidas pueden tener tasas elevadas, la captura de todos y cada evento es un desperdicio y normalmente innecesario. Por esa razón , la tasa de captura se limita internamente a 200 capturas por segundo, por canales . En otras palabras, la medición de una señal con una frecuencia mayor que 200 Hz, se saltará algunos de los impulsos, pero producirá mediciones más precisas 200 veces por segundo.

COMO USARLO

Utilizando los pins MIOIO como entradas de impulsos se realiza a través de la interfaz PulseInput . Una instancia de esta interfaz se corresponde con un pin físico de la tarjeta, configurado para trabajar en modo de entrada de impulsos, así como un módulo de pulso de entrada de los 6 que están disponibles (3 de precisión simple, 3 con precisión doble o como está configurado). Los eventos  PulseInput se obtienen llamando a una de las sobrecargas de IOIO.openPulseInput(). La forma más simple es:

PulseInput pulse = ioio.openPulseInput(pinNum, mode);

donde  mode puede ser, por ejemplo, PulseMode.POSITIVEPulseMode.NEGATIVE, o PulseMode.FREQ.  Esto abre el número de pin pinNum como una entrada de pulsos flotante, en doble precisión con un reloj de 16 MHz, que es un buen valor por defecto para muchas aplicaciones. Es necesario que en el momento de la llamada, este pin no se utiliza para nada más, y que haya por lo menos un módulo de entrada de pulsos libres con la precisión asignada. Con el fin de abrir el pin con pull-up o pull-down, para usar de precisión simple, o una tasa de reloj diferente, utilice la versión más larga del método.

Una vez que se obtiene un evento de PulseInput , la duración del último pulso puede ser obtenida usando:

float pulseSeconds = pulse.getDuration();

Cuando se usa para medir la frecuencia, es preferible de la forma siguiente:

float freqHz = pulse.getFrequency();

Los métodos anteriores pueden bloquear durante algunos milisegundos en la primera llamada, pero volverán inmediatamente.

A veces, es necesario medir anchos de pulso sin perder un solo pulso. Esto es posible si la frecuencia de la señal entrante es inferior a 200 Hz, y logrado llamando:

float pulseSeconds = pulse.waitPulseGetDuration();

De esta forma se bloqueará hasta que se mide el pulso y luego regresará a su duración. Un pequeño FIFO se utiliza internamente para asegurar que no se pierden impulsos, pero la persona que lo use debe leerla con frecuencia o la FIFO se desbordará y los pulsos se descartarán.

Cuando haya terminado de usar el pin, usa:

pulse.close();

con el fin de devolver el pin a un estado "flotante" y, posiblemente, ser capaz de volver a abrirlo en el mismo o en un modo diferente, así como conexión del módulo de entrada de pulsos. La instancia PulseInput se vuelve inútil después de esta llamada -no se puede hacer nada con ella.

Deja un comentario

Tu dirección de correo electrónico no será publicada.