Compter des pulses à environ 200 khz

Bonjour à tous,

J'ai un petit soucis, je dois compter des pulses sur deux secondes qui arrivent à environ 200 khz. A l'aide d'un Arduino uno et d'une interruption, je n'arrive pas à compter tous les pulses (en gros je dois être limité à 40 khz, du coup il m'en manque beaucoup...)

Je ne sais pas si je peux continuer avec l'Arduino et le coupler avec un compteur par exemple (je ne sais pas quoi prendre - ?synchrone 32 bits?), ou prendre quelque chose de plus puissant?

Merci d'avance pour votre aide

Cordialement

200 khz vs 16 µC à mhz ==> c'est ton code qui n'est pas bon

J'ai utilisé attachInterrupt(0, add, RISING) et dans add() j'ai juste un compteur++;
Je ne vois pac comment améliorer mon code.

Peut être une idée?

bouskap:
Je ne vois pac comment améliorer mon code.

Nous non plus, puisqu'on le voit pas XD

Il faut également être sur que la tension envoyé vers la Pin permettant l'interruption est assez élevé pour déclencher un état haut ou suffisement basse pour déclencher un état bas. à 200 kHz, il est possible d'avoir besoin de filtrer le signal à l'aide de composant afin de qu'il soit bien détecté par le type de déclenchement RISING

volatile long pulses=0;
volatile long time=0;
volatile long timeold=0;
volatile long total=0;
int Pin = 2;    //Localisation pulse sur Arduino
boolean new = false;

void add () 
{ 
  pulses++; 
  time = millis(); 

  if( (time - timeold) > 500)
    {
      new = true; // Mise en place d'un nouveau train d'ondes
    }
  else if (new == true)
    {
      new = false;
      total += time - timeold; 
    }
  else
    {
      total += time - timeold; 
    }
    
  timeold = time; 
}


void setup()  
{ 
  pinMode(Pin, INPUT);
  attachInterrupt(0, add, RISING); 
  Serial.begin(9600);
} 

void loop ()
{
  if(Serial.available() > 0)
  {   
       char char = Serial.read(); 

       if(char ==1 ) 
       {
        Serial.print(pulses);  
       }
  } 
}

Ma fonction add() compte également la durée des trains de pulse. Normalement l'état bas est à 0 et le haut à 1V.

bouskap:
Ma fonction add() compte également la durée des trains de pulse. Normalement l'état bas est à 0 et le haut à 1V.
bonsoir

je ne sais pas ce que tu compte, mais 1V pour un etat haut ça me semble leger

Pour la prochaine fois, le code à mettre dans les balises avec le bouton #

Bonsoir,
je ne sais pas ce que

200 khz vs 16 µC à mhz ==>

veut dire mais pour moi :

Clock 16MHz / 200KHz cela fait 80 cycles en moyenne pour gerer une interruption et avancer un petit peu dans la boucle principale.

Vu l'optimisation du code compile Arduino, ce n'est pas beaucoup.

Pourquoi ne pas utiliser un pre-diviseur hardware. Par exemple un CD4060 permettrait toutes les experimentations voulues.

Mais il faut d'abord eclaicir ce niveau haut a 1V !!

Jacques

si effectivement l'état haut est à 1V, faut pas chercher plus loin.

Il doit y avoir une solution en utilisant l'entrée externe d'un timer.
Je vais chercher un peu

fdufnews:
Il doit y avoir une solution en utilisant l'entrée externe d'un timer.
Je vais chercher un peu

Bonsoir Fdufnews
Dans le meme ordre d'idée, j'avais réalisé juste pour le fun la joie :grin:
un fréquencemètre ~50 MhZ qui tournait de mémoire sur un PIC 16F (16 ou 20 Mhz en clock horloge) avec affichage LCD
reste quand même ce niveau high=1V à éclaircir 8)

Merci beaucoup pour vos aides! Je vais vérifier que la tension est bien de 1volt car je ne suis plus sur, je pourrais seulement faire mes mesures lundi. Mais je dois me tromper, car c'est vrai qu'un volt n'est pas suffisant!

Bonjour,

Humm 200KHz ... ça fait 16 000 000 / 200 000 = 80 cycles d'horloge maximum par interruption.
Si on compte juste la sauvegarde et la restauration du contexte d'exécution en entrant / sortant de l'interruption ça fait déjà quasiment les 80 cycles !
À une telle fréquence ton code n'est donc pas viable.

Ce qu'il te faut c'est (au choix) :

  • un timer en mode comptage d'impulsions + interruption cyclique à un intervalle défini (principe des tachymètres)
  • un timer en mode comptage interne avec déclenchement/arret sur une broche externe (dont tu lit la valeur de temps en temps)
    Dans les deux cas c'est bien au delà de la simple programmation "arduino", il te faudra mettre le nez dans la doc et les registres de l'ATmega328p :wink:

Tu devrais regarder là:
http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/