模拟输入-软件

注解

本节介绍软件中的模拟输入。有关模拟输入的硬件指南,请参见:ref:docs/hardware/sensors/analog-inputs-hardware:Analog Inputs - Hardware

roboRIO的FPGA支持多达8个模拟输入通道,可用于从传感器读取模拟电压值。模拟输入可用于任何输出简单电压的传感器。

默认情况下,来自FPGA的模拟输入返回一个与电压成正比的12bit整数,范围为0至5伏。

AnalogInput类

注解

与直接使用AnalogInput相比,使用Analog Potentiometers 包装器类通常更方便,因为它支持缩放至有意义的单位。

通过AnalogInput类(Java, C++)提供了读取FPGA模拟输入上的电压的支持。

初始化模拟输入

AnalogInput可如下初始化:

// Initializes an AnalogInput on port 0
AnalogInput analog = new AnalogInput(0);

过采样和平均

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

FPGA的模拟输入模块支持过采样和平均。两者非常相似,但在一些重要方面有所不同。两者可以同时使用。

过采样

使能过采样后,FPGA将把多个连续采样加在一起,并返回累加值。用户可以指定过采样的*位数量-对于过采样的n位,相加的采样数量为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 averaging.  16 samples will be averaged together.
// The update rate will decrease by a factor of 16.
analog.setAverageBits(4);

注解

当同时使用过采样和平均时,将首先应用过采样,然后对过采样的值进行平均。因此,同时使用2位过采样和2位平均将使返回值的小数位数增加大约2倍,而更新率降低大约4倍。

从AnalogInput读取值

Values can be read from an AnalogInput with one of four different methods:

getValue

该getValue方法从模拟输入返回原始瞬时测量值,而无需进行任何校准,也无需忽略过采样

analog.getValue();

getVoltage

该getVoltage方法从模拟输入返回瞬时测量电压。过采样和平均设置将被忽略,但该值将重新缩放以代表电压。返回值是双精度浮点数。

analog.getVoltage();

getAverageValue

该getAverageValue方法从模拟输入返回平均值。该值不会重新定标,但是会同时应用过采样和平均。返回值是一个整数。

analog.getAverageValue();

getAverageVoltage

该getAverageVoltage方法从模拟输入返回平均电压。重新缩放,过采样和平均均适用。返回值是双精度浮点数。

analog.getAverageVoltage();

累加器

注解

累加器方法当前不支持以伏特为单位返回值-返回的值将始终是整数(特殊时是 long)。

模拟输入通道0和1额外支持一个累加器,该累加器可无限期地积分(累加)信号,因此返回值是所有过去测量值的总和。在累加之前进行过采样和平均。

// 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();

获得同步的计数和值

有时,必须获得匹配的计数和值。可以使用以下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;

在代码中使用模拟输入

AnalogInput类可用给各种传感器(包括电位计,加速度计,陀螺仪,超声波,等等)返回它们的模拟电压数据。但是,如果可能的话,使用其他现有的WPILib类中的一个总是更方便,该类可为您处理较低级别的代码(读取模拟电压并将其转换为有意义的单位)。用户应将直接使用AnalogInput用作“最后的手段”。

因此,有关如何有效地在代码中使用模拟传感器的示例,用户应参考本章的其他页面,这些页面涉及更具体的类。