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
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.