Acquisition d'une valeur à fréquence donnée

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 :slight_smile:
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 :slight_smile:

Bonjour,

Regarde du côté de Flexitimer2.

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().

void loop() {
  const unsigned long PERIODE=20;
  static unsigned long nextTime=millis();
  if (millis()-nextTime>= PERIODE)
  {
    nextTime+=PERIODE;

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

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

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.

C'est vrai - tout dépend du degré de précision attendu et des besoins en resources potentiellement utilisées par d'autres librairies

fdufnews:
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.

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 :slight_smile:

Merci.

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)

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

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).

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

il y a plusieurs solutions, à voir en fonction ensuite des contraintes comment implémenter cela au mieux

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

Ok - donc effectivement pas de soucis