Détection de front pour un signal a fréquence variable

salut tout le monde,

je bidouille actuellement un capteur de couple dont la réponse ressemble à sa ( voir fichier en pièce jointe).

Pour interroger le capteur, il faut lui appliquer un trigger ( niveau Bas pendant 9µs ), et ensuite sur la même voie, lire la réponse du capteur.

il est donc nécessaire d’être en “OUTPUT” pour appliquer le trigger, et passer en “INPUT” pour lire la réponse du capteur. le Trigger est appliqué toutes 1 ms.

voici le code qui me permet de réaliser tous sa :

#define Trigger 10
void setup()
{
  Serial.begin (115200);
  // initialize timer1
  noInterrupts();           
  TCCR3A = 0;
  TCCR3B = 0;
  TCNT3  = 0;

  OCR3A = 60;            // interrupt every 1 ms
  TCCR3B |= (1 << WGM12);   // CTC mode
  TCCR3B |= (1 << CS12);   
  TIMSK3 |= (1 << OCIE1A);  // 
  interrupts();             // 
}

/*Trigger*/

ISR(TIMER3_COMPA_vect)          // interrupt fonction
{
  DDRB = (1 << DDB4); //Pin 10 en mode OUTPUT
  PORTB = (0 << PORTB4); // Pin 10 à 0
  delayMicroseconds(9); // temps a l'état bas du trigger
  PORTB = (1 << PORTB4); // Pin 10 à 1

  // PASSEAGE EN INPUT POUR LIRE LA REPONSE DU CAPTEUR
  DDRB = ( 0 << DDB4); // Pin 10 en entrée et attente de la réponse capteur
  PORTB = (0 << PORTB4); // Pin 10 à 0
}

void loop()
{
  


}

ce qui fonctionne très bien.

Mon problème est que la réponse du capteur est codé sur la durée des impulsions. et je n’arrive pas à détecter les changements d’état. les Impulsions mettent moins de 20µs au niveau bas, et entre 36µs et 156µs à l’été haut. ( la fréquence du signal est donc variable )

les fonctions pulseIn, digitalRead, etc étant trop lentes, je me suis tournée vers les registres sans trouver réelles de solutions.

je me retourne alors vers vous pour avoir une idée d’algorithme qui pourrait m’aider.

Cordialement.

Voici la réponse du capteur.

pour plus d'info :
pulse 1 : dure 156µs est identique a chaque trigger
pulse 2 à 7: dure entre 12 et 81 µs

la réponse du capteur est codé sur les pulse de 3 à 6. chaque pulse équivalent à registre 4 bit, la réponse total étant codé sur 16bits.

petit précision : si la durée de la pulse est de 36 µs le registre contient 0x0 et si la durée de la pulse est de 81 µs alors le registre contient 0xF

Après avoir lancé le trigger, activer une interruption sur le front descendant du signal, dans l'ISR relever la valeur de micros() et la placer dans un tableau à la dernière impulsion reçue, masquer les interruptions, lever un drapeau qui sera testé dans loop et qui lancera le calcul de la durée des impulsions.

fdufnews: activer une interruption sur le front descendant du signal,

Justement, il se trouve la le pb, je n'arrive a detecter aucun front !

fdufnews:
dans l’ISR relever la valeur de micros() et la placer dans un tableau
à la dernière impulsion reçue, masquer les interruptions, lever un drapeau qui sera testé dans loop et qui lancera le calcul de la durée des impulsions.

une truc de ce genre ?? :

ISR(TIMER1_CAPT_vect)
{
  uint16_t capture = micros();
  if ( NbCapture < 7 )
    Capture[NbCapture++] = capture;
}

j’ai jamais utiliser de drapeau (“Flag” ), t’aurai un lien qui explique l’utilité, et comment s’en servir ?

un "flag" c'est un un booléen que tu positionnes à False dans le setup. L'ISR le met à True après la réception de la 7ème impulsions Dans loop tu testes l'arrivée de ce booléen lorsqu'il est vrai, tu fais les calculs sur le contenu du tableau, tu remets le booléen à False et tu lances le trigger suivant.

tu pourrai faire un bout de code pour que je comprenne mieux parce je t’avoue que je suis perdu dans tous sa :frowning: :confused: . j’ai tester pas mal de trucs sans succès et la sa sort de mon champs de compréhension. et j’aimerai bien y remédier !