Go Down

Topic: Nombre de timer en tache de fond (Read 364 times) previous topic - next topic

Gismoleraton

Bonjour à tous,

J'ai réalisé une machine sur base d'un automate Siemens ( Logo ) qui gère des pompes pendant un temps '' T'' demandé. jusque 20 pompes sont donc pilotable pendant un temps déterminer suivant les instruction nécesssaire.



Le prototype étant fini mais coûteux  .... je voudrais passer sur Arduino et carte relais pour alléger le coût de fabrication .

L'Arduino doit pouvoir piloter 20 pompes sur un timer  ( donc 20 sorties I/O ) et quelques entrées I/O ( 10 max ) ainsi qu'un écran lcd .

Est il possible de contrôler  des timers au 1/10 de seconde avec des temps différent  en tache de fond   sans bloquer le programme principal pendant l'écoulement des timers .

Je souhaite partir sur le Arduino Méga 2560 qui semble convenir à mon application .

Merci de vos retours


J'ai aussi besoin de contrôler un afficheur LCD et quelques boutons en entrée ( 10 max )


J-M-L

#1
Jul 08, 2018, 04:06 pm Last Edit: Jul 08, 2018, 04:07 pm by J-M-L
Quote
Est il possible de contrôler  des timers au 1/10 de seconde avec des temps différent  en tache de fond   sans bloquer le programme principal pendant l'écoulement des timers .
Il faut préciser ce que vous voulez dire par là... il n'y a qu'un seul processeur donc globalement quand vous faites un truc (allumer ou éteindre un relai par exemple), vous ne faites pas autre chose (tester une durée écoulée par exemple ou gérer les boutons ou votre LCD).

Sur les arduinos vous n'avez pas 20 timers matériels programmables, donc il faudra partager le temps et les resources, mais tenir le 10eme de seconde se fait sans aucun soucis à 16MHz (bien sûr tout dépend de ce que doit faire le processeur le reste du temps et comment c'est programmé). Donc à priori le mega peut répondre à vos attentes, dites nous en plus sur ce que doit faire le programme cependant  pour confirmer
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

Gismoleraton

BOnjour à vous deux,

Pour êtres plus précis dans ma demande,  Je dois mélanger différent ingrédient liquide sans passer par des débimètres pour supprimer au maximum le risque de contamination .

Je dois par exemple injecter un liquide pendant X seconde pour avoir 8cl , un second liquide pendant Y seconde pour avoir 10cl  et par exemple un troisième liquide pendant Z secondes pour avoir 15cl .
 Les trois pompes doivent démarrer en même temps mais après X seconde la première pompe se coupe pendant que les deux autres continues, à Y seconde ( 2 seconde plus tard sur X ) la deuxième pompe se coupe et ensuite 5 secondes plus tard la pompe Z se coupe ( 5 secondes plus tard sur Y )

En gros lorsque j'appelle  3, 4, 5 .... ou même 10 liquides en même temps donc 10 pompes à lancer , je lance les 10 timers en même temps et quand un timer est arrivé à échéance il coupe la sortie assigné

Après avoir mis une sortie  a 1 et lancé un timer, vous sous entendez alors que le programme ne tourne plus temps que le ou les  timers ne sont pas arrivés à échéance ( écouler ) ?
Pendant la gestion des timers, l' Arduino a rien de spéciale à faire sauf passer la sortie assigner au timer à zéro quand le compteur est fini . Une fois tous les timers à zéro, l ' Arduino retourne dans le programme principal et attend d'autres instruction de l'opérateur

J'espère que mes informations sont compréhensibles ...




supercc

Bonjour,

il peut être pratique d'utiliser une bibliothèque genre MsTimer2 configurant le timer 2 et l'interruption associée simplement.

L'idée est de définir une tache périodique de période par exemple 10 ms. Cette unique tache périodique gérera toutes les pompes. Elle pourra par exemple parcourir un tableau d'entiers où chaque entier i contient le temps restant (en 1/100 s puisque période de 10 ms) à activer la pompe n°i. Si l'entier est différent de 0 la routine active la pompe et décrémente l'entier. Si l'entier vaut 0 elle désactive la pompe.

Lorsque tous les entiers du tableau sont à 0 toutes les pompes ont fini et on peut recommencer (à remplir de nouveau le tableau d'entiers avec des temps en 1/100 s)...

En utilisant une tache périodique (idem fonction d'interruption) le temps est précis et le programme principal reste libre de faire autre chose, ou simplement attendre que toutes les valeurs du tableau soient égales à 0.

J-M-L

bof, même pas besoin du timer.. vous laissez tourner la loop() et vérifiez à chaque tour de loop ce qu'il en est..et
au lieu de mettre à jour le tableau d'entier à chaque tour vous stockez simplement dans le tableau le "millis()" (si ce sont des temps courts, sans dérive forte possible) du déclenchement et quand il est passé vous déclenchez et mettez l'entrée du tableau à 0

la loop fait alors aussi le reste.

si vraiment la loop est longue alors oui, partir sur des interruptions
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