Partage
  • Partager sur Facebook
  • Partager sur Twitter

mapper une valeur analogique

    26 juin 2019 à 14:57:52

    Bonjour,

    Dans le but de relever la tension aux bornes d'une batterie (mesure effectuée au voltmètre: 4.6V), je fais appel à une fonction qui lit la valeur analogique en A6 et la convertie pour être dans une fourchette entre 0 et 5V.

    Voici la 1ere fonction que j'ai écrite:

         Int ValAnalog=analogRead(A6) ;
         Float Vout =map(ValAnalog,0,1023,0,5.0) ;
         return Vout ;

    Le résultat retourné et affiché avec serial.print est alors 4.0 V

    J'ai donc essayé de faire le produit en croix "manuellement":

    Int ValAnalog=analogRead(A6) ;

          Float Vout =(ValAnalog*5.0 /1023) ;

          return Vout ;

    J'obtiens alors 4.4 V

    1) Pourquoi la fonction map ne gère t elle pas la décimale? ai-je oublié quelque chose ?

    2) Pourquoi y a t il une différence entre la valeur réelle (voltmètre) et la mesure? si j'applique un coefficient correcteur, suis je sûr qu'il est linéaire et que la valeur sera correctement corrigée même quand la batterie se décharge? 

     Merci pour vos conseils

    • Partager sur Facebook
    • Partager sur Twitter
      26 juin 2019 à 17:31:02

      Salut.

      La fonction map ne renvoie que des int. En cas de décimale elle tronque la partie décimale donc c'est normal qu'elle renvoie 4.

      Avec des millivolts ça devrait le faire.

      int Vout = map(ValAnalog, 0, 1023, 0, 5000);

      @+

      -
      Edité par LuckyFifi 26 juin 2019 à 17:33:20

      • Partager sur Facebook
      • Partager sur Twitter
        26 juin 2019 à 17:55:50

        Je vais essayer mais j'avais testé

        float Vout = map(ValAnalog, 0, 1023, 0, 5000)/1000;

        et j'avais le même résultat

        Merci pour la piste en tous cas

        • Partager sur Facebook
        • Partager sur Twitter
          26 juin 2019 à 22:41:25

          Tu as beau mettre float devant Vout, ça ne changera rien puisque map revoie un entier et que tu divises par un entier, impliquant une division entière.

          Essaie avec ceci et ça devrait marcher:

          float Vout = map(ValAnalog, 0, 1023, 0, 5000)/1000.0;



          • Partager sur Facebook
          • Partager sur Twitter
            28 juin 2019 à 13:12:53

            Bonjour. Tu peux créer ta propre fonction Map :

            float mapfloat(long x, long in_min, long in_max, long out_min, long out_max)
            {
             return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
            }

            ou

            double mapf(double val, double in_min, double in_max, double out_min, double out_max) {
                return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
            }

            Mais perso, je ne l'ai pas testé.

            -
            Edité par pkem 28 juin 2019 à 13:20:03

            • Partager sur Facebook
            • Partager sur Twitter

            mapper une valeur analogique

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown