Arduino Forum

International => Français => Topic started by: bouskap on Mar 08, 2013, 03:42 pm

Title: Compter des pulses à environ 200 khz
Post by: bouskap on Mar 08, 2013, 03:42 pm
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
Title: Re: Compter des pulses à environ 200 khz
Post by: B@tto on Mar 08, 2013, 03:55 pm
200 khz vs 16 µC à mhz ==> c'est ton code qui n'est pas bon
Title: Re: Compter des pulses à environ 200 khz
Post by: bouskap on Mar 08, 2013, 04:09 pm
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?
Title: Re: Compter des pulses à environ 200 khz
Post by: jfs on Mar 08, 2013, 04:31 pm

Je ne vois pac comment améliorer mon code.


Nous non plus, puisqu'on le voit pas  XD
Title: Re: Compter des pulses à environ 200 khz
Post by: tonyryu on Mar 08, 2013, 04:49 pm
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
Title: Re: Compter des pulses à environ 200 khz
Post by: bouskap on Mar 08, 2013, 05:05 pm
Code: [Select]
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);  
      }
 }
}
Title: Re: Compter des pulses à environ 200 khz
Post by: bouskap on Mar 08, 2013, 05:08 pm
Ma fonction add() compte également la durée des trains de pulse. Normalement l'état bas est à 0 et le haut à 1V.
Title: Re: Compter des pulses à environ 200 khz
Post by: Artouste on Mar 08, 2013, 05:48 pm

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
Title: Re: Compter des pulses à environ 200 khz
Post by: jfs on Mar 08, 2013, 06:04 pm
Pour la prochaine fois, le code à mettre dans les balises avec le bouton #
Title: Re: Compter des pulses à environ 200 khz
Post by: JMe87 on Mar 08, 2013, 06:47 pm
Bonsoir,
je ne sais pas ce que
Quote
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
Title: Re: Compter des pulses à environ 200 khz
Post by: tonyryu on Mar 08, 2013, 06:56 pm
si effectivement l'état haut est à 1V, faut pas chercher plus loin.
Title: Re: Compter des pulses à environ 200 khz
Post by: fdufnews on Mar 08, 2013, 08:21 pm
Il doit y avoir une solution en utilisant l'entrée externe d'un timer.
Je vais chercher un peu
Title: Re: Compter des pulses à environ 200 khz
Post by: Artouste on Mar 08, 2013, 09:53 pm

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  :smiley-mr-green:
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)



Title: Re: Compter des pulses à environ 200 khz
Post by: bouskap on Mar 08, 2013, 10:29 pm
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!
Title: Re: Compter des pulses à environ 200 khz
Post by: skywodd on Mar 09, 2013, 03:23 pm
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 ;)
Title: Re: Compter des pulses à environ 200 khz
Post by: fdufnews on Mar 09, 2013, 06:44 pm
Tu devrais regarder là:
http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/ (http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/)