计数器

IO Diagram showing the up/down pulses the counter is counting.

Counter类(Java, C++)是一种多功能的类,允许对数字输入的脉冲边界进行计数。 Counter在多个更复杂的WPILib类(例如Encoder和Ultrasonic)中用作组件,但它本身也非常有用。

注解

roboRIO FPGA中总共有8个计数器单元,这意味着Counter在同时最多可以实例化8个对象,包括那些作为其他WPILib对象中资源的对象。有关Counter何时可能被其他对象使用的详细信息,请参阅官方API文档。

配置计数器

Counter类可以以多种方式配置来提供不同的功能。

计数器模式

Counter对象可以被配置成四个不同模式中的一种:

  1. 双脉冲模式:根据两个不同通道的边界上下计数。

  2. 半周期模式:测量单个通道上的脉冲持续时间。

  3. 脉冲长度模式:根据一个通道的边界上下计数,其方向由该通道上的脉冲持续时间确定。

  4. 外部方向模式:根据一个通道的边界进行上下计数,并使用单独的通道指定方向。

注解

在除半周期模式以外的所有模式下,均可将计数器配置为每个边界增加一次(2X解码),或者每个脉冲增加一次(1X解码)。默认情况下,计数器设置为双脉冲模式,如果仅指定一个通道,则计数器只会为向上计数。

双脉冲模式

在双脉冲模式下,Counter对于指定的“上行通道”上的每个边界/脉冲,将递增计数,对于指定的“下行通道”上的每个边界/脉冲将递减计数。可以使用以下代码在两个脉冲中初始化计数器:

// Create a new Counter object in two-pulse mode
Counter counter = new Counter(Counter.Mode.k2Pulse);

@Override
public void robotInit() {
    // Set up the input channels for the counter
    counter.setUpSource(1);
    counter.setDownSource(2);

    // Set the decoding type to 2X
    counter.setUpSourceEdge(true, true);
    counter.setDownSourceEdge(true, true);
}

半周期模式

在半周期模式下,Counter将对通道上脉冲的持续时间进行计数,从上升沿到下一个下降沿,或者从下降沿到下一个上升沿。可以使用以下代码在半周期模式下初始化计数器:

// Create a new Counter object in two-pulse mode
Counter counter = new Counter(Counter.Mode.kSemiperiod);

@Override
public void robotInit() {
    // Set up the input channel for the counter
    counter.setUpSource(1);

    // Set the encoder to count pulse duration from rising edge to falling edge
    counter.setSemiPeriodMode(true);
}

要获取脉冲宽度,请调用getPeriod()方法:

// Return the measured pulse width in seconds
counter.GetPeriod();

脉冲长度模式

在脉冲长度模式下,计数器将根据脉冲长度递增或递减计数。低于指定阈值时间的脉冲将被解释为正向计数,而高于阈值的脉冲将被解释为反向计数。这对于某些以这种方式编码方向的齿轮传感器很有用。如下所示在此模式下初始化计数器:

// Create a new Counter object in two-pulse mode
Counter counter = new Counter(Counter.Mode.kPulseLength);

@Override
public void robotInit() {
    // Set up the input channel for the counter
    counter.setUpSource(1);

    // Set the decoding type to 2X
    counter.setUpSourceEdge(true, true);

    // Set the counter to count down if the pulses are longer than .05 seconds
    counter.SetPulseLengthMode(.05)
}

外部方向模式

在外部方向模式下,计数器根据第二个通道的电平递增或递减计数。如果方向源为低电平,则计数器将增加;如果方向源为高电平,则计数器将减小(要反转,请参见下一节)。如下所示在此模式下初始化计数器:

// Create a new Counter object in two-pulse mode
Counter counter = new Counter(Counter.Mode.kExternalDirection);

@Override
public void robotInit() {
    // Set up the input channels for the counter
    counter.setUpSource(1);
    counter.setDownSource(2);

    // Set the decoding type to 2X
    counter.setUpSourceEdge(true, true);
}

配置计数器参数

注解

Counter类不对距离单位做任何假设;它将以用于计算每脉冲距离值的任何单位返回值。因此,用户可以决定所使用的距离单位。但是,时间单位始终以秒为单位。

注解

计算每个脉冲的距离时使用的脉冲的数量不依赖于解码类型-每个“脉冲”应始终被认为是一个完整的周期(上升和下降)。

除了特定于模式的配置外,Counter该类还提供了许多其他配置方法:

// Configures the counter to return a distance of 4 for every 256 pulses
// Also changes the units of getRate
counter.setDistancePerPulse(4./256.);

// Configures the counter to consider itself stopped after .1 seconds
counter.setMaxPeriod(.1);

// Configures the counter to consider itself stopped when its rate is below 10
counter.setMinRate(10);

// Reverses the direction of the counter
counter.setReverseDirection(true);

// Configures an counter to average its period measurement over 5 samples
// Can be between 1 and 127 samples
counter.setSamplesToAverage(5);

从计数器读取信息

无论采用哪种模式,Counter类始终会向用户公开一些信息:

计数

用户可以使用以下get()方法获取当前计数:

// returns the current count
counter.get();

距离

注解

计数器测量相对距离,而不是绝对距离;返回的距离值取决于打开机器人电源或上次:ref:`重置 <docs/software/sensors/counters:Resetting a Counter>`编码器值时编码器的位置。

如果已配置 每个脉冲的距离,则用户可以使用以下getDistance()方法获得计数传感器的总移动距离:

// returns the current distance
counter.getDistance();

速率

注解

计数器类的时间单位总是秒。

用户可以通过以下方法获取计数器的当前变化率getRate():

// Gets the current rate of the counter
counter.getRate();

是否停止

用户可以通过以下getStopped()方法获取计数器是否停止:

// Gets whether the counter is stopped
counter.getStopped();

方向

用户可以使用以下getDirection()方法获取计数器最后移动的方向:

// Gets the last direction in which the counter moved
counter.getDirection();

周期

注解

在:ref:`半周期模式 <docs/software/sensors/counters:Semi-period mode>`下,此方法返回脉冲的持续时间,而不是周期的持续时间。

用户可以使用以下方法获取最近周期的持续时间(以秒为单位)getPeriod():

// returns the current period in seconds
counter.getPeriod();

重置计数器

要将计数器重置为零距离读数,请调用reset()方法。这可以确保测量的距离与实际距离相对应。

// Resets the encoder to read a distance of zero
counter.reset();

在代码中使用计数器

计数器对各种各样的机器人程序很有用-但是由于Counter类的种类繁多,因此很难在此处提供它们的完整摘要。这些应用中有许多与Encoder类重叠-简单的计数器通常是正交编码器的廉价替代品。有关代码中编码器潜在用途的摘要,请参见:ref:docs/software/sensors/encoders-software:Encoders - Software