Compteurs - Partie logicielle

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

La classe Counter (Java, C++) est une classe polyvalente qui permet le comptage des fronts d’impulsion sur une entrée numérique. Counter est utilisé comme composant dans plusieurs classes WPILib plus compliquées (telles que Encoder et Ultrasonic <docs/software/sensors/ultrasonics-software:Ultrasonics - Software>`), mais elle est également très utile par elle même.

Note

Il y a un total de 8 dispositifs de type « compteur » dans le roboRIO FPGA, ce qui signifie pas plus de 8 objets Counter peuvent être instanciés à tout moment, y compris ceux contenus comme ressources dans d’autres objets WPILib. Pour des informations détaillées sur quand un: code:Counter peut être utilisé par un autre objet, reportez-vous à la documentation officielle de l’API.

Configuration d’un compteur

La classe Counter peut être configurée de différentes manières pour fournir des fonctionnalités différentes.

Modes de l’objet Counter

L’objet Counter peut être configuré pour fonctionner dans l’un des quatre modes différents:

  1. Two-pulse mode: compte de haut en bas en fonction des fronts de deux canaux différents.

  2. Semi-period mode: mesure la durée d’une impulsion sur un seul canal.

  3. Mode de longueur d’impulsion: compte en haut et en bas en fonction des bords d’un canal, la direction étant déterminée par la durée de l’impulsion sur ce canal.

  4. External direction mode: compte vers le haut et vers le bas en fonction des fronts d’un canal. Un autre canal séparé spécifie la direction.

Note

Dans tous les modes sauf le mode demi-période, le compteur peut être configuré pour incrémenter soit une fois par front (décodage 2X), soit une fois par impulsion (décodage 1X). Par défaut, les compteurs sont réglés sur le mode « Two-pulse mode », si un seul canal est spécifié, le compteur ne fera que compter.

Mode deux-impulsions (« Two-pulse mode »)

En mode deux-impulsions , le Counter comptera vers le haut pour chaque front / impulsion sur le « canal montant » spécifié et vers le bas pour chaque front / impulsion sur le « “canal descendant » spécifié. Un compteur peut être initialisé en deux impulsions avec le code suivant:

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

Mode demi-période (« Semi-period mode »)

En mode demi-période, le Counter comptera la durée des impulsions sur un canal, soit d’un front montant au front descendant suivant, soit d’un front descendant au front montant suivant. Un compteur peut être initialisé en mode demi-période avec le code suivant:

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

Pour obtenir la largeur d’impulsion, appelez la méthode getPeriod ():

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

Mode durée d’impulsion (« Pulse-length mode »)

En mode durée d’impulsion, le compteur comptera vers le haut ou vers le bas selon la durée de l’impulsion. Une impulsion au-dessous du temps seuil spécifié sera interprétée comme un compte vers le haut et une impulsion au-dessus du seuil est un compte vers le bas. (Notez l’inversion logique). Ceci est utile pour certains capteurs qui codent la direction de cette manière, comme ceux qui mesurent la position sur les dents d’un engrenage . Un compteur peut être initialisé dans ce mode comme suit:

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

Mode direction externe (« External direction mode »)

En mode direction externe, le compteur compte vers le haut ou vers le bas selon le niveau sur le deuxième canal. Si la source de direction est faible, le compteur augmentera, si la source de direction est élevée, le compteur diminuera (pour inverser cela, voir la section suivante). Un compteur peut être initialisé dans ce mode comme suit:

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

Configuration des paramètres des compteurs

Note

La classe Counter ne fait aucune hypothèse sur les unités de distance; comme elle compte seulement les impulsions, elle retournera les valeurs dans le système d’unités utilisées pour calculer la distance. Les utilisateurs ont ainsi un contrôle total sur les unités de distance utilisées. Cependant, les unités de temps sont toujours en secondes.

Note

Le nombre d’impulsions utilisé dans le calcul de la distance par impulsion ne dépend pas du type de décodage - chaque « impulsion » doit toujours être considérée comme un cycle complet (montant et descendant).

Outre les configurations spécifiques au mode, la classe Counter propose un certain nombre de méthodes de configuration supplémentaires:

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

Lecture des informations des compteurs

Quel que soit le mode, il existe des informations que la classe Counter rend toujours disponibles aux utilisateurs:

Le compte

Les utilisateurs peuvent obtenir le compte actuel avec la méthode get():

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

La distance

Note

Les compteurs mesurent la distance relative, non absolue; la valeur de distance renvoyée dépendra de la position de l’encodeur lors de la mise sous tension du robot ou de la dernière valeur de l’encodeur reset.

Si la distance par impulsion a été configurée, les utilisateurs peuvent obtenir la distance totale parcourue par le capteur compté avec la méthode getDistance():

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

Le taux

Note

Les unités de temps pour la classe Counter sont toujours en secondes.

Les utilisateurs peuvent obtenir le taux de changement actuel du compteur avec la méthode getRate() :

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

Mode stationnaire

Les utilisateurs peuvent savoir si le compteur est stationnaire avec la méthode getStopped():

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

La direction

Les utilisateurs peuvent obtenir la direction vers laquelle le compteur incrémente ou décrémente avec le code:

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

La période

Note

Dans mode semi-période, cette méthode renvoie la durée de l’impulsion, pas celle de la période.

Les utilisateurs peuvent obtenir la durée (en secondes) de la période la plus récente avec la méthode getPeriod():

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

Réinitialisation d’un compteur

Pour réinitialiser un compteur à une lecture de distance de zéro, appelez la méthode reset(). Ceci est utile pour garantir que la distance mesurée correspond à la mesure physique réelle souhaitée.

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

Utilisation de compteurs dans le code

Les compteurs sont utiles pour une grande variété d’applications - mais comme la classe Counter est si large, il est difficile d’en fournir un bon résumé ici. Beaucoup de ces applications s’apparentent à la classe Encoder - souvent, un simple compteur peut remplacer économiquement un encodeur en quadrature. Pour un résumé des utilisations potentielles des encodeurs dans le code, voir Encodeurs - Partie logicielle.