Counters-Sayıcılar

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

The :code: Counter sınıfı (` Java <https://first.wpi.edu/wpilib/allwpilib/docs/release/java/edu/wpi/first/wpilibj/Counter.html> __, C ++ < https://first.wpi.edu/wpilib/allwpilib/docs/release/cpp/classfrc_1_1Counter.html>`__), dijital bir girişte darbe kenarlarının sayılmasına izin veren çok yönlü bir sınıftır. Counter is used as a component in several more-complicated WPILib classes (such as Encoder and Ultrasonic), ancak kendi başına da oldukça kullanışlıdır.

Not

RoboRIO FPGA’da toplam 8 counter birimi vardır, yani 8’den fazla olamaz Counter nesneleri, diğer WPILib nesnelerinde kaynaklar olarak bulunanlar da dahil olmak üzere herhangi bir zamanda başlatılabilir. A Counter ın başka bir nesne tarafından ne zaman kullanılabileceğine ilişkin ayrıntılı bilgi için, resmi API belgelerine bakın.

Sayıcıyı Yapılandırma

Counter sınıfı, farklı işlevler sağlamak için çeşitli şekillerde yapılandırılabilir.

Counter-Sayıcı Modları

Counter nesnesi, dört farklı moddan birinde çalışacak şekilde yapılandırılabilir:

  1. Two-pulse mode: İki farklı kanalın kenarlarına göre yukarı ve aşağı sayar.

  2. Semi-period mode: Tek bir kanaldaki bir darbenin süresini ölçer.

  3. Pulse-length mode Yön, kanaldaki darbenin süresine göre belirlenen kanalın kenarlarına göre yukarı ve aşağı sayar.

  4. External direction mode: Yönü ayrı bir kanal belirleyerek, bir kanalın kenarlarına göre yukarı ve aşağı sayar.

Not

Yarı dönem modu dışındaki tüm modlarda, sayaç, kenar başına bir kez (2X kod çözme) veya darbe başına bir kez (1X kod çözme) artacak şekilde yapılandırılabilir. Varsayılan olarak, sayaçlar iki darbeli moda ayarlanmıştır, yalnızca bir kanal belirtilirse, sayaç yalnızca sayar.

Two-pulse İki darbeli mod

İki darbeli modda, Counter belirtilen “up channel” üzerindeki her kenar / darbe için ve belirtilen “down channel” üzerindeki her kenar/darbe için aşağı doğru sayacaktır. Bir sayaç, aşağıdaki kodla iki darbeli olarak başlatılabilir:

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

Semi-period Yarı dönem modu

Yarı dönem modunda :code:`Counter”, bir kanaldaki darbelerin süresini yükselen kenardan bir sonraki düşen kenara veya düşen kenardan bir sonraki yükselen kenara sayacaktır. Bir sayaç, aşağıdaki kodla semi-period - yarı dönem modunda başlatılabilir:

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

Darbe genişliğini elde etmek için getPeriod() yöntemini çağırın:

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

Pulse uzunluğu - Pulse-length modu

Darbe uzunluğu modunda, sayaç darbenin uzunluğuna bağlı olarak yukarı veya aşağı sayacaktır. Belirtilen eşik süresinin altındaki bir darbe ileri bir sayı olarak yorumlanacaktır ve eşiğin üzerindeki bir darbe bir ters sayımdır. Bu, yönü bu şekilde kodlayan bazı dişli dişi sensörleri için kullanışlıdır. Bu modda bir sayaç aşağıdaki şekilde başlatılabilir:

// 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)
}

Dış yön modu

Harici yön modunda, ikinci kanaldaki seviyeye bağlı olarak sayaç yukarı veya aşağı sayar. Yön kaynağı düşükse sayaç artacaktır, yön kaynağı yüksekse sayaç azalacaktır (bunu tersine çevirmek için sonraki bölüme bakın). Bu modda bir sayaç aşağıdaki şekilde başlatılabilir:

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

Sayaç-counter parametrelerini yapılandırma

Not

Counter sınıfı, mesafe birimleri hakkında herhangi bir varsayımda bulunmaz; darbe başına mesafe değerini hesaplamak için kullanılan birimlerdeki değerleri döndürür. Kullanıcılar böylece kullanılan mesafe birimleri üzerinde tam kontrole sahip olur. Ancak, zaman birimleri * her zaman * saniye cinsindendir.

Not

Darbe başına mesafe hesaplamasında kullanılan darbe sayısı, kod çözme türüne bağlı * değildir * - her “darbe” her zaman tam bir döngü (yükselen ve düşen) olarak düşünülmelidir.

Moda özgü konfigürasyonların yanı sıra Counter sınıfı bir dizi ek yapılandırma yöntemi sunar:

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

Sayaçlardan bilgi okuma

Moddan bağımsız olarak, Counter sınıfının her zaman kullanıcılara sunduğu bazı bilgiler vardır:

Count - Sayım

Kullanıcılar şu anki sayımı get() yöntemiyle alabilir:

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

Distance-Distance

Not

Sayaçlar relative-göreli mesafeyi ölçer, mutlak değil; döndürülen mesafe değeri, robot açıldığında veya kodlayıcı değeri en son olduğunda kodlayıcının konumuna bağlı olacaktır reset.

If the distance per pulse has been configured, users can obtain the total distance traveled by the counted sensor with the getDistance() method:

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

Rate-Oran

Not

Counter sınıfı için zaman birimleri saniye cinsinden her zaman şeklindedir.

Kullanıcılar şu anki sayacın değişim oranını getRate() yöntemi ile elde edebilir:

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

Stopped-Durdurulmuş

Kullanıcılar, sayacın sabit olup olmadığını getStopped() yöntemiyle öğrenebilirler:

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

Direction - Yön

Kullanıcılar, sayıcının en son hareket ettiği yönü :code:`getDirection()’ yöntemiyle elde edebilir:

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

Period

Not

In semi-period mode, this method returns the duration of the pulse, not of the period.

Kullanıcılar, en son dönemin süresini (saniye cinsinden ):code:getPeriod() yöntemiyle elde edebilir:

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

Sayıcıyı sıfırlama

Bir sayacı sıfır mesafeli okumaya sıfırlamak için reset() yöntemini çağırın. Bu, ölçülen mesafenin gerçek istenen fiziksel ölçüme karşılık gelmesini sağlamak için kullanışlıdır.

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

Counter-Sayıcı ları kodda kullanma

Sayaçlar çok çeşitli robot uygulamaları için kullanışlıdır - ancak Counter sınıfı çok çeşitli olduğundan burada bunların iyi bir özetini vermek zordur. Bu uygulamaların çoğu Encoder sınıfı ile örtüşmektedir - basit bir sayaç, genellikle bir quadrature kodlayıcıya göre daha ucuz bir alternatiftir. Koddaki kodlayıcıların potansiyel kullanımlarının bir özeti için bkz . Encoders - Software, Kodlayıcılar - Yazılım.