[Numérique] durée minimale d'acqusition sonde OWS DS18B20
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

durée minimale d'acqusition sonde OWS DS18B20



  1. #1
    paulfjujo

    durée minimale d'acqusition sonde OWS DS18B20


    ------

    bonjour à tous,


    Apres avoir testé un mode 1 seul bus , 3 x DS18B20 avec gestion des ID# quasi obligatoire,
    je suis passé à une solution 3 bus OWS , 1 pour chaque sonde
    Si on suit la datasheet du DS18B20 , apres une requete de demande de convertion CONVER T[0x44]
    on test ensuite un bit precisant la fin de conversion
    pour pouvoir ensuite lirte le contenu des registres Scratchpad, qui contient entre autre la mesure de temperature sur 2 bytes ..

    Tout celà fonctionne bien ..mais il faut attendre plus de 750mS ( en mode resolution 12 bits)
    J'ai fait des test en mettant un delay de 485µS au lieu dudit test bit
    et j'obtiens un resultat apres 103mS seulement ..
    Les 3 mesures sont coherentes ...

    pourquoi 485µS ... notion de Slot time reset à 480µS dans la data sheet ( donc au pif , je l'avoue!)
    d'autre part on trouve

    WRITE TIME SLOTS
    master read 0 slot 60µS
    master read 1 15µS
    le plus mauvais des cas de lecture de 12 bits à 1 serait =>12 x60 .. 720µS
    on est loin de l'ordre de grandeur 750mS de la data sheet ..

    Je suis donc avec "un montage qui tombe en marche "
    et je ne sais pas pourquoi ?


    J'ai testé le mode Resolution 11 bits , avec test du bit .. 352 mS pour afficher ma mesure (coherent aussi avec la datasheet)
    et aussi 103mS avec un delay au lieu du test bit ..

    Avez vous déja obtenu une mesure DS18B20 avec un temps global
    inferieur à celui donné par la spec scheet qui parle d'un temps MAX ...mais pas d'un temps MIN

    Nom : DS18B20_Config_Resolution.jpg
Affichages : 177
Taille : 34,6 Ko


    MCU=PIC18F27K42 FOSC=64MHz interne
    3 sondes DS18B20 sur RA0,RA1,RA2

    la partie acquisition


    Code:
    //definition de spins
    #define onewirePin0 PORTAbits.RA0
    #define onewirePinDirection0 TRISAbits.TRISA0 //0 = output, 1 = input
    #define onewirePin1 PORTAbits.RA1
    #define onewirePinDirection1 TRISAbits.TRISA1 //0 = output, 1 = input
    #define onewirePin2 PORTAbits.RA2
    #define onewirePinDirection2 TRISAbits.TRISA2 //0 = output, 1 = input
    
    float getTemperature1()
    {
      unsigned char i;
      float temperature0;
      unsigned char scratchPad[9] = {0,0,0,0,0,0,0,0,0};
      onewireInit_0();
      onewireWriteByte_0(0xCC);
      onewireWriteByte_0(0x44);
    #ifdef AVEC_TEMPO
       __delay_us(485);
      #else
      //  780mS  avec le test bit ci dessous
      while (1) {
      if (onewireReadBit_0())  // au moins 1 capteur connecté
         break;
     }
    #endif
       onewireInit_0();
      onewireWriteByte_0(0xCC);
      onewireWriteByte_0(0xBE);
      for (i = 0; i < 2; i++)  scratchPad[i] = onewireReadByte_0();
      onewireInit_0();
      temperature0 = ((scratchPad[1] * 256) + scratchPad[0])*0.0625;
      return temperature0;
    }
    la boucle principale

    Code:
    
     i=0;
       CPrint(" Mesures 3 temperatures DS18B20 sur 3 bus OWS : \r\n");
       CRLF1();
       do
        {  
           sprintf(txt," %05d\r\n",i);
           Print(txt);
           
           F1= getTemperature1();  
           sprintf(txt," T1.INTER.= %5.3f%c C",F1,176);
           Print(txt);CRLF1();
           sprintf(CRam1,"%3.2f C",F1);
           LCD_Write_Text_At(1,12,CRam1);
           LCD_Chr_At(1,17,0);   // degre C
           
           F2= getTemperature2();   
           sprintf(txt," T2.EXTER.= %5.3f %cC",F2,176);
           Print(txt);CRLF1();
           sprintf(CRam1,"%3.2f C",F2);
           LCD_Write_Text_At(2,12,CRam1);
           LCD_Chr_At(2,17,0);   // degre C
       
           F3= getTemperature3();   
           sprintf(txt," T3.EAU = %5.3f %cC\r\n",F3,176);
           Print(txt);
           sprintf(CRam1,"%3.2f C",F3);
           LCD_Write_Text_At(3,12,CRam1);
           LCD_Chr_At(3,17,0);   // degre C
          CRLF1();
         
          __asm("btg LATA,4");  // LED_Rouge
            i++;
         }     
       while (1);

    Nouveaux tests en mode 11 bits +-0,125°C
    AVEC Tempo apres requete 0x44
    #define AVEC_TEMPO
    10 series de 3 mesures
    14:18:25:961 - 14:18:22805 = 3,1sec
    103mS par mesure ( incluant l'afichage Terminal + affichage LCD)

    (14:18:22.805) 00400
    (14:18:22.805) T1.INTER.= 17.875° C
    (14:18:22.891) T2.EXTER.= 19.125 °C
    (14:18:22.986) T3.EAU = 17.750 °C
    (14:18:23.072)
    (14:18:23.099) 00401
    (14:18:23.099) T1.INTER.= 17.875° C
    (14:18:23.181) T2.EXTER.= 19.125 °C
    (14:18:23.275) T3.EAU = 17.750 °C
    (14:18:23.361)
    ... etc ...
    (14:18:25.426) 00409
    (14:18:25.426) T1.INTER.= 17.875° C
    (14:18:25.491) T2.EXTER.= 19.125 °C
    (14:18:25.586) T3.EAU = 17.750 °C
    (14:18:25.672)
    (14:18:25.721) 00410
    (14:18:25.721) T1.INTER.= 17.875° C
    (14:18:25.782) T2.EXTER.= 19.125 °C
    (14:18:25.876) T3.EAU = 17.750 °C
    (14:18:25.961)

    le mem test tests en mode 11 bits +-0,125°C
    avec //#define AVEC_TEMPO
    donc avec le test bit apres requete 0x44
    10 series de 3 mesures
    14:23:38.810 - 14:23:28.229 =10,58 sec
    donc 0.352 sec par mesure ( incluant l'afichage Terminal + affichage LCD)

    (14:23:28.229) 00010
    (14:23:28.541) T1.INTER.= 17.875° C
    (14:23:28.986) T2.EXTER.= 19.250 °C
    (14:23:29.082) T3.EAU = 17.750 °C
    (14:23:29.166)
    (14:23:29.195) 00011
    (14:23:29.506) T1.INTER.= 17.875° C
    (14:23:29.950) T2.EXTER.= 19.250 °C
    (14:23:30.045) T3.EAU = 17.750 °C
    (14:23:30.131)
    ... etc .....
    (14:23:36.911) 00019
    (14:23:37.221) T1.INTER.= 17.875° C
    (14:23:37.665) T2.EXTER.= 19.250 °C
    (14:23:37.760) T3.EAU = 17.750 °C
    (14:23:37.846)
    (14:23:37.874) 00020
    (14:23:38.185) T1.INTER.= 17.875° C
    (14:23:38.631) T2.EXTER.= 19.250 °C
    (14:23:38.724) T3.EAU = 17.750 °C
    (14:23:38.810)

    -----

  2. #2
    jiherve

    Re : durée minimale d'acqusition sonde OWS DS18B20

    bonsoir,
    amha tu confonds temps de conversion et temps d’accès.
    Je pense que dans ton cas cela fonctionne en mode pipeline : tu accèdes, après avoir initialisé la conversion N, au résultat de la N-1.
    Pour lever le doute il faudrait que tu notes les résultats obtenus juste après un démarrage global de ton système, donc après coupure d'alimentation.
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    paulfjujo

    Re : durée minimale d'acqusition sonde OWS DS18B20

    bonjour,

    sur redemarrage :

    (12:02:41.992) Config et Init One Wire
    (12:02:42.452) Mesures 3 temperatures DS18B20 sur 3 bus OWS :
    (12:02:42.464)
    (12:02:42.540) T1.INTER.= 18.625° C
    (12:02:42.579) T2.EXTER.= 17.812 °C
    (12:02:42.658) T3.EAU = 18.250 °C
    (12:02:42.742)
    (12:02:42.779) T1.INTER.= 18.625° C
    (12:02:42.847) T2.EXTER.= 17.812 °C
    (12:02:42.942) T3.EAU = 18.250 °C
    (12:02:43.028)
    (12:02:43.046) T1.INTER.= 18.625° C
    (12:02:43.133) T2.EXTER.= 17.812 °C
    (12:02:43.230) T3.EAU = 18.250 °C
    (12:02:43.313)
    (12:02:43.322) T1.INTER.= 18.500° C
    (12:02:43.417) T2.EXTER.= 17.687 °C
    (12:02:43.512) T3.EAU = 18.250 °C
    (12:02:43.598)

    en utilisant un delay de 485µS au lieu du test bit apres CONVERT 0X44
    on voit bien qu'on attend nulle part les 350mS prevus pour la fin de conversion avec le test bit
    et pourtant,les mesures sont correctes ..
    la spec sheet definit un temps MAXI ,mais rien sur le temps mini .

    c'est idem en version Resolution 12bits ..demandant 750mS theoriquement
    j'ai aussi , 103mS avec le delay

  4. #4
    jiherve

    Re : durée minimale d'acqusition sonde OWS DS18B20

    bonsoir,
    j'ai trouvé çà :https://www.analog.com/en/technical-...vironment.html
    Peut être cela t'aidera t il , en tous cas il n'y a aucun test, juste du timing.
    JR
    l'électronique c'est pas du vaudou!

  5. A voir en vidéo sur Futura
  6. #5
    paulfjujo

    Thumbs up Re : durée minimale d'acqusition sonde OWS DS18B20

    bonjour,

    et merçi ...

    j'ai essayé d'adapter la fonction Reading Device Temperature en page 12 du
    document Interfacing the DS18X20/DS1822 1-Wire®Temperature Sensor in a MicrocontrollerEnvironment
    en version XC8

    Code:
    void Read_Temperature_AD()
    {  // depuis docu Analog device 
       // page 1   Reading Device Temperature
    char get[9];   // bug  taille de 9 sufisant! pour 0 à 8 
    char temp_lsb,temp_msb;
    int k;
    int temp_f,temp_c;  // <-- bug temp_f etatit defini en char
      onewireInit_2();
      onewireWriteByte_2(0xCC);
      onewireWriteByte_2(0x44);
      __delay_us(5);
      onewireInit_2();
      onewireWriteByte_2(0xCC);
      onewireWriteByte_2(0xBE);
    for (k=0;k<9;k++)
     {get[k]=onewireReadByte_2();
      }
    // autre bug ici .dans l'original ...manque des formats !  5 formats pour 9 datas
    //printf("\n ScratchPAD DATA = %X%X%X%X%X\n",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]);  
    sprintf(CRam1," ScratchPAD DATA = %02X %02X %02X %02X %02X %02X %02X %02X %02X\r\n",get[0],get[1],get[2],get[3],get[4],get[5],get[6],get[7],get[8]);
    Print(CRam1);
    temp_msb = get[1]; // Sign byte + lsbit
    temp_lsb = get[0]; // Temp data plus lsb
    if (temp_msb <= 0x80){temp_lsb = (temp_lsb/2);} // shift to get whole degree
    temp_msb = temp_msb & 0x80; // mask all but the sign bit
    // la valeur du MSB est ainsi effacée !
    // donc transformation ci dessous incomprehensible.
    if (temp_msb >= 0x80) {temp_lsb = (~temp_lsb)+1;} // twos complement
    if (temp_msb >= 0x80) {temp_lsb = (temp_lsb/2);}// shift to get whole degree
    if (temp_msb >= 0x80) {temp_lsb = ((-1)*temp_lsb);} // add sign bit
    //printf( "\nTempC= %d degrees C\n", (int)temp_lsb );
    // print temp. C
    sprintf(CRam1, " temp_msb= %d   temp_lsb=%d \r\n", temp_msb,temp_lsb );
    Print(CRam1);
    //temp_c = temp_lsb; // ready for conversion to Fahrenheit
    //temp_f = (((int)temp_c)* 9)/5 + 32;
    //printf( "\nTempF= %d degrees F\n", (int)temp_f ); // print temp. F
    }
    tel quel, on ne peut pas recuperer une valeur de température,
    il y a trop de bug dans le programme proposé par analog device !

    mais je recupere quand les memes valeurs du scratchpad registres 0 et 1 dans les 2 cas
    idem que pour mon capteur T3 (qui sert de comparaison)


    (17:01:15.394) Config et Init One Wire
    (17:01:15.394) set Resolution +-0.0625 °C sur les 3 capteurs
    (17:01:15.394)
    (17:01:15.394) Test Lecture DS18B20 capteur #2
    (17:01:15.394) avec version Analog device (resol 9 bits ?)
    (17:01:15.394) ScratchPAD DATA = 1C 01 00 00 3F FF 3F 10 FE
    (17:01:15.394) temp_msb= 0 temp_lsb=14
    (17:01:15.394)
    (17:01:15.394) ma version : scatchpad 0x1C 0x01
    (17:01:15.394) T3.EAU.= 17.750 °C ( resol 11bits)
    (17:01:17.833) Mesures 3 temperatures DS18B20 sur 3 bus OWS :
    (17:01:17.852)
    (17:01:17.852) 00000
    (17:01:18.171) scatchpad 0x1E 0x01
    (17:01:18.180) T1.INTER.= 17.875° C
    (17:01:18.618) scatchpad 0x36 0x01
    (17:01:18.631) T2.EXTER.= 19.375 °C
    (17:01:18.716) scatchpad 0x1C 0x01
    (17:01:18.720) T3.EAU = 17.750 °C
    (17:01:18.818)
    d'où la meme mesure de température !
    mesure MSB get[0]= 0x1C LSB get[1]= 0x01
    => temper= 0x011C => 284 * resolution 11 bits => 284*0.0625= 17.75°C


    J'ai donc ENFIN trouvé un exemple (même si il est bugué) ,
    on ne teste pas le bit de fin de conversion apres la requette 0x44
    et SANS DELAI (hormis delay de 5µS),



    merçi JIHERVE !


    je vais donc pouvoir utiliser ma fonction de lecture DS18B20 avec un simple petit delai, sans me soucier de ce test bit ...

  7. #6
    niala72bis

    Re : durée minimale d'acqusition sonde OWS DS18B20

    Bonsoir,

    je serais intéressé par ceci :

    je vais donc pouvoir utiliser ma fonction de lecture DS18B20 avec un simple petit delai, sans me soucier de ce test bit ...

    Merci d'avance
    Tombé à 12 ans dans la marmite électronique , multimètre CENTRAD 819 acheté à 14 ans !!

  8. #7
    umfred

    Re : durée minimale d'acqusition sonde OWS DS18B20

    Dans les essais pour tester, je mettrais la sonde à une certaine température en mesure, on coupe, on met la sonde à une autre température complètement différence (de 0°C à température ambiante) et voir si la 1ère lecture renvoie la température ambiante ou une valeur proche de 0°C, histoire de vérifier si on lit ou pas la mesure n-1 dans ces cas-là.
    Et on sait pas dans quel mode d'alimentation on était (ce qui peut peut-être modifier la lecture)

Discussions similaires

  1. Durée minimale d'une mesure quantique
    Par chaverondier dans le forum Physique
    Réponses: 17
    Dernier message: 01/01/2022, 10h23
  2. Sonde DS18B20 et chlore
    Par destroyedlolo dans le forum Bricolage et décoration
    Réponses: 7
    Dernier message: 06/05/2018, 12h52
  3. Durée minimale entre deux pas
    Par Anduriel dans le forum Électronique
    Réponses: 25
    Dernier message: 05/11/2012, 20h47
  4. Sonde de Température TMP112 vs DS18B20.
    Par invitef7bb6cd7 dans le forum Électronique
    Réponses: 5
    Dernier message: 19/04/2012, 21h49
  5. PIC 18f4550 et sonde temperature DS18B20
    Par inviteac751535 dans le forum Électronique
    Réponses: 10
    Dernier message: 06/01/2012, 00h49
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...