Mesure de phase(retard) entre deux signaux

Quand j'ai affaire à un enseignant qui est un professionnel j'estime être en droit d'avoir des réponses techniques pas de la littérature.
Si un enseignant n'est pas capable de fournir un schéma de mesure je ne sais pas où on va. Ou alors sa spécialité n'est pas technique et dans ce cas il faut le dire.

Or là :
Le nom du fabricant du générateur n'est pas donné alors que c'est une évidence que le renseignement est indispensable.
Sous la référence GX240 les premiers résultats de recherche donnent des moteurs Honda.

Aucune indication sur la nature de la sortie : symétrique ou dissymétrique, un professionnel comme un enseignant doit en connaître les conséquences. Symétrique : totalement isolé de la masse, dissymétrique signal délivré par rapport à la masse.

Idem pour l'impédance de sortie : avec une résistance série de 1 kohms cela ne sera pas pareil si l'impédance de sortie du générateur fait 50 ohms ou 600 ohms qui sont les deux valeurs classiques. D'un coté on aura une résistance réelle de 1050 ohms et de l'autre 1600 ohms ce qui donnera des résultats quelque peu différents.

Bon j'ai réussi à trouver que le fournisseur est Métrix et au vu de la BNC en face avant je suis pratiquement certain que c'est du 50 ohms dissymétrique (ou du 75 ohms les deux versions existent en BNC l'isolant interne de la 75 ohms est nettement plus fin que celui de la 50).

Mais je me lasse de jouer au devinettes je quitte le sujet.

"Quand j'ai affaire à un enseignant qui est un professionnel j'estime être en droit d'avoir des réponses techniques pas de la littérature."

Un enseignant en sciences physiques (vérités immuables) a parfaitement le droit d'oublier les détails techniques (soumis à des évolutions technologiques), même si cet oubli peut s'avérer gênant... et les évidences pour les uns ne sont pas des évidences pour les autres (ex: un article défini se référant à un nom au pluriel prend la marque du pluriel en français -ça, c'est codifié depuis plus de 300 ans- , pas en kurmandji...)

La solution de commencer par un analyseur de signaux/mini data logger permet de règler empiriquement une incertitude sur l'impédance interne .... si on ne détruit pas l'arduino (je suppose qu'un enseignant sait détecter par lui même ce genre de détails, même si je n'ai aucune idée des compétences éventuellement exigibles d'un enseignant: dans un domaine scientifique, doit il avoir des compétences techniques?).

Bonsoir

Oula, je ne pensais pas que ma demande allait entraîner un déchaînement de réponses et d'échanges ! Apparemment, il est de coutume de répondre par des listes à puces, je vais également suivre cette tradition

  1. il paraîtrait que je sois un enseignant de sciences physiques : j'ai donc pris du galon mais je n'en touche malheureusement pas le salaire. Je n'ai jamais prétendu être enseignant, j'ai simplement indiqué que j'étais dans l'enseignement mais il n'y a pas que des enseignants, la preuve ! Je suis simplement personnel de laboratoire : à ce titre, j'aide les enseignants dans la préparation des séances de travaux pratiques.

2)Arduino étant dans l'air du temps et dans les nouveaux programmes, je me suis mis à Arduino depuis plusieurs mois : je sais donc programmer et utiliser un Arduino (j'ai d'ailleurs déjà utilisé ce forum pour parvenir à optimiser certains programmes ou manipulations. Je me sers d'Arduino pour remplacer certaines manipulations plus abordables : par exemple, j'ai programmé la récupération de données pour étudier la charge (et la décharge) d'un circuit RC pour mesurer la constante de temps du circuit.

  1. Je rejoins la réponse de dbrion6 et je suis sincèrement désolé auprès de 68tjs si je n'ai pas répondu à ses questions tel qu'il l'aurait souhaité. J'ai répondu de bonne foi en pensant réellement que les éléments que je transmettais était suffisant car je ne pensais pas qu'il fallait connaître autant d'éléments pour répondre au problème.
    Je ne me suis jamais posé la question de savoir si le GBF que l'on utilise pour cette manipulation est à sortie symétrique ou non : mon boulot est de sortir le matériel pour que cela fonctionne, mes collègues utilisaient tel GBF (le métric GX240 dans ce cas) pour cette manipulation, je n'ai pas cherché à savoir plus que ça sur ce GBF car l'important est que ça marche : peut-être que les enseignants pourraient le justifier (quoique dans les enseignants avec qui je travaille, je ne suis pas sûr que la majorité puissent en savoir plus) mais moi non.

Eh bien, je me suis couvert de ridicule en pariant (implicitement , mais quand même) sur votre profession.

Je maintiens cependant que vous êtes dans un environnement que beaucoup de hobbyistes vous envieraient, avec le voisinage de gens qui peuvent vous éviter des horreurs de masse et de resistance interne (un bon prof peut vous l’expliquer en 5 minutes; les manips pour poster une image sur ce forum sont abominables),
du materiel de mesure…
et que, comme vous semblez méthodique, votre projet est en de bonnes mains.

Cependant, j’avais donné un bout de code en faisant le pari qu’un prof saurait corriger les erreurs qui se sont glissées (je n’ai pas d’arduino hors week end, et j’essaye d’améliorer mes PC et RPis).

Je vais vous donner une version à jour, avec , j’espère, moins d’horreurs (variables non déclarées, ) de ce que j’ai mis précedemment.

const int voieI = A1; // voie d'entrée analogique pour l'intensité; pour ménager l'avenir, je n'ai pas pris A0 -clavier analogique populaire -ni A4, ni A5 -I2C-
const int voieVolt = A2;
 
uint16_t intens[250], volt[250]; // un arduino n'a que 2 Kohm de RAM, j'echantillonne 250 valeurs (1 K bytes)
uint8_t isample= 0;
uint32_t tdebut = micros();// pour voir si on echantillonne assez vite

// bout de code à mette en fin de setup (on ne regarde qu'une salve, pour commencer)


// échantillonnage à la cadence la plus infernale possible
//
for (isample=0; isample  < (sizeof(intens)/sizeof(intens[0])); isample++) {
   intens[i] = lecture(voieI); // lecture est, pour débuter, adcRead; avec le lien vers gammon, en post 6, on peut accélérer
  volt[isample] = lecture(voieVolt);
}
uint32_t elapsed = micros() - tdebut;
Serial.print(" Elapsed :\");
Serial.println(elapsed);
// calcul des extrema
uint16_t Iminimum = 4444 ; // bien au dessus de ce que le convertisseur peut donner
uint16_t Imaximum = 0;
uint16_t Vminimum = 4444 ; // bien au dessus de ce que le convertisseur peut donner
uint16_t Vmaximum = 0;

for (isample=0; isample  < (sizeof(intens)/sizeof(intens[0])); isample++) {
   if (intens[i] > Imaximum ) Imaximum = intens[i];
   if (intens[i] < Iminimum ) Iminimum = intens[i];
   if (volt[i] > Vmaximum ) Vmaximum = volt[i];
   if (volt[i] < Vminimum ) Vminimum = volt[i];
 
}
Serial.print("I mini:");;Serial.print(Iminimum );
Serial.print("I maxi:"); Serial.println(Imaximum );
Serial.print("V mini:");;Serial.print(Vminimum );
Serial.print("V maxi:"); Serial.println(Vmaximum );

Nota: mon codage est naîf, basé sur du copié-coller; ecrire une fonction serait préférable.
J’ai calculé les extrema pour la raison suivante:
a) ça sert par la suite
b) Arduino a un optimiseur très puissant, et parfois un peu nihiliste: s’il s’apercoit qu’une variable ne sert à rien, il la supprime … et les calculs correspondants avec. Or, les tableaux dans lesquels on stocke les mesures sont inutiles, s’ils ne rentrent pas dans des calculs faisant l’objet d’affichage ou d’entrée sorties; Comme j’ai besoin de determiner la vitesse maxi d’echantillonnage, et que, si les echantillonnages sont supprimés par l’optimiseur, cette vitesse sera tres fausse, je prends la précaution de rendre ce tableau indestructible.

dbrion06:
Eh bien, je me suis couvert de ridicule en pariant (implicitement , mais quand même) sur votre profession

Ridiculisé non car beaucoup de gens, pour ne pas dire la quasi totalité, ne considère que les profs dans l’éducation nationale : c’est presque légitime de le penser.

J’ai essayé de comprendre le code, j’ai quelques questions car un certain nombre d’éléments sont nouveau par rapport aux programmes (plus ou moins basiques) que j’utilisais jusque là :

  • si je comprends, on récupère d’abord dans un tableau les valeurs de l’intensité et de la tension (1ère boucle for) puis on cherche à déterminer les maxima (2ème boucle for) que l’on affiche ;
  • la déclaration uint8_t : c’est pour indiquer un int codé sur 8 bit, c’est ça ?
  • j’ai jeté un oeil au lien vers gammon mais je n’ai pas tout saisi comment il était possible d’augmenter la fréquence d’échantillonnage → résultat, je ne comprends pas comment définir la fonction lecture pour permettre un échantillonnage plus important

Merci pour le retour

Premier point : vous avez compris (c'est plus difficile de comprendre un code écrit par d'autres)

Second point uint8_t est e
un entier sur 8 bits non signé... (vous n'avez pas de machine à remonter le temps; un int8 serait asurde et vous obligerait à avoir des indices s'arrêtant à 127, un peu petit).

LE troisiéme point pose problème:

Definissez d'abord la fonction lecture comme analogRead classique... la plus lente. Ensuite, essayez de voir si elle est assez rapide à votre goût (on peut cacher ce problème en décretant qu'on mesurera des dephasages avec des condensateurs (inductances) de valeur 10... 100 fois plus élevée qu'avant, mais c'est tricher). Si elle est assez rapide, c'est gagné (et si vous voulez utiliser autre chose qu'un avr arduino, vous restez portable).
Si elle n'est pas assez rapide, on avisera:
gammon https://www.gammon.com.au/adc titre "Accuracy with various prescalers" a fait un programme mêlant les spécificités de l'avr et de la bibliothèque arduino qui teste les divers reglages ; ce test se fait en decommentant/commentant des lignes et en recompilant... et en regardant s'il y a degradation du resultat..

Un resultat pas trop affreux est 6 fois plus rapide que analogRead classique, et correspond à un prescaler de 16.
Il faut jouer avec son programme et remplacer la ligne:

 ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2);   // 128 [code]
par
[code]ADCSRA |= bit (ADPS2);                               //  16

et verifier si vous pouvez reproduire ses resultats... on ne sait jamais

Il tire un fil entre 0v arduino et A0, un autre entre 3v3 arduino et A2, un dernier entre 5v Arduino et A3 (A1 utilise une reference de tension.)

A noter que la ligne mysterieuse, est extrêmemnt rapide à executer et modifie le fonctionnement de analogRead (comme elle est très rapide, on peut la mettre, sans trop de gaspillage, devant analogRead dans lire() )

Le problème c'est qu'il n'est pas portable: ne marche "que" sur des avr 8 bits, type uno ou 2560...

Je ne connais bien des arms que "tiva", de Texas -se programme avec un clone d'arduino, Energeia (donc j'essaye de garder du code portable) qui a un ADC 100 fois -au moins plus rapide que celui d'arduino, 2 CANS independants, reliés à plein de lignes chacun... mais je ne sais pas si la fabrication est arrêtée ni si les prix ont augmenté....
C'est pour ça que je pense qu'il faut attendre avant de vous décider.

"beaucoup de gens, pour ne pas dire la quasi totalité, ne considère que les profs dans l'éducation nationale : c'est presque légitime de le penser."
Non, car alors, je serais obligé de faire un referendum pour savoir quoi penser (et tout le monde devrait en faire autant).... Alors qu'une pensée est une action individuelle (et devrait l'être chez nos chères têtes blondes).