Entradas análogas - Software

Nota

Esta sección cubre las entradas análogas en software. Para una guía de entradas análogas en Hardware, lea Entradas analógicas - Hardware.

El FPGA de roboRIO admite hasta 8 canales de entrada analógica que se pueden usar para leer el valor de un voltaje analógico de un sensor. Las entradas analógicas se pueden usar para cualquier sensor que emite un voltaje simple.

Las entradas analógicas del FPGA por defecto devuelven un número entero de 12 bits proporcional al voltaje, de 0 a 5 voltios.

Clase AnalogInput

Nota

Normalmente es más conveniente usar la clase Analog Potentiometers<analog-potentiometers-software> que usar la AnalogInput directamente, ya que permite escalar a unidades más significativas.

Support for reading the voltages on the FPGA analog inputs is provided through the AnalogInput class (Java, C++).

Inicializando una AnalogInput

Una AnalogInput tiene que inicializarse de esta forma:

// Initializes an AnalogInput on port 0
AnalogInput analog = new AnalogInput(0);
// Initializes an AnalogInput on port 0
frc::AnalogInput analog{0};

Sobremuestreo y Promedio

The Analog to Digital converter reads the signal and passes it to oversampling, averaging, and an accumulator.

Los módulos de entrada analógica de FPGA admiten sobremuestreo y promedio. Estos comportamientos son muy similares, pero difieren en algunas formas importantes. Ambos pueden usarse al mismo tiempo.

Sobremuestreo

When oversampling is enabled, the FPGA will add multiple consecutive samples together, and return the accumulated value. Users may specify the number of bits of oversampling - for \(n\) bits of oversampling, the number of samples added together is \(2^{n}\):

// Sets the AnalogInput to 4-bit oversampling.  16 samples will be added together.
// Thus, the reported values will increase by about a factor of 16, and the update
// rate will decrease by a similar amount.
analog.setOversampleBits(4);
// Sets the AnalogInput to 4-bit oversampling.  16 samples will be added together.
// Thus, the reported values will increase by about a factor of 16, and the update
// rate will decrease by a similar amount.
analog.SetOversampleBits(4);

Promedio

El promedio se comporta como un sobremuestreo, excepto que los valores acumulados se dividen por el número de muestras para que la escala de los valores devueltos no cambie. Esto suele ser más-conveniente, pero ocasionalmente el error de redondeo adicional introducido por el redondeo es indeseable.

// Sets the AnalogInput to 4-bit averaging.  16 samples will be averaged together.
// The update rate will decrease by a factor of 16.
analog.setAverageBits(4);
// Sets the AnalogInput to 4-bit averaging.  16 samples will be averaged together.
// The update rate will decrease by a factor of 16.
analog.SetAverageBits(4);

Nota

Cuando se utilizan sobremuestreo y promedio al mismo tiempo, primero se aplica el sobremuestreo y luego se promedian los valores sobremuestreados. Por lo tanto, el sobremuestreo de 2 bits y el promedio de 2 bits utilizados al mismo tiempo aumentará la escala de los valores devueltos en aproximadamente un factor de 2 y disminuirá la velocidad de actualización en aproximadamente un factor de 4.

Leyendo valores de la clase AnalogInput

Los valores se pueden leer desde AnalogInput con uno de cuatro métodos diferentes:

getValue

El método getValue devuelve el valor bruto instantáneo medido de la entrada analógica, sin aplicar ninguna calibración e ignorar las configuraciones de sobremuestreo y promedio. El valor devuelto es un entero.

analog.getValue();
analog.GetValue();

getVoltage

El método getVoltage devuelve el voltaje medido instantáneo desde la entrada analógica. Las configuraciones de sobremuestreo y promedio se ignoran, pero el valor se vuelve a escalar para representar un voltaje. El valor devuelto es un doble.

analog.getVoltage();
analog.GetVoltage();

getAverageValue

El método getAverageValue devuelve el valor promedio de la entrada analógica. El valor no se vuelve a escalar, pero se aplican sobremuestreo y promedio. El valor devuelto es un entero.

analog.getAverageValue();
analog.GetAverageValue();

getAverageVoltage

El método getAverageVoltage devuelve el voltaje promedio de la entrada analógica. El reescalado, el sobremuestreo y el promedio se aplican. El valor devuelto es un doble.

analog.getAverageVoltage();
analog.GetAverageVoltage();

Acumulador

Nota

Los métodos de acumulación no admiten actualmente la devolución de un valor en unidades de voltios; el valor devuelto siempre será un entero (específicamente, uno largo).

Los canales de entrada analógica 0 y 1 soportan adicionalmente un acumulador, que integra (suma) la señal indefinidamente, de modo que el valor devuelto es la suma de todos los valores medidos pasados. El sobremuestreo y el promedio se aplican antes de la acumulación.

// Sets the initial value of the accumulator to 0
// This is the "starting point" from which the value will change over time
analog.setAccumulatorInitialValue(0);
// Sets the "center" of the accumulator to 0.  This value is subtracted from
// all measured values prior to accumulation.
analog.setAccumulatorCenter(0);
// Returns the number of accumulated samples since the accumulator was last started/reset
analog.getAccumulatorCount();
// Returns the value of the accumulator.  Return type is long.
analog.getAccumulatorValue();
// Resets the accumulator to the initial value
analog.resetAccumulator();
// Sets the initial value of the accumulator to 0
// This is the "starting point" from which the value will change over time
analog.SetAccumulatorInitialValue(0);
// Sets the "center" of the accumulator to 0.  This value is subtracted from
// all measured values prior to accumulation.
analog.SetAccumulatorCenter(0);
// Returns the number of accumulated samples since the accumulator was last started/reset
analog.GetAccumulatorCount();
// Returns the value of the accumulator.  Return type is long.
analog.GetAccumulatorValue();
// Resets the accumulator to the initial value
analog.ResetAccumulator();

Obtención de recuento y valor sincronizados

A veces, es necesario obtener medidas coincidentes de la cuenta y el valor. Esto se puede hacer usando el método getAccumulatorOutput:

// Instantiate an AccumulatorResult object to hold the matched measurements
AccumulatorResult result = new AccumulatorResult();
// Fill the AccumulatorResult with the matched measurements
analog.getAccumulatorOutput(result);
// Read the values from the AccumulatorResult
long count = result.count;
long value = result.value;
// The count and value variables to fill
int_64t count;
int_64t value;
// Fill the count and value variables with the matched measurements
analog.GetAccumulatorOutput(count, value);

Usar entradas analógicas en código

La clase AnalogInput se puede usar para escribir código para una amplia variedad de sensores (incluidos potenciómetros, acelerómetros, giroscopios, ultrasonidos y más) que devuelven sus datos como un voltaje analógico. Sin embargo, si es posible, casi siempre es más conveniente utilizar una de las otras clases WPILib existentes que manejan el código de nivel inferior (leer los voltajes analógicos y convertirlos en unidades significativas) para usted. Los usuarios solo deben usar AnalogInput directamente como «último recurso».

En consecuencia, para obtener ejemplos de cómo usar efectivamente sensores analógicos en el código, los usuarios deben consultar las otras páginas de este capítulo que tratan sobre clases más específicas.