Go Down

Topic: PulseIn et Millis  (Read 447 times) previous topic - next topic

Oz91

#15
Jul 17, 2019, 05:25 pm Last Edit: Jul 17, 2019, 05:31 pm by Oz91
parfois tu veux modifier la durée du signal HAUT, parfois du signal BAS. Donc, peux-tu préciser ce point ?

Ensuite, attention : un signal à 12V sur un Arduino va le griller : il te faudra un pont diviseur pour le ramener à la tension supportée par ton Arduino (5V ou 3.3V selon le modèle) : quel modèle utilises-tu ?

Voici ce que j'ai compris de ton montage : un signal rectangulaire arrive sur l'Arduino. Il a une période donnée (inconnue mais pas grave) -- appelons la T -- et se décompose en une partie HAUTE de durée X et une partie BASSE de durée T-X. Cette durée X peut varier d'une période à une autre.

Tu voudrais créer un signal qui conserve la période T mais dont la durée HAUTE devient Y (par exemple X + 15%) et la durée basse devient T-Y. Il faut donc s'assurer que Y reste inférieur à T.

Un schéma : est-ce bien ce que tu cherches à faire ?
Bonjour lesept :)

Dans l'absolu je ne veux modifier que le signal haut, mais je dois aussi conserver la période (variable) ce qui "m'oblige" a raccourcir le signal bas. L'idée était de ne pas imposer de durée a la période basse.

Je pense faire comme "cela":

entrée a HIGH pendant 3ms = sortie a HIGH pendant 3ms avec un passage automatique a LOW a la fin de cette durée. La période est du coup normalement identique. Cela fonctionne sur tinkercad et en réel mais j'ai une latence/déphasage qui ne me permet pas de l'utiliser correctement.

Le signal est une mise a la masse, du coup je n'ai pas de souci avec la tension des 12V, j'utilise un nano ou un uno (j'en ai plusieurs)

Pour la période elle est variable, dans mon exemple elle est de 56 ms (3ms en HIGH + 53ms en LOW)

"Tu voudrais créer un signal qui conserve la période T mais dont la durée HAUTE devient Y (par exemple X + 15%) et la durée basse devient T-Y. Il faut donc s'assurer que Y reste inférieur à T."

C'est exactement cela, mais je suppose que je peux me passer du calcul de la valeur T-Y. j'avais tenté en mesurant les durée haute et basse pour calculer la période et faire comme tu viens de le dire, mais j'avais un décalage entre ce que le port série me remontait comme info et l'oscilloscope.

Oui ton schéma est bon :)

Tu es bien gentil mais tu répond très sélectivement aux questions et on ne sait toujours pas ce que tu veux faire.

J'avais écrit :La balle tu ne veux pas la renvoyer, c'est ton droit comme ce sera le mien d'oublier ce sujet.


Je réponds au fur et a mesure pour ne pas me mélanger ;)

Le temps de lire, de bien formuler mes réponses pour que cela soit clair :)

Effectivement je suis pas l'homme le plus rapide du monde ^^

bidouilleelec

@ Oz91
J'ai modifié mon post pour le code du coup, ...........
1/ Modifié quoi , où ?
Je ne vois rien.

2/ Que signifie "intercepter un signal" ?

Cordialement,
bidouilleelec




lesept

Et as-tu testé le code que je t'ai proposé dans ma réponse #7 ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Oz91

Je te propose un premier code:

A tester...
Merci :)

Donc toi tu démarre un chrono au changement d'état et tu le stop au nouveau changement d'état. Tu peux m'expliquer si il y a une différence de résultat ou d'impact sur les performances de l'arduino par rapport a la fonction pulseIn?

Je n'avais pas l'impression qu'utiliser pulseIn était une mauvaise méthode, je bloque sur la façon de générer le signal en sortie sans impacter le comptage :)

@ lesept      J'ai compris la même chose.

@Oz91
Ce serait bien de nous expliquer le but de cette manip car cela nous permettrait de mieux aider et éventuellement proposer une autre solution mieux adaptés: la balle est dans ton camp.

En français on se comprend mieux en parlant de rapport cyclique (RC), le terme anglais n'est pas "duty" mais Duty Cycle (DC), le terme le plus important étant Cycle.

As tu une exigence de rapidité et de propreté du signal PWM ?
Si tu n'en as pas la fonction analogWrite() conviendra. Il faut savoir que la fonction analogWrite() bégaye pendant une petite dizaine de périodes de PWM.
Vu que que nous ne savons pas ce que tu veux faire je préfère le signaler mais dans 99,999% des cas c'est  sans conséquence.

Si oui tu as ces exigences  il reste :
Les bibliothèques tierce partie que je n'ai pas testé, donc à voir.
Les registres du micro. J'ai expérimenté avec les registres (lire la datasheet du microcontrôleur) et cela fonctionne nickel et instantanément.
Mais pour que le jeu en vaille la chandelle  il faut des vraies exigences bien argumentées et non pas "je veux ce qu'il se fait de mieux par principe sans savoir si c'est utile".
Le but étant de faire un piggyback (boitier additionnel qui modifie les signaux envoyé par le calculateur moteur), les signaux sont carré et dépendent à la fois du temps d'actionnement que de la période défini par le régime moteur variable.

Désolé pour le rapport cyclique, petite fainéantise de ma part, encore désolé.

Oui j'ai besoin d'être aussi rapide et propre que ce que le calculo fait. Dans une 1er temps je voulais déjà intercepter le signal (l'ex 3ms + 53ms) et le reproduire de façon totalement transparente sur le fonction moteur, mais ce n'est pas le cas, je n'arrive pas a produire le signal, j'arrive a le mesurer, mais pas a le produire. Je n'arrive pas a sortir un signal non bloquant, aussi court soit-il avec ses 3ms.


Bonjour
+1
ça manque cruellement d'info pertinentes

J'avais fait avec "pulsin" de l'interception de signal "servo" en sortie de recepteur qui consistait soit à faire une simple recopie du signal servo entrant ou sur condition à mettre le servo en position de sécurité.
Bonjour Artouste :)

C'est exactement ce que j'essaie de faire dans un 1er temps, mais je n'arrive pas a générer le signal de sortie sans ralenti la fonction pulseIn vu que je n'arrive pas a utiliser la fonction millis()....


Merci à tous pour votre aide :)

Oz91

#19
Jul 17, 2019, 05:55 pm Last Edit: Jul 17, 2019, 05:57 pm by Oz91
Et as-tu testé le code que je t'ai proposé dans ma réponse #7 ?
J'ai testé virtuellement et j'ai ca comme résultat qui reviens sur le serial. (correction 1% pour voir le décalage entre l'entrée et la sortie)

Code: [Select]
IN : temps haut =3132 OUT : temps haut =3220

IN : temps haut =3132 OUT : temps haut =3220

IN : temps haut =3148 OUT : temps haut =3236

IN : temps haut =3132 OUT : temps haut =3224

IN : temps haut =3148 OUT : temps haut =3240

IN : temps haut =3132 OUT : temps haut =3224

IN : temps haut =3148 OUT : temps haut =3240

IN : temps haut =3132 OUT : temps haut =3224


Quel impact sur les performances de mesurer le signal d'entrée et le signal de sortie? C'est insignifiant?

Merci :)

Oz91

#20
Jul 17, 2019, 06:30 pm Last Edit: Jul 17, 2019, 06:33 pm by Oz91
Et as-tu testé le code que je t'ai proposé dans ma réponse #7 ?
Je viens de tester physiquement, ca ne fonctionne pas.

Le signal en sortie de calculateur.



Le signal en sortie d'arduino avec la fonction serial désactivée
.


Edit: je suis con, je suis en pullup du coup je retourner essayer en inversant HIGH et LOW :)

Oz91

RE :-D

Bon ben j'ai inversé déplacé le !

Code: [Select]

const byte in = 4;
const byte out = 8;
const int pourcent = 1;

void setup() {
  //Serial.begin(115200);
  pinMode(in, INPUT_PULLUP);
  pinMode(out, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite (out, LOW);
  //Serial.println("Attente signal haut");
}

void loop() {
  while (digitalRead(in)) ; // Attente début signal HAUT
  digitalWrite (out, HIGH);
  unsigned long chrono = micros();
  while (!digitalRead(in)) ;  // Attente fin signal HAUT
  unsigned long tempsHaut = micros() - chrono;
  unsigned long stop = tempsHaut + tempsHaut * pourcent / 100.0;
  while (micros() - chrono < stop) ;  // Attente fin durée suppl.
  digitalWrite (out, LOW);
  unsigned long dureeHaut = micros() - chrono;
  /*Serial.print("IN : temps haut =");
  Serial.print(tempsHaut);
  Serial.print("\tOUT : temps haut =");
  Serial.println(dureeHaut);*/
}


Et ça fonctionne très bien :)

Merci beaucoup, je n'arrive toujours pas a comprendre les fonctions de temps mais je lâcherai pas l'affaire ^^


Du coup une de mes questions tiens toujours, est ce que la fonction pulseIn a des inconvénients par rapport au chrono?

Si je veux utiliser plusieurs capteur, il vaut mieux que j'utilise PulseIn ou mesurer le temps avec micros()?

Si je comprends bien, micros() c'est une fonction similaire a millis() l'échelle est différente, du coup millis est "bloqué" par défaut a 49 jours, la fonction micros() est bloquée a 1000x moins?

Merci beaucoup pour votre aide, c'est vraiment cool :)

lesept

Je ne sais pas répondre a ta question, car je n'utilise pas pulsein...
Par contre, tu peux plonger dans la solution de 68tjs, sur la page que je donne en lien dans un message précédent, qui te donnera une bien meilleure précision. Et si elle te semble trop complexe, il reste a tester la bibliothèque digitalwritefast, compatible avec :
  • Arduino Due
  • Arduino Zero
  • Arduino Mega
  • Arduino with ATmega644 or Atmega644P chip
  • Arduino Leonardo
  • Arduino Uno (I have only tested with uno)
Elle est très simple d'utilisation
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Oz91

D'accord je vais me renseigner :)

La on est d'accord qu'on est dans la µs? Si c'est le cas je n'ai pas besoin de plus :)

Encore merci :)

Artouste

D'accord je vais me renseigner :)

La on est d'accord qu'on est dans la µs? Si c'est le cas je n'ai pas besoin de plus :)

Encore merci :)
Pulsein fonctionne trés bien pour acquerir du signal servo
la fonction renvoie la durée en µs de l'état haut
basiquement un signal servo à une durée d'état haut comprise entre 1000 et 2000 µs et répété toutes les 20000 µs
Il ne faut pas oublier de mettre un timout en argument  (perso j'avais mis 22000 pour etre large)

lesept

Oui, on titille la microseconde, mais c'est pour le sport, la beauté du geste, l'exploit... Et comme cette bibli est très simple d'utilisation, pourquoi s'en priver ? ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

68tjs

#26
Jul 17, 2019, 11:35 pm Last Edit: Jul 17, 2019, 11:37 pm by 68tjs
Non je ne conseille pas digitalFast qui est à peine meilleur moins mauvais que digitalWrite.
Je conseille d'utiliser le module PWM du micro.

Dans ce que j'ai compris de ce que tu veux faire il y a trois parties indépendantes :

1) Analyse du signal entrant qui est un signal PWM.
On cherche à en déterminer la fréquence de récurrence et le rapport cyclique.
Sur ce point tu as reçu des propositions de solution.

2) Détermination des modifications à apporter à ce ce signal de PWM.
Modifications de la fréquence de récurrence et du rapport cyclique en fonction de données que tu n'a pas indiqué. Ça c'est ta toutouille personnelle.

3) Création d'un nouveau signal de PWM.
Pour la création de ce nouveau signal  je pense que ce serait une erreur de vouloir le faire avec  des fonctions d'écriture sur une sortie.
Rien ne sera aussi efficace que le module d'électronique pure contenu dans le micro contrôleur.
Il y a quelques registres à gérer, rien de bien compliquer ou l'utilisation de bibliothèques pour masquer l'utilisation des registres.

Ce qu'il faut bien voir c'est que dans un module électronique à chaque cycle horloge on peut réaliser en parallèle 10, 20, 100, 1000  opérations totalement indépendantes alors qu'en programmation elles sont obligatoirement réalisée en série et une par une..
C'est l'avantage de l'inconvénient : l'électronique n'est pas modifiable mais elle est  extrêmement rapide.

Les registres de la PWM ne modifient que des entrées du module PWM et une fois lancé la PWM ne dépend plus de la programmation (jusqu'à la prochaine modification d'un de ses registres).

Renseignements manquants :
Il manque cruellement les renseignement suivants :
- Gamme de fréquence de récurrence : frequence min et fréquence max.
- Pas dans les variations de la fréquence de récurrence :  de combien as tu réellement besoin. Ce dont tu as besoin est-il compatible avec les possibilités du micro que tu utilises et il ne me semble pas que tu ai répondu sur la référence du micro.
- Le "nouveau signal" de PWM aura-t-il 5V d'amplitude ou une valeur différente.

Le cahier des charges est toujours incomplet et il m'est impossible de le compléter ma boule de cristal est en vacances.

Go Up