Aide pour code générateur de pulsations

Bonjour a tous,

Je cherche quelqu’un qui pourrait écrire(j'imagine très facilement) un code complet prêt a téléversé pour réalisé une séquence de 3 cycles qui boucle comme cela :
début de la boucle
-premier cycle temps total=1ms
niveau haut 5v pendant 0.02ms
niveau bas 0v pendant 0.02ms
(donc une période de 0.04ms avec un duty cycle de 50%)
répété 25x cette période(cycle de 1ms)
-pause(0v) de 15ms
-2eme cycle identique au premier
niveau haut 5v pendant 0.02ms
niveau bas 0v pendant 0.02ms
répété 25x cette période(cycle de 1ms)
-pause(0v) de 15ms
-3eme cycle identique au premier
niveau haut 5v pendant 0.02ms
niveau bas 0v pendant 0.02ms
répété 25x cette période(cycle de 1ms)
-pause(0v) de une seconde
fin de la boucle

je met un schéma en PJ
la sortie est indifférente...

Merci d'avance
Jay

Ce n'est pas bien compliqué, il suffit de jouer avec les millisecondes et les microsecondes. La précision d'un Arduino dans les microsecondes se situe vers 4 us, donc un delai de 20us peut durer de 16 à 24.
Si tu veux une meilleure précision, il faut aller vers des processeurs plus rapides (ESP8266 ou ESP32)

Je ne comprends pas bien pourquoi ta boucle est composée de 3 cycles identiques. La boucle c'est juste un cycle.

Voici le code pour un seul cycle, il peut certainement être amélioré en jouant avec les timers, mais je ne connais pas suffisamment pour ça. J'ai choisi la sortie sur D5. Tu peux vérifier ce que ça donne sur un oscillo.

#define pin D5

void setup() {
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
}

void loop() {
  // Cycle 1
  for (int i = 0; i < 25; i++) {
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(20);
    digitalWrite(pin, LOW);
    delayMicroseconds(20);
  }
  // Pause 15 ms
  digitalWrite(pin, LOW);
  delay(15);
}

Bonjour Lesept,

Merci beaucoup pour ton aide et ta réponse rapide ;).

pas besoin d'une grand précision,la milliseconde suffit.

alors oui la boucle comporte 3 cycles puis une pause de 1 seconde avant de recommencé sans fin.

donc pourrait tu rajouter une variable qui compte 3 cycles puis qui fait une pause de 1 seconde avant de recommencé la routine en entier?
en gros chaque seconde il faut ces 3 trames d’impulsion avec ce timing,
l'ensemble doit marché en boucle sans arret

PS: en faite sur mon schéma la dernière pause est de 1 seconde(1S) mais on dirait un "15"

A revoir! c'est micros() qui a une précision de 4µs. delayMicroseconds() est précis à la µs près (sauf pour un temps inférieur à 2µs je crois)

Maintenant si on fait:

    digitalWrite(pin, HIGH);
    delayMicroseconds(20);
    digitalWrite(pin, LOW);

L'état haut va durer 20,0µs plus le temps d'un digitalWrite (6,28µs) soit 26,28µs
Et si on fait:

  for (int i = 0; i < 25; i++) {
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
  }

L'état bas sera un peu plus long car il faut compter le test conditionnel de fin de boucle for. Dans un petit programme comme celui-ci (on est très loin de la limite mémoire), pour ne pas avoir à calculer, on peut faire:

    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    .... 

Merci @vileroi
@JayMey : gros fainéant, il suffit de faire un copier coller 25 fois, une boucle et ajouter un delay à la fin.

#define pin D5

void setup() {
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
}

void loop() {
  // 3Cycles
  for (int i = 0; i < 3; i++) {
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Niveau haut pendant 0.02ms soit 20 us
    digitalWrite(pin, HIGH);
    delayMicroseconds(14);
    digitalWrite(pin, LOW);
    delayMicroseconds(14);
    // Pause 15 ms
    digitalWrite(pin, LOW);
    delay(15);
  }
  // Pause 1 seconde (moins 15ms)
  delay(985);
}

Tu avais toutes les bases dans les deux réponses pour faire toi-même

Bonjour Vileroi et merci pour ces précisions importantes pour la compréhension

je commence a comprendre mieux grâce a vos explications,ca commence a etre plus claire dans mon esprit,je vais pouvoir expérimenté...

faut bien débuté en code :wink:

Jay

j'ai un message d'erreur au moment du téléversement:
'D5' was not declared in this scope

pourquoi?

C'était un essai, change cette ligne par

#define pin 5

je viens de trouvé,j'allais effacé mon msg

merci d'etre trop rapide :wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.