Go Down

Topic: Acquisition d'une valeur à fréquence donnée (Read 1 time) previous topic - next topic

ojal

Bonjour,

Je souhaite faire l'acquisition d'une valeur de tension à une fréquence jusqu'à 50 fois par seconde, donc 50Hz.
Le temps mis par le convertisseur semble être de 100us. Ceci ne devrait donc pas pauser de problème :)
Plutôt que de faire les acquisitions dans la boucle loop en essayant de régler la fréquence avec un delay(), j'aurais souhaité déclencher les acquisitions à intervalle constant. Si j'ai bien compris, je vais devoir utiliser les interruptions?
Suis-je sur la bonne piste? Pouvez-vous m'aider à mettre en place les interruptions le cas échéant?

Merci par avance pour votre aide :)

3Sigma

Bonjour,

Regarde du côté de Flexitimer2.

kamill

#2
Jan 20, 2017, 08:44 am Last Edit: Jan 20, 2017, 08:50 am by kamill
Bonjour,

Tu peux effectivement utiliser une interruption timer (Flexitimer2 proposé par 3Sigma simplifie l'implémentation), mais tu peux aussi faire l'acquisition dans la loop() et la cadencer avec la fonction millis().
Code: [Select]
void loop() {
  const unsigned long PERIODE=20;
  static unsigned long nextTime=millis();
  if (millis()-nextTime>= PERIODE)
  {
    nextTime+=PERIODE;

    // ------ faire l'acquisition ici -----
   
  }
}

J-M-L

50Hz c'est suffisamment lent - si votre loop() ne fait pas bien sûr des trucs délirants - pour être traité comme le propose kamill. ça permet de conserver les timers pour des trucs plus compliqués qui ont besoin de plus de rapidité comme tone() ou gérer un servo etc. Donc c'est une bonne technique  connaître et facilement duplicable si vous avez dans la loop plusieurs événements asynchrones à gérer
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

fdufnews

L'utilisation d'un timer pour rythmer l'acquisition introduit moins de jitter sur les échantillons que l'utilisation de millis() dans loop(). Dans le cas de millis(), le jitter vaut "un tour de loop()" alors qu'avec le timer il est réduit au temps d'exécution d'une instruction (pour autant qu'aucune partie du code ne masque les IT).
Le choix de la méthode dépend donc de l'application.

J-M-L

C'est vrai - tout dépend du degré de précision attendu et des besoins en resources potentiellement utilisées par d'autres librairies
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

kamill

#6
Jan 20, 2017, 09:43 am Last Edit: Jan 20, 2017, 09:58 am by kamill
L'utilisation d'un timer pour rythmer l'acquisition introduit moins de jitter sur les échantillons que l'utilisation de millis() dans loop().
Oui, mais le traitement en interruption pose d'autres problèmes, comme la synchronisation avec le programme principal. Par exemple si on veut enregistrer les valeurs acquises sur une carte sd, il faut mettre en oeuvre un système de flags ou mieux une file d'attente pour être sur d'enregistrer toutes les mesures sans enregistrer plusieurs fois la même.
Sans parler des traitements d'interruption plus ou moins long qui risquent de perturber le système.

ojal

Bonjour,

Merci à tous pour vos contributions toutes pertinentes.
Dans mon cas, ou avec ce script, je ne vais faire que de l'acquisition, la proposition de kamill devrait en effet répondre au besoin... Même si j'ai un peu de jitter, çà ne devrait pas être pénalisant, je ne me rends pas encore compte de la grandeur de ce jitter...
Je souhaite en effet enregistrer les données sur une carte SD, aussi je n'avais pas imaginé qu'avec une interruption, il faudrait prendre quelques précautions particulières...
Je fais les essais et vous tiendrai au courant :)

Merci.

J-M-L

#8
Jan 20, 2017, 06:01 pm Last Edit: Jan 20, 2017, 06:02 pm by J-M-L
Dans une interruption vous ne pouvez pas (par défaut) avoir d'autres interruptions - ça perturbe donc toutes les fonctions ou librairies qui sont dépendantes des interruptions - c'est pour cela qu'il faut limiter au strict minimum le travail effectué dans l'ISR (ne pas envisager d'écrire sur la carte SD par exemple dans l'interruption)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

J-M-L

Quote
Le retard accumulé peut être rattrapé plus tard.
Oui à condition que ce ne soit pas de l'enregistrement continu - hors ici il parle de 50Hz sans plus de précisions sur la durée. Si c'est en continu alors il s'agit donc de s'assurer que tout le traitement tient largement dans les 20ms, 19 pour être à l'aise par exemple. Sinon buffer ou pas le retard va s'accumuler et des données finiront par être perdues
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

kamill

#10
Jan 21, 2017, 11:17 am Last Edit: Jan 21, 2017, 11:17 am by kamill
Bonjour _pepe_,

J'ai dis que l'utilisation des interruptions posait quelques problèmes. Je n'ai pas dis qu'il n'y avait pas de solutions  :), d'ailleurs je parle de file d'attente (que tu appelles tampon circulaire).

J-M-L

je crois qu'on est tous d'accord :)

il y a plusieurs solutions, à voir en fonction ensuite des contraintes comment implémenter cela au mieux
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

J-M-L

Il me semble que la librairie SD joue avec les interruptions et effectue des écritures atomiques. Donc si vous avez un gros buffer écrire, pendant que vous l'écrivez, vous pouvez rater des enregistrements

ça fait un moment que je n'ai pas regardé le détail de la lib

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up