Accéléromètre - Mesure de temps

Bonjour à tous,

Je travaille sur un projet dans lequel je dois réaliser une mesure du temps de cycle d'un piston. Ce tems correspond au delta t entre l'impultion électrique de commande (échelon 24 VDC) et l'arrivée du piston en butée mécanique.
Je mesure l'instant t d'arrivée en butée du piston à l'aide d'un accéléromètre captant les vibrations dûent au choc en butée.

J'ai dans un premier temps réalisé l'acquisition à l'aide d'un accéléromètre industriel KISTLER 8286A30 (cf. datasheet jointe) et d'un oscilloscope, ma mesure du temps de cycle vaut 10 ms.

Dans un second temps, j'ai passé la manipulation sur Arduino Uno et utilisé un accéléromètre ADXL345 (cf. datasheet jointe). Ma mesure du temps de cycle vaut 50 ms.

Voici une partie du code que j'utilise pour réaliser ma mesure :

#include <SparkFun_ADXL345.h>         // SparkFun ADXL345 Library

ADXL345 adxl = ADXL345();             // USE FOR I2C COMMUNICATION


/******************** SETUP ********************/
/*          Configure ADXL345 Settings         */
void setup(){
  
  Serial.begin(115200);                 // Start the serial terminal
  
  pinMode(bouton, INPUT);
    
  adxl.powerOn();                     // Power on the ADXL345

  adxl.set_bw(1111);                 // Banndwidth settings // Bandwidth = 1600 Hz

  adxl.setRangeSetting(16);       // Give the range settings
                                               // Accepted values are 2g, 4g, 8g or 16g
                                               
  adxl.setTapDetectionOnXYZ(0, 0, 1); // Detect taps in the directions turned  ON "adxl.setTapDetectionOnX(X, Y, Z);" (1 == ON, 0 == OFF)
 
  // Set values for what is considered a TAP (0-255)
  adxl.setTapThreshold(16);           // 62.5 mg per increment - Threshold 
  adxl.setTapDuration(3);             // 625 μs per increment - Contains an unsigned Time Value representing the Max Time that an Event must be Above the THRESH_TAP Threshold to qualify as a Tap Event 

attachInterrupt(2, Appel_Interruption, RISING);

} 


/****************** MAIN CODE ******************/
/*     Accelerometer Readings and Interrupt    */
void loop(){

ADXL_ISR()

  }

/***************INTERRUPTION********************/

  void Appel_Interruption() {
  unsigned long top;
  top = millis();
  } 


/********************* ISR *********************/
  /* Look for Interrupts and Triggered Action    */
  void ADXL_ISR() {

  volatile long Cycle_time = 0;
  unsigned long Shock;
  
   byte interrupts = adxl.getInterruptSource();
  
    // Tap Detection
    if(adxl.triggered(interrupts, ADXL345_SINGLE_TAP)){
    Serial.println("*** SHOCK ***");
   
      Shock = millis();  
      Cycle_time=Shock-top;
          
      } 
}

J'associe à "top" l'instant t où l'échelon de 24VDC est envoyé et à "Shock" l'instant t où le choc est capté par le capteur. Je réalise ensuite "Cycle_time = Shock-top".

Sachant qu'en réalité, la bonne valeur du temps de cycle vaut 10 ms, je ne comprend pas pourquoi je mesure 50 ms avec Arduino.

Pouvez-vous m'aider ?

Merci :slight_smile:

KISTLER 8286A30.pdf (74.2 KB)

ADXL345.pdf (801 KB)

Sans regarder en détail:

Dans votre interruption top n'est pas déclaré volatile, le compilateur peut faire des optimisations non souhaitables et millis() n'est pas maintenu à jour dans les interruptions. vaut mieux utiliser micros()

Mais pire top est déclarée en variable locale... donc pas dispo dans la loop().. donc guère de chances que cela soit réglo...
    Cycle_time = Shock - top;dans la loop()... si ça compile c'est que top existe par ailleurs...

ça c'est pas une bonne idée

    Serial.println("*** SHOCK ***");
    Shock = millis();

car vous perdez dans le mesure le temps d'appel à la fonction Serial.println(). au moins inversez les 2.

je suppose que votre front 24V arrive sur la pin 2. qu'avez vous mis pour ramener ça à 5V? est-ce que ça monte instantanément?