1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| // Faire tourner le moteur à une vitesse constante, sauf démarrage
// Récupérer chaque changement d'état grace à une interruption chaque voie du codeur
// Calculer la vitesse du réducteur en tr/min et la stocker dans un tableau
// Transmettre a posteriori via la voie série
const int nbTicks = 96;
const int _MOTEUR = 9; // Digital pin pour commande moteur
unsigned int tick_codeuse = 0; // Compteur de tick de la codeuse
unsigned long Old_tick_codeuse = 0; // Ancienne valeur de tick de la codeuse
unsigned long Millis_tick_codeuse = 0; // Ancien instant de tick de la codeuse
unsigned long temps; // variable de temps en microsecondes, car avec micros() direct, ça marche pas !!
unsigned long temps_ant; // instant antérieur
unsigned long timeinit; // instant initial
volatile float vitesse;
volatile float periode;
volatile float vitesses[nbTicks][2];
volatile bool vide = true ;
volatile int i = 0 ;
/* Routine d'initialisation */
void setup() {
pinMode(_MOTEUR, OUTPUT); // Configuration de la broche en sortie
analogWrite(_MOTEUR, 127); // Commande PWM de 0 à 255 Max (de 0 à 100% de la "tension d'alimentation")
attachInterrupt(0, compteur, CHANGE); // Interruption sur tick de la codeuse (interruption 0 = pin2 arduino uno)
attachInterrupt(1, compteur, CHANGE); // Interruption sur tick de la codeuse (interruption 1 = pin3 arduino uno)
Serial.begin(230400) ;
Serial.flush();
delay(5000); // Pause de 5 sec pour laisser le temps au Serial de s'initialiser
timeinit = micros();
temps_ant = timeinit ;
}
/* Fonction principale */
void loop(){
while (vide){
}
if (not vide){
Serial.println("Tableau des vitesses");
for (int j=0 ; j<nbTicks ; j++){
Serial.print(vitesses[j][0]); Serial.print(", ");Serial.println(vitesses[j][1]);
vide = true ;
}
}
}
/* Interruption sur tick de la codeuse */
void compteur(){
// Old_tick_codeuse = tick_codeuse ; // mémorise l'ancien instant
tick_codeuse++; // On incrémente le nombre de tick de la codeuse
temps = micros();
// periode = float(temps-temps_ant)/1000;
if (i<nbTicks){
vitesse = 1000000.0/float(temps-temps_ant)*60/12/53 ;
vitesses[i][0]= (temps-timeinit) ; vitesses[i][1]= vitesse ;
temps_ant=temps;
// Serial.print("i= "); Serial.print(i); Serial.print(", ");
// Serial.println(vitesse);
i++ ;
}
else {
analogWrite(_MOTEUR, 0);
vide = false;
// Serial.println(vitesse);
// Serial.print(" , ");
// Serial.println(tick_codeuse);
}
} |
Partager