ESP32 <> DRO signal sinusoïdale (règle de mesure pour tour ou fraiseuse)

Bonjour,

Sur mon tour Optimum, j’ai affichage DRO 3 axes qui utilise des règles digital qui on des signaux analogiques en forme de sinus.

J’aimerais récupérer un comptage de ces signaux avec un ESP32.
Malheureusement, je ne trouve que des exemples pour des règles à signaux carré (TTL) !

Extrait de mode d’emplois de l’afficheur:
Affichage_DRO_notice1 001.pdf (449.6 KB)

Explication codeur sinusoïdal que j’ai trouvé :Voir à 28:30

J’ai mesurer au multimètre : entre 0° et 0V tension entre ~2.5v et ~3.4v ; entre 0° et 180° stable à 0.015v.

J'ai ensuite testé le code si-dessous avec un Nano et SérialPlot:
EDIT: Code mis à jour le 04.02.24

// Pour Arduino Nano:
/////////////////////
  #define Version V1
  // Change: - new brochage (pin) pour isoler le boutton; - Ajout serialPrint compteur et distance; -Add dévérouillage du Setup par boutton

/*  Petit code pour lire les règles digitals Optimum sinusoïdale 1Vpp (Utilisable uniquement à très faible vitesse)
 ********************************************************************
 *  Simule un trigger de shmitt sur les canaux A = 0° et B = 90°
 *  Compte en quadrature les signaux ainsi transformé.
 *  - printGraph() est paramètrée pour une utilisation avec le logiciel SerialPlot (séparateur virgule)
 *    - Pour imprimer le graphique sur SerialPlot déconecter la pin "pinMode1" (pull-up = Vcc)
 *  - Pour imprimer le compteur sur le moniteur série relier la pin "pinMode1" à GND
 *
 * connection à la règle:
    * A6 à la pin 0°
    * A7 à la pin 90°
    * GND à la pin 0V
    * - Ajouter un switch entre GND et A0 de l'Arduino
 ******************
 * MODE D'EMPLOIS *
 ******************
 * IMPORTANT : il faut que la règle soit allimenté avant l'Arduino, si ce n'est pas le cas faire un RESET de l'Arduino pour qu'il démarre avant les bonnes tension minU et maxU.
 *
 * Au lancement du programme ou après un reset; quand la led de la carte est allumée presser bièvement sur le boutton pour valider le Setup() et lancer le programme
      - ceci sert de témoins. Si la led s'allume pendant une mesure (en dehors du calibrage), c'est que l'Arduino à "Reseté".
 *
 * Au premier démarrage, il faut initialiser l'Eeprom avec un calibrage.
 *
 * Calibrage : Pressé le switch (et le garder pressé pendant tous le calibrage) et déplacer l'axe pour étalonner les valeurs min et max fournie par la règle (attendre au minimum que la led s'allume = 2.5 secondes)
    - Après plus de 2.5 secondes, quand vous lâchez le boutton, les nouvelles valeurs sont écrite dans l'Eeprom et aussi utilisées dans le programme. (Pas de retour en arrière possible).
 * en suite une courte pression (< 2.5s) sur le switch remet le compteur à zéro // Longue pression (> 2.5s) refait une callibration
******************************************************* */

// A définire selon votre utilisation:
  const int pinA = A6;  // Broche analogique pour la mesure de tension A = 0° de la règle digitale
  const int pinB = A7;  // Broche analogique pour la mesure de tension B = 90° de la règle
  const int pinSwitch = A0; // Broche de l'intérrupteur (pour calibration ou remise à zéro du compteur)
  const int pinMode1 = 12;  // Broche pour choisir le mode de fonctionnement "printGraph()" OU "printCompteur()"
  const int pinLED = 13;    // LED de la carte Arduino "LED Bulting"
  const int hysteresis = int(0.1 * 1024.0 / 5.0); // hystérésis de 0.1 vlot (Remplace le trigger de shmitt)
  const int timeCalbr = 2500; // Durée minimum pour une calibration valide
  const int umPoint = 5;    // Nombre de microns par point

#include <EEPROM.h>

const int hystHalf = (hysteresis > 1) ? hysteresis / 2 : 1;
bool chanelA = false;   // Signal carré du canal A (signal numérique)
bool chanelB = false;   // Signal carré du canal B (signal numérique)
bool lastA = false;     // Variable pour remise en place de la position après remise à zéro du compteur
bool lastB = false;     // Idem à [lastA]
int32_t compteur = 0;   // Compteur bi-directionnel du nombre de pulses A-B
// Valeur réinitialisée dans le Setup(), puis dans calibriation()
  int minU = 0;         // Tension mim pour la sinus
  int maxU = 1024;      // Tension max pour la sinus
  int tempMinU = minU;  // Variable de comparaison temporaire pour la calibration
  int tempMaxU = maxU;  // Variable de comparaison temporaire pour la calibration
  int topU = 510;       // Tension au-delà de laquelle le canal passe à haut :  High trigger voltage
  int bottomU = 514;    // Tension en-deçà de laquelle le canal passe à bas : Low trigger voltage
int valUa = topU;       // Valeur lue du pinA (Sinus)
int valUb = topU;       // Valeur lue du pinB (Cosinus)
float Ua = 2.5;         // Tension lue au pinA (en volts)
float Ub = 2.5;         // Tension lue au pinB (en volts)
bool valSw = true;      // Dernier état connu de l'interrupteur
bool mode1Sw = true;    // Mode d'utilisation des données sur port série
uint32_t timeStartCalibre = millis(); // Timer pour valider la calibration

void setup() {
  Serial.begin(115200);  // Initialisation de la communication série
  pinMode(pinA, INPUT);  // Déclaration de la broche A0 comme entrée analogique
  pinMode(pinB, INPUT);  // Déclaration de la broche A1 comme entrée analogique
  pinMode(pinSwitch, INPUT_PULLUP);  // Déclaration du switch
  pinMode(pinMode1, INPUT_PULLUP);   // Déclaration du pin
  pinMode(pinLED, OUTPUT);  // Déclare la broche 13 comme sortie (Led de l'arduino)

  // Charger les valeurs de minU et maxU depuis l'EEPROM
  minU = readEEPROM(713, 714);
  maxU = readEEPROM(715, 716);
  // Validation : vérifier si les valeurs lues sont valides
  if (minU < 0 || minU > analogRead(pinA)) {
    minU = analogRead(pinA);
  }
  if (maxU < analogRead(pinA) || maxU > 1024) {
    maxU = analogRead(pinA);
  }

  topU = (maxU - minU) / 2 + minU + hystHalf;     // Tension au-delà de laquelle le canal passe à haut :  High trigger voltage
  bottomU = (maxU - minU) / 2 + minU - hystHalf;  // Tension en-deçà de laquelle le canal passe à bas : Low trigger voltage

  //delay(800); // Remplacer par le code si-dessous:
  { // attendre un pression sur le boutton avant de démarrer le programme (ce qui permet d'initialiser le moniteur série par exemple)
    digitalWrite(pinLED, HIGH);  // Allume la LED
    bool _start = false;
    // Attendre que le bouton soit pressé avec une gestion de debounce
    while (!_start) {
      if (digitalRead(pinSwitch) == LOW) {  // Si le bouton est pressé
        delay(20);  // Débounce
        _start = digitalRead(pinSwitch) == LOW;  // Vérifie si le bouton reste pressé après le délai
      }
    }  
    // Attendre que le bouton soit relâché
    while (digitalRead(pinSwitch) == LOW) {}  // On attend ici que le bouton soit relâché
    delay(80);  // Débounce

    digitalWrite(pinLED, LOW);  // Eteindre la LED à la fin du setup()
  }
  Serial.print("SETUP: min sinus = ");Serial.print(minU);Serial.print(" // max sinus = ");Serial.println(maxU);
  // DEBUG :
  //   Serial.print(readEEPROM(713, 714));Serial.print(" || ");Serial.print(readEEPROM(715, 716));
  //   Serial.println();Serial.println("------");Serial.println();
  
  // Réinitialisation des variable pour éviter une autocalibration au démarrage
  valSw = (digitalRead(pinSwitch) == HIGH);
  timeStartCalibre = millis();
}

void loop() {
  if (digitalRead(pinMode1) == HIGH){mode1Sw = true;} else {mode1Sw = false;}

  if ((digitalRead(pinSwitch) == HIGH) != valSw){
    delay(20); // Debounce
    valSw = (digitalRead(pinSwitch) == HIGH);
    // Remettre au bonne endroit chanelA et chanelB
      // Restauration des position d'avant la mise à zéro
    if(valSw){  // Passe en mode comtage
      chanelA = lastA;
      chanelB = lastB;
      if (millis() - timeStartCalibre > timeCalbr){ // n'enregistre les nouvelles valeurs dans l'Eeprom et le programme que si le calibrage à duré plus que "timeCalbr" 2.5 secondes
        bool change = false;
        
        if (minU != tempMinU || maxU != tempMaxU) change = true;
        minU = tempMinU;
        maxU = tempMaxU;

        // Sauvegarde les nouvelles valeurs dans l'EEPROM
        // change = updateEEPROM(713, 714, minU) || change;
        // change = updateEEPROM(715, 716, maxU) || change;
        bool Eepmin = updateEEPROM(713, 714, minU);
        bool Eepmax = updateEEPROM(715, 716, maxU);
        if (Eepmin || Eepmax) change = true;

        // Adapte la valeur centrale est l'hystérésis haut et bas
        if (change){
          topU = (maxU - minU) / 2 + minU + hystHalf;
          bottomU = (maxU - minU) / 2 + minU - hystHalf;
        }
        if (!mode1Sw){
          Serial.print("- Nouveau calibrage OK ! ==> ");
        }
      }
      else if (!mode1Sw){ Serial.print("- Reset compteur de distance ("); }

      if (!mode1Sw){Serial.print("min sinus = ");Serial.print(minU);Serial.print(" // max sinus = ");Serial.println(maxU);}

      digitalWrite(pinLED, LOW);  // Eteindre la LED
    } else {  // passe en mode calibration
      timeStartCalibre = millis();
      lastA = chanelA;
      lastB = chanelB;

      tempMinU = analogRead(pinA);
      tempMaxU = tempMinU;
    }
  }

  valUa = analogRead(pinA);  // Lecture de la valeur analogique 1
  valUb = analogRead(pinB);  // Lecture de la valeur analogique 2

  if (valSw == true){
    compte();
  } else {
    calibrate();
  }

  if (mode1Sw){
    printGraph();
  }
  else {
    printCompteur();
  }
}   // END loop()

void calibrate(){
  bool change = false;

  compteur = 0; //Réinitalise le compteur à zéro
  
  if (valUa > tempMaxU) {
    tempMaxU = valUa;
    change = true;
  } else if (valUa < tempMinU){
    tempMinU = valUa;
    change = true;
  }
  if (valUb > tempMaxU) {
    tempMaxU = valUb;
    change = true;
  } else if (valUb < tempMinU){
    tempMinU = valUb;
    change = true;
  }
  

  if (millis() - timeStartCalibre > timeCalbr){
    digitalWrite(pinLED, HIGH);  // Allume la LED
    if (change){
      chanelA = !chanelA; // le chanelA change lorsqu'une nouvelle valeur remplace celle de minU ou maxU
      //chanelB = false;    // le chanelB passe à false pour mieux distinguer les changement sur le chanelA
    }
  }

  Ua = (tempMinU * 5.0) / 1024.0;  // Conversion de la valeur analogique en tension 1
  Ub = (tempMaxU * 5.0) / 1024.0;  // Conversion de la valeur analogique en tension 2
}

void compte(){
  Ua = (valUa * 5.0) / 1024.0;  // Conversion de la valeur analogique en tension 1
  Ub = (valUb * 5.0) / 1024.0;  // Conversion de la valeur analogique en tension 2

  if (chanelA == true && valUa <= bottomU){
    chanelA = false;
    if (chanelB == false){
      compteur ++;
    } else { compteur --;}
  }
  else if (chanelA != true && valUa >= topU){
    chanelA = true;
    if (chanelB == true){
      compteur ++;
    } else { compteur --;}
  }

  if (chanelB == true && valUb <= bottomU){
    chanelB = false;
    if (chanelA == true){
      compteur ++;
    } else { compteur --;}
  }
  else if (chanelB != true && valUb >= topU){
    chanelB = true;
    if (chanelA == false){
      compteur ++;
    } else { compteur --;}
  }
}

void printGraph(){
  Serial.print(Ua, 3);
  Serial.print(", ");       // ==>> Séparateur de canaux pour SerialPlot

  Serial.print(Ub, 3);
  Serial.print(", ");

  if (chanelA) {Serial.print("1.800");} else {Serial.print("1.000");}
  Serial.print(", ");
  if (chanelB) {Serial.print("0.800");} else {Serial.print("0.000");}

  //Centre
  Serial.print(", ");
  float centre = (topU - hystHalf) * 5.0 / 1024.0;
  Serial.println(centre, 3);
}

void printCompteur(){
  static int32_t lastCompte = -10;

  if (compteur != lastCompte){
    // Imprime la distance pour un inter-points de 5 microns
    Serial.print("Distance : ");Serial.print(float(compteur * umPoint) / 1000.0 , 3);

    lastCompte = int32_t(abs(compteur) / 1000);
    Serial.print("\t Compteur : ");
    if(compteur < 0) Serial.print("-");
    if(lastCompte != 0) {
      Serial.print(lastCompte);Serial.print(" ");
    }
    Serial.println(abs(compteur) - lastCompte*1000);

    lastCompte = compteur;
  }
}

int readEEPROM(int address1, int address2) {
  int value = (EEPROM.read(address1) << 8) | EEPROM.read(address2);
  return value;
}

bool updateEEPROM(int address1, int address2, int value) {
  int eepromValue = readEEPROM(address1, address2);
  bool _raiponce = false;
  if (eepromValue != value) {
    EEPROM.write(address1, (value >> 8) & 0xFF);
    EEPROM.write(address2, value & 0xFF);
    _raiponce = true;
  }
  // DEBUG :
  //   Serial.println();Serial.println("------");
  //   Serial.print("Eeprom_Save: min sinus = ");Serial.print(minU);Serial.print(" // max sinus = ");Serial.println(maxU);
  //   Serial.print(readEEPROM(713, 714));Serial.print(" || ");Serial.print(readEEPROM(715, 716));
  //   Serial.println();Serial.println("------");Serial.println();

  return _raiponce;
}

En connectant l'entrée A: entre 0° et 0v et l'entrée B: entre 180° et 0v, les courdes ce supperposent. pour l'image ci-dessous j'ai rajouter un ofset pour distinger les deux courbes.

Je ne comprend pas pourquoi il n’y a pas de variation entre 0° et 180° quand je déplace l’axe !

En connectant l'entrée A: entre 0° et 0v et l'entrée B: entre 270° et 0v

Comment pourrais-je faire pour acquérir ces signaux ? un module de conversion ? un module de comptage ?

Salutations, bonne journée.

je ne comprends pas cette phrase

Selon le PDF joint, au voltmètre en déplacent très-très lentement, j'ai une tension qui varie entre environ 2.5v et 3.4v, entre la broche 1 (0°) et la broche 4 (0v).
Si je mesure entre la broche 1 (0°) et la broche 2 (180°) il n'y a pas de variation de tension en déplacent l'axe. il y a juste un petit delta de 15mv qui ne bouge pas. (ce qui correspond aux valeurs du traceur série de la première photo, aulieu d'avoir un sinus décalé de 180°, les sinus ce superposent. C'est la même chose entre 90° et 270°.)

ici une capture de la lecture de 90° et 270° sans offset

ah j'avais pas vu le lien sur le PD (je lis sur mon smartphone)

vous parlez des broches et de leur dénomination dans le tableau

je n'ai pas de réponse à votre question... dsl

Oui c'est ça.

Avec l'aide de l'IA, j'en arrives à l'utilisation de comparateur pour convertir les sinus en signale carré. Comme sur le schéma si-dessous avec un LM393


les potis servent à régler la tension centrale de la sinus.
les résistances R3 et R4 créaient un hystérésis (genre trigger de Schmitt).

Par contre je ne sais pas si j'ai connecté In+ et In- dans le bon sens pour que R3 baisse la tension quand la sinus (ici In+) et plus grande que la ref. (ici In-).
Comme j'ai compris, quand In+ > In-, out vaut GND donc R3 et R1 en parallèle; quand In+ < In-, out est flottant donc seulement R1.
Ai-je bien compris ?

On rentre dans le hardware, c'est pas ma compétence principale.

@68tjs ou @hbachetti ou @al1fch sans doute pourront mieux vous conseiller s'ils ont un peu de temps.

Pas de soucis, merci quand même d'avoir répondu. Bonne journée.

Bonsoir @Charles_9999

le LM393 est un double comparateur non inverseur à sortie en collecteur ouvert

les deux comparateurs d'un LM393 sont indépendants l'un de l'autre, ils partagent leur alimentation

sortie en collecteur ouvert : une résistance est donc indispensable entre chaque sortie et VCC pour pouvoir avoir un état haut (idem sorties I2C)

Non inverseur :
quand une entrée+ reçoit une tension supérieure à l'entrée- du même comparateur la sortie est à l'état Haut (presque Vcc)

quand une entrée+ reçoit une tension inférieure à l'entrée- la sortie du comparateur est à l'état bas (presque la masse)

Si souhaité, un hystéresis (feedback positif) peut être ajouté par une résistance reliant la sortie et l'entrée+
Le 'dosage' de l'hystéresis dépend également de la résistance de la branche qui amène à l'entrée+ le signal à traiter

Avec ton schéma , @Charles_9999 , c'est la résistance de sortie du signal sinusoîdal issu de la fiche DSUB (composants en amont)

Sur ce schéma , tiré d'un Guide d'Application de Texas Instruments, c'est la résistance RH2

Ce n'est pas ce qui est expliqué dans la vidéo que tu cites dans ton premier message.

Dans la vidéo il est fait:

  • signal A = signal_0° - signal_180 °
  • signal B = signal_90° - signal_270°

comme A et B sont en quadrature on a : A = sinus et B = cosinus.
En utilisant ces 2 signaux on détermine la phase en calculant la tangente de l'angle.
A noter, pour que l'angle soit déterminé précisément, il faut échantillonner le sinus et le cosinus au même instant.

La branche avec les comparateurs a une autre utilité.
Les signaux sinus et cosinus se répètent plusieurs fois sur un tour. Donc, pour savoir combien de périodes on a parcouru, on compte les passages par 0.

En synthèse, on peut dire que

  • la branche avec les comparateurs donne une position grossière
  • la branche analogique donne la précision du positionnement.

La question à se poser, est-ce que la règle digitale que tu utilises fonctionne comme ça?

Sauf que moi malheureusement les signaux 0° et 180° ne sont pas décalés comme dans la vidéo, idem pour 90° et 270° (voir post #4). Le signale de 180° et une copie non décalée du 0°, plutôt qu'une inversion du 0° comme on peut le voir dans la vidéo.
Mon idée et de remplacer la sinus décalée de 180° par une tension V_Ref qui ce situe au centre des valeurs de crêtes. Pour le réglage de cette tension, en mettant une avance constant à la machine, à l'aide d'un oscilloscope je règle le potentiomètre de pont diviseur pour avoir un duty à 50%.

Je pence que la position grossière avec comparateur sera largement suffisante. Pour l'instant en tous cas.
Je n'ai pas encore mesurer le nombre de points par mm que je peut relever avec mon programme Arduino (en quadrature), mais je penses quand extrayant quatre points par 360°(de la sinus), je vais arriver aux 5 microns de la résolution nominale de l'afficheur de la machine. Mais merci d'avoir poser la question.

A @al1fch : N'y connaissant rein au comparateur et en ayant du mal à déchiffrer les dataSheet en anglais, je me permet de commenter vos propos avec ce que j'ai compris:

Donc une pull-up vers le 3.3V de l'ESP32.

C'est le courant fourni par la Pull-Up (3.3V)

GND via le transistor du comparateur.

Moi je modifie la tension V_ref avec ma résistance [R3] au-lieu de modifier la tension V_in dans votre schéma (avec R_H2 et R_H1).
L'idée est de ne pas modifier V_in, vue que je fais un piquage sur l'afficheur DRO actuel, en tirant du courant sur V_in, j'ai peur que l'affichage de la machine ne fonctionne plus correctement.
Est-ce que de modifier V_ref en place de V_in change le fonctionnement du comparateur ?

Sachant que V_Ref sera proche de 3.0V, ma résistance fait office de Pull-Up et de "feedback négatif" . C'était ma première idée.
Mais je viens de calculer cette résistance ([R3] dans mon schéma) pour un hystérésis de 0.1V avec un pont diviseur pour V_Ref de 10kΩ ([PR1]+[R1] dans mon schéma) il me faut une résistance de 68kΩ.

Peut-être que 68'000Ω c'est trop pour une Pull-Up ?

Merci, salutations et bonne journée.

Bonjour @Charles_9999

Oui pour les 3 premiers points me citant au #11

Pour le 4e point 'hystérésis' je doute à première vue de la proposition qui table me semble-t-il sur un comparateur inverseur, le LM393 est non inverseur -> un feedback négatif (= sortie vers entrée -) ne peut apporter un hystérésis

Pour le confort de mon cerveau Je dois au préalable dessiner (dès que possible) un schéma facilitant l'analyse.
celui du message #6 me paraissant avoir été fait par un 'concepteur de labyrinthe' :wink:


Avec ce montage classique la résistance RH1 peut être choisie de manière à ne 'tirer' qu'une ou deux dizaines de µA sur la source du signal VIN, influence négligeable sur cette source sauf cas particulier.

Le labyrinthe, image bien mes idées en ce moment :stuck_out_tongue_closed_eyes:
J'ai bricoler une version simplifié de ma vision, si ça peut soulager

En le regardant, je me rend compte qu'il est faut:
Quand l'onde "+" > V_ref "-" =>> out = +3V =>> V_ref àpasse à l'état haut (3.0V)
Quand l'onde "+" < V_ref "-" =>> out = GND =>> V_ref àpasse à l'état bas (2.9V)
:worried: c'est l'inverce doit j'ai besion.
En inversant les connections sur le comparateur, cela devrais mieux fonctionner ?


Maintenant quand l'onde dépasse V_Ref:

  • V_Ref "+" < onde "-"
  • out passe à GND
  • V-Ref passe à bas "2.9V" (ce qui amplifie la différence et évite les rebonds)

Quand l'onde devient inférieur à V_Ref:

  • V_Ref "+" > onde "-"
  • out passe à Vcc
  • V-Ref passe à haut "3.0V" (ce qui amplifie la différence et évite les rebonds)

Bonjour

ça va mieux ! mais je ne sais pas ce que tu attends de bon (dans ton environneemnt probablement bruité) avec le montage sans le "pull up" de 10k relié au rail d'alimentation 3,3V

Quand le transistor de sortie du LM393 est bloqué, la résistance de 68k amenant 3v fait , pour une entrée GPIO d'ESP32, un 'pull up' peu efficace à mon goût sur le terrain.....risque de de perturbations amenant de temps en temps l'entrée du GPIO en dessous de 2,3V qui est le VIHmin pour un ESP32 alimenté en 3,3V

Ne pas réduire la marge de bruit au prix d'une résistance !
Appliquer au GPIO de l'ESP32 des tensions très proches de ses rails d'alimentation

Je suis d'accord avec vous que ce n'est pas bon, mais j'avais peur que la pull-up m'augmente trop la valeur d'hystérésis.
Depuis, J'ai fais un tableur pour calculer cette valeur d'hystérésis et il est vrai qu'avec la pull-up de 10k alimenté en 3.3V n'a pratiquement pas d'influence sur l'hystérésis. Par contre avec la pull-up alimenté en 5V cela rajoute ~2/3 de variation de tension.
Tableur.zip (161.2 KB)

Pour quoi la taille de l'hystérésis est importante:

  • Plus je suis proche de la valeur central de la sinus, plus la variation de tension par distance parcourue et grande. Donc cela augment la precision de déclanchement du point.
  • Plus la tension de l'hystérésis est grande plus le décalage des points entre marche avant / marche arrière et grand. Donc j’augmente la "zone morte" quand je change de direction. Voir le schéma ci-dessous. (Désolé pour la qualité du dessin.)

Je me dit q'une valeur d'hystérésis entre 10% et 20% de la tension crête à crête serait un bon compromis.

En résumé, @al1fch vous avez raison, la version SANS la PULL_UP est à oublier.

Autre chose, Entre le LM393 et l'ESP32:

  • Une isolation par optocoupleur serais une bonne chose ? Je penses que le seul risque est lors de la manipulation du potentiomètre. Donc un risque relativement limité.
  • Utiliser des compteurs-série plutôt que de surcharger l'ESP32 avec une multitude d'interupt ? (Au total, 3 axes en quadrature = 6 signaux d’interruptions, si je rajoute un codeur pour la broche, encor deux de plus). Sachant que l'ESP32 devra en plus faire des calculs d'interpolation et piloter un pas-à-pas.

En attendant de pouvoir tester avec les LM393 qui devrais arriver dans 2 semaines, je vous envois toutes mes salutations. Bonne journée.

J'ai reçu mes comparateurs LM393 :grinning:
Le premier test concluant, juste une fois perdu 3 points et une fois 1 de trop. Avec le montage que j'ai utilisé (pas de blindage, connections break-bord pas idéal, ...), c'est plus que correcte !

avec ce schéma une fois pour chaque canal (0° et 90°)

Pour régler V_Ref avec le poti, j'ai mis duty-cycle à 50% avec mon petit oscilloscope.
A bas féquence le duty reste stable à 50 +/- 1% . Par contre avec une fréquence plus élevée, il c'est décale à 66% +/- 1.5% ! Pourquoi ? Mistère. Peut-être mon oscilloscope (low-cost chinois) ?

J'avais fais des captures d'écran de l'oscilloscope mais elle ont disparues. Si cela vous intéresse, je peux en refaire.

Salutations, bonne journée.

orde de grandeur de la fréquence où apparaît sur l'écran de l'oscilloscope le changement du rapport cyclique en sortie du comparateur ?

J'ai refais et les résultats sont différents:
6.6Hz étalonnage du diviseur

50Hz intermédiaire En moyenne vers 54% +/-4

500Hz avance rapide : 50% avec de temps à autre des sautes à 40% ou à 60%

Après j'ai fais qu'un canal. Peut-être pas le même chaque fois. Et mon montage est loing d'être optimal, je pic pour la sonde, sur la bord avec ces petit fils.

Bonsoir

Pour la valeur du rapport cyclique je ne ferai qu'une confiance relative à ton petit oscilloscope/multimètre Zoyi , je mesurerait moi même le ratio durée de l'Etat Haut/ Période à partir des traces.

Il faudrait surtout changer le calibre de la base de temps pour avoir tout le temps 4 périodes à l'écran parce lorsque le fréquence augmente, si on reste sur la même résolution on perd en précision.