Mesure de vitesse par un tableau

Bonjour à tous,
Pour un projet en classe, j'essaye d'asservir en freinage une roue en rotation.
A l'aide d'un disque de frein et d'un photorecepteur, je peux mesurer la vitesse de la roue.
J'essaie de récupérer la vitesse, le temps, le jerk (dérivée seconde de la vitesse) et le DT entre chaque mesures.

Mais, je n'arrive pas à récupérer toutes ces mesures dans un même tableau et je ne comprends pas pourquoi.

Le système de mesure de la vitesse fonctionne, j'ai déjà reussi a récupérer des données.

#define SO 18 // Capteur optique
#define HT 19 // Clock

float vitesse = 0.0 ; 

volatile unsigned long T1;
volatile unsigned long T2;
unsigned long T2_c;
unsigned long T1_c;
unsigned long dT_op;

volatile byte b=0;
volatile int b_c=0;

int NbMesures = 9;
float Vitesse[9][2];
volatile int MesIndex =0;
long total=0;

float Jerk = 0;
int i;
int j;
long DT;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  pinMode(HT, INPUT);
  attachInterrupt(digitalPinToInterrupt(HT), Clock, RISING);
  pinMode(SO, INPUT);
  attachInterrupt(digitalPinToInterrupt(SO), readSO, RISING);
}


void  Clock(){
  b = b+1;
}

void readSO(){
  T1=T2;
  T2=micros();

}

void loop() {
  // put your main code here, to run repeatedly:
  noInterrupts();
  T2_c = T2;
  T1_c = T1;
  b_c = b;
  interrupts();
  dT_op = T2_c-T1_c;
  vitesse = (1e6)/ (16*dT_op);

  Vitesse[MesIndex][1] = vitesse;
  Vitesse[MesIndex][0] = T2_c;
 
  
  if (MesIndex=0){
    i = 9;
    j = 8;
  }
  else if (MesIndex=1){
    i=0;
    j=9;
  }
  else{
    i = MesIndex-1;
    j = MesIndex-2;
  }
  
  //Dérivée seconde i.e. Jerk :
  DT = Vitesse[MesIndex][0] - Vitesse[i][0];
  Vitesse[MesIndex][2] = (Vitesse[j][1] - 2*Vitesse[i][1] + Vitesse[MesIndex][1])*1e12 / (DT*DT);


  //Print de vitesse
  if (b_c>2){
    //Serial.print(pwr);
    Serial.print(" vitesse : ");
    Serial.print(Vitesse[MesIndex][1]);
    Serial.print(",");
    Serial.print(" Temps : ");
    Serial.print(Vitesse[MesIndex][0]);
    Serial.print(",");
    Serial.print(" jerk : ");
    Serial.print(Vitesse[MesIndex][2]);
    Serial.print(",");
    Serial.print(" DT : ");
    Serial.print(DT);
    Serial.print(" MesIndex : ");
    Serial.print(MesIndex);
    Serial.println();
    noInterrupts();
    b=0;
    interrupts();
    b_c=0;
  }
  
  MesIndex = MesIndex+1;
  if (MesIndex>9){
    MesIndex=0;
  }
}  

La clock est un générateur extérieur qui envoie une impulsion toutes les 100 ms.

Voici ce que j'obtiens :

image

Je ne comprends pas pouquoi l'index n'incremente pas.

Merci d'avance pour votre aide

Les variables qui sont modifiées par les routines de traitement des interruptions doivent être déclarées volatile.
Tu l'as fais pour Clock(), il faudrait le faire aussi pour celle manipulées dans readSO()

Petite erreur sur l'opérateur.

  • = affectation
  • == test d'égalité
    Même chose dans le else if

T1 et T2 sont deja tous deux volatile non?

OK merci

Oups, je me suis mélangé avec T1_c et T2_c

Pourquoi déclarer cette variable en volatile ? De même pour b_c ?

Une variable modifiée dans une interruption doit être la plus courte possible (byte ou char). Un int, codé sur 2 octets, et un long sur 4 octets, peuvent voir leur second octet modifié alors qu'une seconde interruption modifie le premier. Résultat indéfini. Et ta variable MesIndex pointe vers des tableaux...

Peut-être que ton erreur vient de là.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.