Go Down

Topic: Compter des pulses à environ 200 khz (Read 3597 times) previous topic - next topic

bouskap

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

B@tto

200 khz vs 16 µC à mhz ==> c'est ton code qui n'est pas bon
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

bouskap

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?

jfs

#3
Mar 08, 2013, 04:31 pm Last Edit: Mar 08, 2013, 04:53 pm by Jean-François Reason: 1

Je ne vois pac comment améliorer mon code.


Nous non plus, puisqu'on le voit pas  XD
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

tonyryu

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

bouskap

#5
Mar 08, 2013, 05:05 pm Last Edit: Mar 08, 2013, 06:03 pm by Jean-François Reason: 1
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);  
      }
 }
}

bouskap

#6
Mar 08, 2013, 05:08 pm Last Edit: Mar 08, 2013, 05:16 pm by bouskap Reason: 1
Ma fonction add() compte également la durée des trains de pulse. Normalement l'état bas est à 0 et le haut à 1V.

Artouste


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

jfs

Pour la prochaine fois, le code à mettre dans les balises avec le bouton #
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

JMe87

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

tonyryu

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

fdufnews

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

Artouste


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)




bouskap

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!

skywodd

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 ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up