Projet

Général

Profil

Programme Arduino - Lecture de l'encodeur » lecture_encodeur.ino

Aline RE, 15/02/2019 14:18

 
/* PROGRAMME ARDUINO (ESP32) - PROJET CAPTEURS DE SPORES IFV avec le FABLAB COH@BIT
by Aline RE (15.02.2019)

Ce programme permet de lire le signal venant d'un encodeur rotatif et de calculer la vitesse de rotation du moteur
*/

/////////////////////////////////
/// DECLARATION DES VARIABLES ///
/////////////////////////////////

const byte pinEncodeurA = 2; // Broche du micro-controlleur à laquelle est relié le signal de l'encodeur
volatile byte compteur = 0; // Variable compteurur
volatile int vitesse; // Variable de calcul de la vitesse du moteur
const int duree_compteur_microsec = 1000000; // Durée pendant laquelle on laisse le compteur s'incrémenter (en micro-secondes)
hw_timer_t * timer = NULL; // Crée un objet de type compteur (horloge)
const float pas_roue_codeuse = 0.72; // Pas angulaire de la roue codeuse: 500CPR = un cran tous les 0,72°


/////////////////////////////////
/// FONCTION D'INITIALISATION /// (exécuté une seule fois)
/////////////////////////////////
void setup()
{

Serial.begin(9600); // Active la communication entre le micro-controlleur et l'ordinateur (et donc interface Arduino)

pinMode(pinEncodeurA, INPUT); // Broche encodeur, signal A

// On crée une interruption liée à la détection de front descendant sur le signal encodeur , qui lance le programme encodeurTickA à chaque détection
attachInterrupt(0, encodeurTickA, FALLING);

// On crée une interruption timer (à chaque fin de période, on fait le calcul de vitesse)
timer = timerBegin(0, 80, true); // Crée un compteur qui s'incremente toutes les millisecondes:
// Horloge ESP32 = 80 MHz, en utilisant un prescaler (diviseur) de 80 on obtient un compteur 1 MHz
// /!\ A CHANGER SI UNE AUTRE CARTE QUE L'ESP32 EST UTILISEE (Arduino: 16 MHz)
timerAttachInterrupt(timer, &onTimer, true); // Crée une interruption qui lance la fonction onTimer une fois le compteur fini
timerAlarmWrite(timer, duree_compteur_microsec, true); // Active l'interruption lorsque le compteur = 1000000 µs = 1s
timerAlarmEnable(timer); // Active le compteur

delay(100); // Temporisation (en ms)
}


/////////////////////////////////
/// FONCTIONS INTERRUPTIONS ///
/////////////////////////////////

// Programme interruption qui gère le comptage des ticks de l'encodeur
void encodeurTickA()
{
compteur++; // Incrémente de 1 la valeur du compteur
}

// Programme d'interruption qui calcule la vitesse actuelle du moteur
void onTimer() {
vitesse = compteur / duree_compteur_microsec; // Vitesse = position / temps
compteur = 0; // On réinitialise le compteur
}


/////////////////////////////////
/// PROGRAMME PRINCIPAL /// (répété en boucle)
/////////////////////////////////

void loop()
{
Serial.println(compteur); // Affiche sur l'ordinateur la valeur du compteur (ouvrir Traceur Série pour voir les courbes, ou Moniteur Série pour voir les valeurs)
delay(20); // Temporisation (en ms)
}
    (1-1/1)