Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Tout ce qui n'a pas de catégorie !
Lecture sur un HX711 avec PIC
lerameur
Membre
Membre
Messages : 3
Enregistré en : décembre 2021

#1 Message par lerameur » ven. 21 janv. 2022 23:44

Bonjour,

J'ai un probleme de programmation avec la jauge HX711 et le PIC18F45K22.
J'utilise le meme setup que sur ce lien :
https://www.bitstoc.com/wp-content/uplo ... ide-v1.pdf

J'ai essayer avec un module arduino Uno tel qu'indiqué et ca fonctionne tres bien.

J'utilise le même HX711+jauge mais avec un PIC. mais la valeur varie énormément.
je post mon code ci-dessous. Deplus,je prends un échantillon central de 15 sur 25 et je fait la moyenne de ses 15 valeurs.
Mes valeurs ne sont jamais stable.
Une personne a deja programmé un HX711 ? avec PIC ?



Code : Tout sélectionner


sbit ADSK at RD2_bit
;    // set PIN clock to RD2
sbit ADDO at RD3_bit;    // set PIN data to RD3

sbit ADSK_Direction at TRISD.B2;
sbit ADDO_Direction at TRISD.B3;

char *txt "000.0000";

int ij;
 
long int data_average;
 
unsigned long count;
 
long int array[25] ;
long int temp;
unsigned long Poids;
unsigned long decimals;

void bubble_sort()  {

    for(
0i<25i++) {
           for( 
i+1j<25j++)
           {
           
temp =0;
              if(array[
j] < array[i]) {
                 
temp = array[i];
                 array[
i] = array[j];
                 array[
j] = temp;
              }
           }

    }


}      
// end bubble sort



float HX711_Get_Weight() {
    
C1ON_bit 0;                                               // Disable comparators
    
C2ON_bit 0;

    
ADCON1 |= 0x0F;
    
ADCON1 0b00000110;                                        // all ADC ports digital*/

  //   SLRCON = 0;                      // Configure all PORTS at the standard Slew Rate
  ////////////////////
VREFCON1=0;                // vref off
VREFCON2=0;                // vref off
    
PORTD 0b00000000;
   
// INTCON  = 0b00000000;   // disable all interrupts   ...INT0IE: RB0/INT External Interrupt Enable bit
    
ANSELD 0b11000000;    // Configure all PORTS at the standard Slew Rate
    
LCD_Init();
    
LCD_Cmd(_LCD_CURSOR_OFF);
    
LCD_Cmd(_LCD_CLEAR);



  
data_average 0;

 for(
025j++) {

            
TRISD 0b10110010//0 = Output,
             
ADDO 1;
             
ADSK 0;
            
TRISD 0b10111010;  //0 = Output, 1 = Input  RD3

                  
while(ADDO )  ;
                     
//wait until ADDO is zero
                  
count 0;
                  
Poids 0x800000;
                            for(
025i++)
                            {
                                
Delay_us(10);
                                
ADSK 1;
                                
Delay_us(10);
                                
ADSK 0;
                                 if(
ADDO==1count count Poids ;
                                
// if(ADDO==0) count = count ;  // dont really need this line
                                 
Poids Poids >> 1;

                            }    
// end for loop

   
                             
array[j] = count;
                               
Delay_ms(20);

                                 if (
count 0xFFFFFF)
                                   {
                                    
LCD_Cmd(_LCD_CURSOR_OFF);
                                    
LCD_Cmd(_LCD_CLEAR);
                                     
LongWordToStr(counttxt);
                                
Lcd_Out(11"Out of range");
                                 
Lcd_Out(2,1,txt);
                                 
Delay_ms(800);
                                     }

                                 
               
bubble_sort();   
             
temp =0;

                for(
1015j++)
                  {
                   
temp temp + array[j];
                   }
                        
                  
temp temp /;    // divide to get average
                  
temp temp 86840;   // TAR the value
                 
temp temp ;    // divide by 7.7  for the next two lines*/
                   
temp temp 100;
                  
temp temp 778 ;    // divide by 778
                
            
return temp ;
}      
// end main 

Lecture sur un HX711 avec PIC
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » sam. 22 janv. 2022 15:59

Bonsoir lerameur, et tout le forum,

Bon le langage C, c'est pas mon truc, car je suis plutôt ASM, mais d'après la datasheet du HX711

Le HX711 et un convertisseur Adc de 24-Bit, il faut juste communiquer avec lui, c'est tout.

Voir la datasheet du HX711 ICI, Il y a un exemple en ASM :-D et en C :mad:

Description

Les broches PD_SCK et DOUT sont utilisées pour la récupération de données, la sélection d'entrée, la sélection de gain et les commandes de mise hors tension.

Lorsque les données de sortie ne sont pas prêtes à être récupérées, la broche de sortie numérique DOUT est élevée.

L'entrée d'horloge série PD_SCK doit être basse.

Lorsque DOUT passe au niveau bas, cela indique que les données sont prêtes à être récupérées.

En appliquant 25 à 27 impulsions d'horloge positives à la broche PD_SCK, les données sont décalées de la broche de sortie DOUT.

Chaque impulsion PD_SCK sort d'un bit, en commençant par le bit MSB en premier, jusqu'à ce que les 24 bits soient tous décalés.

La 25e impulsion à l'entrée PD_SCK ramènera la broche DOUT au niveau haut.

La sélection d'entrée et de gain est contrôlée par le nombre d'impulsions d'entrée PD_SCK .

Les impulsions d'horloge PD_SCK ne doivent pas être inférieures à 25 ou supérieures à 27 dans une période de conversion, pour éviter de provoquer une erreur de communication série.

T'as un ampli à configurer, qui peut varier en gain de 128, 64, 32, j'ai jamais utilisé ce module.

==> A+
Modifié en dernier par Temps-x le dim. 23 janv. 2022 02:54, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Lecture sur un HX711 avec PIC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#3 Message par satinas » sam. 22 janv. 2022 17:09

Bonjour, pas de fonction main() dans ce programme,
et il me semble qu'il manque la fin du bloc for juste avant l'appel de bubble_sort()

Lecture sur un HX711 avec PIC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » dim. 23 janv. 2022 17:06

bonjour,



il y a déja des incoherences ici

Code : Tout sélectionner



long int temp
;

float HX711_Get_Weight()
{
.......


 return temp ;
}
      // end main   



ta fonction HX711_Get_Weight() doit retourner un float
:!!: hors temp est un long int !

de plus on ne refait pas l'init des differents registres ADC systematiquement dans une fonction qui les utilise ,
mais soit dans une subroutine/fonction globalisant toutes les init hardware, registre ...,
soit en début du main
apres on y touche plus ...en géneral, une fois suffit .


pourquoi un // End Main sur la terminaison de ta fonction HX711_Get_Weight() ?
:sifflotte: un main(), qu'on voudrais aussi bien voir d'ailleurs

il faudrait d'abord déverminer ton programme
sans la fonction HX711_Get_Weight()
simuler les valeurs brutes mesures de sortie HX711 dans une table , la tare ... etc ...
pour vérifier le fonctionnement,deroulement de ton main ()
et seulement apres t'attarder sur la lecture de l'ampli jauge HX711

si c'est bon , tester l'ampli :
avec une Simulation reelle de la jauge ..
injecter des valeurs en mV connues et stable. sur l'entree HX711

ou faire un pont de wheastone equilibré de 4 R de 500 Ohms
+ 1 R variable de 50K+talon de 1K pour faire un desequilibre sur un branche
le tout alimenté en 3,3V ou via generateur de courant constant 2mA
usage de l'entree differentielle du HX
0mV si equilibré sans Pot de 50K en servie
quelques mv avec Pot

on a pas tous sous la main un module ampli HX711 avec une jauge ( peson)
pour pouvoir t'aider

DIVISER pour Mieux REGNER !

Post ton projet complet :
projet mcppi + Source + config ...
Aide toi, le ciel ou FantasPic t'aidera

Lecture sur un HX711 avec PIC
lerameur
Membre
Membre
Messages : 3
Enregistré en : décembre 2021

#5 Message par lerameur » lun. 24 janv. 2022 22:57

Salut Paul,

Voir en pièce jointe mon projet en MCPPI.
En photo une photo de mon setup.
J<ai couper les 4 fils de la jauge le plus court possible. J’ai eu une petite amélioration. (https://www.mouser.ca/ProductDetail/Ada ... Bbmg%3D%3D)
J'obtiens toujours des valeurs qui fluctué un peu trop. Pour un poids de 20 Gram, j'obtiens entre 19 et 23 gram !

Ken
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Lecture sur un HX711 avec PIC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » mar. 25 janv. 2022 10:52

bonjour

rappel : modifie ta fonction
float HX711_Get_Weight() ; par signed long HX711_Get_Weight() ;
"ça tombe en marche" parcequ'un float a la meme taille qu'un long !
voir les warnings à la compilation ?

avec

Code : Tout sélectionner

 
               temp 
= temp /;    // divide to get average
               temp = temp - 8 347 750;  // TAR the value
                 temp = temp / 37;   // divide by 7.7  for the next two lines*/

tu as trop d'erreur d'arrondi ! avec des division impaires ...

Attention à la possibilité de débordement du cumul de 25 long (32 bits signé)
soit 2 147 483 648 / 25 = 85 899 345
mais si la conversion du HX711 est sur 24 bits signé
le maxi possible devient +-2^23 ... soit +8 388 607 à -8 388 608

Fait un cumul sur 16 ou 32 valeurs => pour avoir ensuite une division entiere pour la moyenne !
utilise un espace de 4 ou 8 mesures !

Code : Tout sélectionner

ex avec 8
                  temp 
= temp <<3;    // divide to get average   
                  temp = temp - 8 347 750;  // TAR the value               ..... ?
                 temp = temp / 37;   // divide by 7.7  for the next two lines*/    


la Tare represente deja pres de la moitié de gamme de mesure ?
tu as peut etre trop de charge avec ton plateau en bois !



il vient d'où ce 37 ?

voir Multiplication/division par une constante
.... je n'ai pas testé personnellement
Div_by_37_asm.zip


:sifflotte: Temps_X pourrait apprécier !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Lecture sur un HX711 avec PIC
lerameur
Membre
Membre
Messages : 3
Enregistré en : décembre 2021

#7 Message par lerameur » mar. 25 janv. 2022 13:47

Salut,

ConcernNT mes divisions,:
8 347 750 : ce chiffre provient quand la ptaform n,a pas de poids dessus, doonc mon zéro.
Ensuite j'ai mis un poids, j,ai soustrait ce chiffre. et je divise par le poids connu. Ceci me donne le diviseur , 37.

Bonne nouvelle:
Ca fonctionne, j'ai trouvé le probleme. Les jauges qui proviennet de adafruit ou ce genre de jauge à 5$ ne sont pas tres bon.
j'ai défait une balance électronique que j'avais et je l'ai branché sur mon circuit et voila ca fonction et aucun drift, j'obtien une mesure stable pendant des heures. !!
De ce fait, je me suis commandé des jauges haute précision.

Ken

Lecture sur un HX711 avec PIC
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#8 Message par Temps-x » mer. 26 janv. 2022 01:29

Bonsoir lerameur, paulfjujo, et tout le forum,

paulfjujo a écrit :Source du message :sifflotte: Temps_X pourrait apprécier !

:+1: Ah que ouais .... Merci !


Bonne fête pour la Saint Paul

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Lecture sur un HX711 avec PIC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » mer. 26 janv. 2022 18:39

bonsoir à tous,

Temps-x a écrit :Bonne fête pour la Saint Paul


Merci ! rajoute à la liste du lien
Paul de SMG
Aide toi, le ciel ou FantasPic t'aidera

Lecture sur un HX711 avec PIC
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#10 Message par Gérard » jeu. 27 janv. 2022 21:18

OUPS, j'ai loupé,
Bonne Fête Paul
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.


Retourner vers « Coin Fourre-tout »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités