Génération de deux signaux carrés avec contrôle de fréquence et de déphasage.

Bonjour tout le monde,

Je suis actuellement sur un projet à l'aide d'un arduino Uno et son shield LCD ( bouton compris ) permettant de générer deux signaux carré et en choisissant ( en temps réel ou non ) à l'aide des boutons présent sur le LCD la fréquence et le déphasages des carrés.
L'ordre des fréquence serait de 0.1Hz à 10 Hz par pas de 0.1Hz.
Pour le moment j'ai effectuer un code me permettant de choisir la fréquence et le déphasage et de l'afficher sur le LCD ainsi que le création d'une fonction créant les deux signaux carrés à l'aide de millis(); mais pour le moment je n'arrive pas à implémenter ma fonction de création des deux signaux carré dans le code principale...
Si quelqu'un à quelques pistes et d'aides à m'accorder ce serait super :slight_smile: .

Merci beaucoup
Je met mon code en attachments.

Test_LCD_BP.ino (7.8 KB)

Ton code est très complexe et difficile à lire. Essaye de le simplifier.

Par exemple, ceci

      if (mot_lig==0)
      {
        mot_lig=1;
      }
      else
      {
        mot_lig=0;
      }

est équivalent à

mot_lig = 1 - mot_lig;

Ta loop fait beaucoup de choses, ce qui la rend difficile à comprendre. Lorsque tu as des blocs d'instructions (comme ton switch et ses options) qui sont terminés et vérifiés, fais-en des fonctions que tu appelleras depuis la loop. Elle sera alors plus simple à lire.

Après, tu pourras facilement y ajouter la création des deux signaux.

Mais je vois des delay dans ton code : ils vont ralentir énormément l'exécution et tu ne pourras plus faire des créneaux précis. 10 Hz suppose de pouvoir changer d'état toutes les 100 ms. Si tu as des delay(300), c'est déjà impossible...

Je pense que tu devrais revoir l'architecture du code en le pensant comme une machine à états. Il y a des tutos sur le forum (voir section tutos)

Merci du conseil je prends note ! Par contre je n'ai pas trop d'idée sur comment effectué le déphasage....

Chapo55:
Merci du conseil je prends note ! Par contre je n'ai pas trop d'idée sur comment effectué le déphasage....

Bonjour
Qu'est ce que tu entend "exactement" là par la notion/terme de déphasage ? , s'agissant ici de 2 sorties produisant des signaux électriques carrés :wink:

Bonjour,
Par exemple je génère mon 1er signal carré à l'instant t=0 mais je souhaite que mon 2eme signal carré prenne du retard ou de l'avance par avance à ce signal.
Si je souhaite réaliser une opposition de phase cela ne pose pas de souci mais c'est lorsque je souhaite réaliser un retard de pi/2 par exemple que ça pose problème pour moi...
En gros pour résumé...: Comment faire pour effectuer un retard de T/2 ( par exemple ) d'un signal par rapport à l'autre sans l'utilisation de delay.

J'espère que j'ai été claire ah ah

Cette question est souvent centrale quand on écrit un code sur Arduino : comment faire cohabiter plusieurs tâches avec des contextes temporels différents ? Dans ton cas : lecture des potards, affichage LCD, génération de deux signaux sur deux sorties différentes.

Je te conseille de lire les liens du premier message de cette discussion, tu y apprendras les bases pour savoir faire ça.

Et oui je suis totalement d'accord avec toi :slight_smile:
bon...pour info j'ai eu un éclair de génie ( ou pas ah ah ) et j'ai réussi à trouver où implémenter ma fonction de géneration des 2 signaux carrés en temps réél dans mon code, qui n'est pas très clair je vous l'accorde.....
C'était vraiment très simple mais à vrai dire je n'avais vraiment pas eu le temps d'y travailler à tête reposé, bcp de travail en se moment...lorsque j'aurais "finis" mon code avec le problème de déphasage résolu je mettrai en PJ mon code :slight_smile:
Si qqun à une idée pour le déphasage je suis preneur :confused:
En parallele je vais regardé ce que l'on m'a déjà proposé !

Merci pour tout les gens !

Le déphasage c'est un retard du second signal par rapport au premier, d'une valeur variant entre 0 et ta période T. Lorsque tu passes le premier signal à HIGH, tu inities un "chrono":

unsigned long chronoDephasage = millis();

Puis tu testes si le temps écoulé depuis ce lancement dépasse la valeur du déphasage :

if (millis() - chronoDephasage > dureeDephasage) {
// passage du second signal à HIGH
}

Dis comme ça, c'est pas sorcier, mais selon ton code (difficile à lire, donc je ne vais pas fouiller dedans) tu peux avoir à jouer avec certains détails (variable chrono globale plutôt que locale, etc)

Mais surtout, surtout : vire ces delay qui t'empêchent de générer des signaux propres...

Si qqun à une idée pour le déphasage je suis preneur

peut être une autre approche :

A la base : faire tourner un compteur modulo 360 (angle de phase)
Sut la base de ce compteur unique poser des conditions définissant l'état haut ou bas de l'un et l'autre des 2 signaux

la fréquencecommune des deux signaux serait déterminée par vitesse de 'rotation' de la phase, la cadence d'incrémentation du compteur 'angle de phase'

Je pense que ça doit être possible de faire ça simplement avec la bibliothèque de Bricoleau

D'accord, merci à tous c'est gentil de me faire part de vos remarques! Je vais avancé un peu sur mon code et je vous retiens au courant !