Arduino - probleme compteur double

Salut à tous,
me re-re-re voilà pour mon soucis de programme qui mesure le dephasage de 2 arbres tournants.

@dfgh si tu me lis :slight_smile:

pensant que mon affaire etait reglé j'ai testé le programme avec un arbre qui ne se dephase pas et là je trouve une valeur de 8° à 2000 trs/min

je ré-explique le truc pour ceux qui ne connaissent pas mes aventures.

j'ai un capteur optique en bas de l'arbre, il mesure la vitesse de l'arbre et il va aussi servir de reference pour mesurer le dephasage avec l'arbre du haut.
l'arbre du haut et lui un interrupteur qui s'ouvre et se ferme 4 fois pendant un tour, et je compare le temps entre un top en haut et un top en bas.

dans mon cas present à 400trs/min je dois avoir un temps calculé entre les tops du haut et du bas, ok.

j'accelere la rotation de l'arbre et j'ai donc un temps qui reduit mais qui est calculé en angle proportionellement à l'angle de rotation et qui est censé donner un angle de decalage similaire que ce soit à 400 trs comme à 2000.

hors entre 400 et 2000 j'ai 8° d'ecart .... à quoi serait-ce dû ?

le temps du calcul ? un mauvais calcul ? un probleme d'ordre dans le programme ?
faudrait t'il que j'utilise plutot 2 capteurs optiques ?
est-ce parce que j'utilise 2 interruptions et que celle de la borne 2 est prioritaire ?

j'ai vu que ça jouait, j'ai fait pleins de tests et il ne me reste plus beaucoup de cheveux ... alors je reviens vers vous :slight_smile:

vous pourriez m'aider ?

//potard sur a0 broche centrale
//les 2 autre pin sur 5v et ground
//sabertooth port S1 sur 8 arduino
//moteur sur m1a et m1b
//0v sabertooth sur ground

//RUPTEUR ET OUTPUT
//UN FIL SUR BORNE 2
//UN FIL SUR 5V

//capteur optique ET INPUT
//D0 SUR BORNE 3

//capteur optique si input_pullup
//UN FIL SUR BORNE 2
//UN FIL SUR gnd


//commande moteur
const int potar = A0;  //la broche pour régler la vitesse


//rupteur
const byte PIN_SIGNAL = 2; 
volatile unsigned long last_micros;

//optique
const byte PIN_SIGNAL1 = 3;
unsigned long periode2 = 0;
unsigned long periode3 = 0;
volatile unsigned long last_micros1;

//dephasage
float dephasage = 0;


//COMMUN DEBOUNCING TIME
long debouncing_time = 15; //Debouncing Time in Milliseconds

//angle came
int buttonState = 0;
int lastButtonState = 0;
long temps_total = 0;
int angle2 = 0;
int angle4 = 0;
int angle6 = 0;
int angle8 = 0;
const int angle_total = 360;
long p1 = 0;
long p2 = 0;
long p3 = 0;
long p4 = 0;
long p5 = 0;
long p6 = 0;
long p7 = 0;
long p8 = 0;
int compteur =0;

volatile byte compteur_ticks   = 0;
volatile byte compteur_optique = 0;
//unsigned long  previousMicros  = 0;
//unsigned long  previousMicros1 = 0;
float periode=0;
float periode1=0;
float  vitesse1=0;
float  vitesse2=0;
float  vitesse3=0;
void debounceInterrupt1() {compteur_optique++;}
//void debounceInterrupt()  {compteur  ++;}
unsigned long  previousMicros  = micros();
unsigned long  previousMicros1 = micros();
unsigned long  fin_rupteur     = 0;
unsigned long  fin_opto        = 0;
float  delta           = 0;

/** Fonction setup() */

void tick() {
  

fin_rupteur = micros();
 
   
}


void debounceInterrupt() {
  if((long)(micros() - last_micros) >= debouncing_time*100) {
    tick();
    last_micros = micros();
  }
}

void setup () {

     Serial.begin(115200);
    
  pinMode(PIN_SIGNAL, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL), debounceInterrupt, FALLING);  
pinMode(PIN_SIGNAL1, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL1), debounceInterrupt1, FALLING);  

}

void loop() {
  int vitesse = analogRead(potar);


  periode2 = pulseIn(PIN_SIGNAL1, LOW, 1000000);
  periode3 = pulseIn(PIN_SIGNAL1, HIGH, 1000000);
     Serial.print("vitesse optique ");
vitesse1 = 60000000 / (periode2+periode3);
  Serial.println(vitesse1);
  
 
 
   if (compteur_optique >= 1)
  {
    if (fin_rupteur > 0) 
    {
      fin_opto = micros();
    }        
      periode1 = micros() - previousMicros1;
    previousMicros1 = micros();
    compteur_optique = 0;
  }
  if (fin_opto > 0 )
  {
    delta = fin_opto - fin_rupteur;
     fin_rupteur = 0;
    fin_opto = 0;
  }
  
   if (( (vitesse1>1) && (vitesse1<500) ))
  {
    vitesse2 = ((delta/1000000)*360)/(1/(vitesse1/60));;
    Serial.print("vitesse2 ");
    Serial.println(vitesse2);         
  }
  
Serial.print("delta ");
Serial.println(((delta/1000000)*360)/(1/(vitesse1/60)) - vitesse2);
   Serial.println(" ");

    delay(300);
   
     
      }

ah tres bien ce que tu me dis là !!

je pensais à mettre un coeff de correction ou simplement de jouer sur le debouncing time mais il n'est pas lié à la vitesse

du coup je pense tenter de me faire un montage avec 2 capteurs optiques pour tester

demain je pense regarder de plus pres ce qu'il se passe sur toutes les valeurs brutes pour comprendre le phenomene

merci, je tente de donner des news rapidement