Différence entre TM7710 et TM7711

Bonjour

Pour réaliser un branchement, on m’a conseillé d’utiliser l’ADC TM7709, j’ai cherché sur le net la bibliothèque ou le codes relatifs à ce composant, j’ai trouvé un code dans lequel la référence TM7710 est utilisée au lieu de TM7709.

Voici le code que j’ai trouvé :

//TM7709 24bit ADC module arduino sketch
//coldtears electronics

//default connection arduino UNO
//DRDY = 11
//ADIO = 12
//SCLK = 13


#define TM7710_DRDY        3          
#define TM7710_ADIO        4          
#define TM7710_ADIO_OUT()  DDRB|=1<<4     


#define TM7710_ADIO_IN()   DDRB&=~(1<<4)  
#define Set_TM7710_SCLK()  PORTB|=1<<5
#define Set_TM7710_ADIO()  PORTB|=1<<4
#define Clr_TM7710_SCLK()  PORTB&=~(1<<5)
#define Clr_TM7710_ADIO()  PORTB&=~(1<<4)

unsigned char x[3];
long Result;
float vref=4.89;

void TM7710_start(void)   
{
    Clr_TM7710_ADIO();
    delayMicroseconds(1);
    Clr_TM7710_SCLK();
    delayMicroseconds(1);
}

void TM7710_stop(void)    
{
    Clr_TM7710_ADIO();
    delayMicroseconds(1);
    Set_TM7710_SCLK();
    delayMicroseconds(1);
    Set_TM7710_ADIO();
    delayMicroseconds(1);
}
void TM7710_write(unsigned char dd)
{
    unsigned char i; 

    for(i=8;i>0;i--)
    {
        if(dd&0x80)
            Set_TM7710_ADIO();   
        else
            Clr_TM7710_ADIO();   
        
        delayMicroseconds(1);
        Set_TM7710_SCLK();       
        delayMicroseconds(1);
        Clr_TM7710_SCLK();      
        dd<<=1;                  
    }
}

unsigned char TM7710_read(void)
{
    unsigned char data=0,i; 

    for(i=0;i<8;i++)
    {
        Set_TM7710_SCLK();                   
        
        data=data<<1;                                  
        if((PINB&(1<<TM7710_ADIO))==(1<<TM7710_ADIO))  
        {
          data=data+1;
        }
        delayMicroseconds(1);
        Clr_TM7710_SCLK();
         delayMicroseconds(1);
    }
    return data;
}
void TM7710_Init()
{
   TM7710_ADIO_OUT();
   delay(100);
   TM7710_stop();
   TM7710_start();
   TM7710_write(0xBF);        
   TM7710_write(0x20);      //Gain=128
   //TM7710_write(0x00); //Gain=16
   TM7710_stop();      
}
void setup() 
{
DDRB|=1<<5 ;
delay(1000);
Serial.begin(57600);
Serial.println("TM7709 24bit ADC Module");
TM7710_Init();
}
    
void loop()
{  
   while((PINB&(1<<TM7710_DRDY))==(1<<TM7710_DRDY)); 
   TM7710_start();
   TM7710_write(0x7F);        
   TM7710_ADIO_IN();          
   for(unsigned char j=0;j<3;j++)
   {
   x[j]=TM7710_read();
   }
   TM7710_ADIO_OUT();         
   TM7710_stop();
   Result=x[0];
   Result = Result * 256;
   Result = Result + x[1];
   Result = Result * 256;
   Result = Result + x[2];
   Result = Result - 6912000;
   
   double volt = Result * vref /16 / 6912000; 
   printFloat(volt,6); 
   Serial.println(" V  ");

}


 void printFloat(float value, int places) {
 // this is used to cast digits
 int digit;
 float tens = 0.1;
 int tenscount = 0;
 int i;
 float tempfloat = value;

 // if value is negative, set tempfloat to the abs value

   // make sure we round properly. this could use pow from
 //<math.h>, but doesn't seem worth the import
 // if this rounding step isn't here, the value  54.321 prints as

 // calculate rounding term d:   0.5/pow(10,places)
 float d = 0.5;
 if (value < 0)
   d *= -1.0;
 // divide by ten for each decimal place
 for (i = 0; i < places; i++)
   d/= 10.0;
 // this small addition, combined with truncation will round our

 tempfloat +=  d;

 if (value < 0)
   tempfloat *= -1.0;
 while ((tens * 10.0) <= tempfloat) {
   tens *= 10.0;
   tenscount += 1;
 }

 // write out the negative if needed
 if (value < 0)
   Serial.print('-');

 if (tenscount == 0)
   Serial.print(0, DEC);

 for (i=0; i< tenscount; i++) {
   digit = (int) (tempfloat/tens);
   Serial.print(digit, DEC);
   tempfloat = tempfloat - ((float)digit * tens);
   tens /= 10.0;
 }

 // if no places after decimal, stop now and return
 if (places <= 0)
   return;

 // otherwise, write the point and continue on
 Serial.print('.');

 for (i = 0; i < places; i++) {
   tempfloat *= 10.0;
   digit = (int) tempfloat;
   Serial.print(digit,DEC);
   // once written, subtract off that digit
   tempfloat = tempfloat - (float) digit;
 }
 
  }

Et lorsque je voulais acheter le module je n’ai trouvé aucune trace de TM7709 ou de TM7710 sur le marché, par contre j’ai trouvé la référence TM7711.
Est-ce-que je peux utiliser le TM7711 au lieu de TM7710 ou TM7709 ? Sont-ils des modules identiques ou de même famille si on peut dire ça ?
Si la réponse est oui, est- ce-que je peux utiliser le code que j’ai mentionné (relatif à TM7710) avec le TM7711 ?

Merci beaucoup

Bonjour
çà ressemble bougrement à la partie AD utilisée sur les modules HX711

DS en chinois avec chronogramme

traduction ici

arduino et TM7711

d'après cette page : https://abra-electronics.com/sensors/sensors-flex-force-en/sens-48.html?sl=fr le convertisseur analogique numérique TM7111 reprend la technologie du HX711 de la société Avia

Basé sur la technologie brevetée d’Avia Semiconductor, le TM7711 est un convertisseur analogique-numérique (ADC) 24 bits de précision doté d’un capteur de température intégré conçu pour les balances de pesage et les applications de contrôle industriel permettant une interface directe avec un capteur en pont. Ce module utilise la puce TM7711 et convertit le changement de résistance en mesures de poids. Le TM7711 a un rapport de précision supérieur à celui du HX711. Tout ce dont vous avez besoin est un capteur de charge et un microcontrôleur pour créer votre propre balance numérique.

Il ressemble à un HX711 simplifié (une seule entrée différentielle, pas de circuit de'excitation, gain fixe)

Exemple d'utilsiation , câblage, code qui utilise la librairie des HX711 !! : https://electropeak.com/learn/interfacing-tm7711-electronic-weighing-sensor-with-arduino/

Comparaison avec les TM7709 et TM7710 ? il faut les documentations pour répondre

Merci d'avoir répondu
justement auparavant on m'a proposer sur ce forum d'utiliser le HX711 pour pouvoir lire les mesures d'un pyranomètre, mais le problème que j'ai rencontré avec le HX711 est que les valeurs qui m'affichent sur le moniteur série sont sous forme d'un code hexadécimal que je dois convertir en tension, mais je n'ai pas compris comment le faire.
Du coup j'ai chercher encore sur le net et j'ai trouvé quelqu'un qui a réaliser le même branchement, mais il a utilisé l'ADC TM7710.

les données extraites d'un HX711 ou d'un TM7711 sont vraisemblalement sous la même forme, avec un calcul identique pour obtenir une valeur de tension

justement j'ai déja branché le HX711 avec le pyranomètre pour lire les mesures en utilisant le code suivant:

#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

HX711 scale;

void setup() {
  Serial.begin(57600);
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}

void loop() {

  if (scale.is_ready()) {
    long reading = scale.read();
    Serial.print("HX711 reading: ");
    Serial.println(reading);
  } else {
    Serial.println("HX711 not found.");
  }

  delay(1000);
  
}

les valeurs qui m’affichent sur le moniteur série sont sous forme d’un code hexadécimal que je dois convertir en tension, pour ensuite diviser celle-ci sur la sensibilité du pyranomètre pour avoir la valeur du rayonnement solaire, mais je n’ai pas trouver de formule qui me permet de faire la conversion du code que j'ai obtenu en volte.

Bonjour
C'est quoi exactement le "pyranometre" ?
J'ai pas mal joué avec le HX711 hors jauge de contrainte

J'avais expérimenté avec les diodes en source de courant
au passage regardez çà

Bonjour Artouste

Trace d'un échange sur ce forum : https://forum.arduino.cc/t/branchement-dun-pyranometre-ms-802/640400/3

le pyranometre MS-802 est décrit içi : https://eko-eu.com/products/solar-energy/pyranometers/ms-802-pyranometer

le pyranométre se comporte , pour le HX711 , a peu près comme un thermocouple ( et pour un pyranometre on n'a pas à faire de compensation de soudure froide, cest plus simple)

Mes essais d'exploitation d'un thermocouple avec un HX711 donnaient un résultat acceptable.

L'essentiel est de faire en sorte que les tensions sur les deux entrées analogiques aient une valeur en mode commun proche de VSS/2

C'est quand même dommage qu' @athcerr butte sur l'exploitation de la valeur fournie par le HX711 !

Oui , le HX711 (ou TM7711 dont je ne connaissais pas l'existence et que je vais commander qq ex)
est très versatile , je l'ai pas mal "torturé" dans différents domaines .

J'utilise (si c'est vraiment nécessaire) une méthode pas dés plus académique mis trés efficace pour drastiquement améliorer ses perfs au niveau bruit, je l'alimente avec une ref de tension MCP1541.. 4.096V)

évoqué là

le pyranomètre c'est un capteur de rayonnement solaire, le type que j'utilise a une sensibilité de 7 microVOLT / watt

la trace de cet échange c'était toujours moi, je me suis procurer le HX711 que vous m'aviez proposé je l'ai brancher comme le montre les figures en fichiers attachées (le + et le - du pyranomètre sont branchés aux broches A+ et A- du HX711 respectivement) et j'ai utilisé le code arduino fournie sur la librairie HX711

#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

HX711 scale;

void setup() {
  Serial.begin(57600);
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}

void loop() {

  if (scale.is_ready()) {
    long reading = scale.read();
    Serial.print("HX711 reading: ");
    Serial.println(reading);
  } else {
    Serial.println("HX711 not found.");
  }

  delay(30000);
  
}

et j'ai aboutit a ce résultat :

HX711 reading: 12157
HX711 reading: 12243
HX711 reading: 12119
HX711 reading: 11857
HX711 reading: 11801
HX711 reading: 11840
HX711 reading: 11782
HX711 reading: 11768
HX711 reading: 11906
HX711 reading: 11576
HX711 reading: 12080
HX711 reading: 11905
HX711 reading: 8738
HX711 reading: 8618
HX711 reading: 8581
HX711 reading: 8672
HX711 reading: 8624
HX711 reading: 8529
HX711 reading: 8664
HX711 reading: 8643
HX711 reading: 8630
HX711 reading: 8464
HX711 reading: 8402
HX711 reading: 8476
HX711 reading: 8885
HX711 reading: 8949
HX711 reading: 8895
HX711 reading: 10585
HX711 reading: 10585
HX711 reading: 10544
HX711 reading: 10570
HX711 reading: 10780

les valeurs entre 8949 et 8402 sont apparus lorsque j'ai couvert le pyranomètre (pas de rayonnement)

Mais je vais être franc avec vous, c'est mon premier projet en arduino et en électronique je n'ai pas trouver comment convertir ces valeurs en tension (je divise cette dernière par la sensibilité du pyranomètre pour avoir mon rayonnement équivalent)

d'ailleurs je n'ai pas compris ce que c'est VSS/2 !!

j'ai utilisé aussi le TM7711 que j'ai acheté dernièrement et j'ai aboutit au même résultat.

j'ai utilisé toutes mes connaissances et tout ce que vous m'avez proposer.

Boinsoir

Mais je vais être franc avec vous, c’est mon premier projet en arduino et en électronique

conversion analogique/numérique, amplification différentielle..... c'est un projet qui nécessite un peu d'autoformation !!

Ce qui te fait défaut c'est quelques bases de conversion analogique/numérique
Un moteur de recherche te donnera des bons cours et tu y découvrira le principe de calcul d'une tension à partir du nombre issu de la conversion , du nombre de bits de celle ci et de la tension de référence

Apercu très rapide dans le cas du HX711 (lire sa notice technique) composant qui associe une amplification (128 de base) et une conversion analogique numérique

Vss/2 ? Vss étant la dénomination générique de la tension d'alimentation , VSS/2 est en quelque sorte le 'point milieu' Bourde !! Vss est la Masse , la tension d'alimentation est notée VDD !!

Le HX711 concu pour des ponts de Wheatstone, sait traiter les faibles écarts de tension entre les entrées, toutes les deux au voisinage de ce 'point milieu'

  1. Si Vss vaut 5V et si les entrées INA+ et INA- dont toutes les deux à 2,5V, la sortie de la conversion donnera le nombre zéro ( écart nul en entrée -> nombre nul en sortie)

  2. Si INA+ est à (2,5V + 20mV) et INA- à 2,5v -> écart de +20mV) l'amplification amènera en entrée du convertisseur la valeur (2,5V + 20mV *128) = 5V Valeur plafond.
    Le nombre issu de la conversion sera si mes calculs sont bons égal à +2^23 (24 bits dont 1 bit de signe)

  3. Si INA+ est à (2,5V - 20mV) et INA- à 2,5V -> écart de -20mV) l'amplification 128 amènera en entrée du convertisseur la valeur 2,5V -(20mV * 128) = 0 Valeur plancher.
    Le nombre issu de la conversion sera -2^23.

Ensuite faire jouer la proportionalité entre tension et nombre issu de la conversion analogique numérique

Pour ce qui est du câblage j'ai un doute sur le tien qui ne fixe pas le potentiel des entrées INA+ et INA-
Je n'ai aucune idée du comportement du HX711 dans ce cas. Quand un pont de jauges est raccordé à un HX711 ses entrées INA+ et INA- sont toutes les deux proches de VSS/2 .

Merci beaucoup pour ces infirmations qui sont nouvelles pour moi, je vais chercher encore plus sur le net, en attendant d’éventuelles autres informations de la part de @Artouste qui dit qu'il maîtrise bien le HX711 :grin: :grin:

Selon la doc du pyranomètre:

  • Le capteur en question est-une thermopile donc la tension ne sera jamais négative.
  • La tension maximum ne devrait pas excéder 10mV

Under the assumption that the global broad-band solar irradiance does not exceed 1,400W/m2 (in both horizontal and tilted measurement positions) the signal level of the pyranometer output Voltage will remain below 10mV.

Comme la tension max est assez faible on peut utiliser le gain maximum du HX711. A noter que l'on sera limité à la moitié de la dynamique environ.

La datasheet du HX711 n'impose pas un mode commun de AVDD/2 (en reprenant la dénomination de la datasheet du HX7111). Il faut que celui-ci reste entre 1,2V et AVVD - 1,3V.
Le plus simple serait donc de fixer le potentiel de l'entrée INA- à AVDD/2 ou inférieur. On fait une calibration en masquant le capteur pour faire le zéro. La conversion se fait ensuite en prenant précisément en compte la tension de référence, le gain du HX711 et le coefficient de conversion du pyranomètre.

Si la dynamique de mesure devait dépasser les 1400w/m² il suffirait de réduire la tension de polarisation sur INA-.

Bonjour

Bourde corrigée !! Vss vs Vdd .... :roll_eyes:

Pour polariser INA- vers le bas du mode commun toléré ( >1,2V) une DEL fait l'affaire , j'a fait comme ça pour un thermocouple.

Bonjour
Je ne suis pas le seul à jouer avec le HX711
voir par exemple la reponse de @fdufnews qui synthetise parfaitement le probleme

Reprend tes essais avec simplement un programme HX711 qui sors l'AD en RAW et permet l'affichage avec le traceur serie de l'IDE , çà permet déjà de faire une bonne approche.

// programme basique pour hx711 formatage serie pour faire du log timestamp et/ou sortie traceur IDE ARDUINO


#include "HX711.h"


uint8_t dataPin = 6;
uint8_t clockPin = 7;
HX711 scale;  //gain par defaut 128


void setup() {
  Serial.begin(115200);
  Serial.println("LOG HX711 RAW");
  // scale.power_up(); // pas d'excitation de pont
}

void loop() {

  Serial.print(millis());
  Serial.print(",");
  Serial.println(scale.read()); // valeur brute AD

}


Bonjour Al1
Une DEL c'est aussi un photo-recepteur , çà n'ajoute pas trop de bruit si elle n'est pas optiquement isolée ?

Donc, si j'ai bien compris, je dois ajouter une DEL au branchement entre le (-) du pyranomètre et le INA- du HX711 pour avoir un potentiel <= AVDD/2.

Ensuite, je vais reprendre le programme proposé par @Artouste.
Je vais essayer ca, on verra le résultat.

Merci à vous

J'ai fais qq essais pour dériver çà avec un pont diviseur (potard 470K) de la ref de tension (4.096V MCP1541) qui me sert d'alim et je me suis rendu compte avec le DS que je cherchais à réinventer la poudre :boom:
Le plus simple est simplement de connecter INA- à VBG (sortie bandgap 1.25V )

:+1:

As tu essayé , Artouste , cette solution dans un cas où il faut injecter un petit courant dans le capteur (genre PT100) courant qui doit alors pouvoir entrer dans VBG ?

Pour cette manip avantage au HX711 sur le TM7711 qui est dépourvu de VBG et des autres bornes servant à câbler une petite alimentation régulée pour produire AVDD !!

C'est la première chose que je suis aller voir :eye:
J'ai juste fait un rapide test en injectant qq µ/m Volts sur INA+

Je ferais un test plus plus poussé dans la semaine avec un capteur de pression et une BPW34 en inverse (détection de particules)